|
@ -43,8 +43,8 @@ extern "C" { |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
typedef struct ethash_params { |
|
|
typedef struct ethash_params { |
|
|
size_t full_size; // Size of full data set (in bytes, multiple of mix size (128)).
|
|
|
uint64_t full_size; // Size of full data set (in bytes, multiple of mix size (128)).
|
|
|
size_t cache_size; // Size of compute cache (in bytes, multiple of node size (64)).
|
|
|
uint64_t cache_size; // Size of compute cache (in bytes, multiple of node size (64)).
|
|
|
} ethash_params; |
|
|
} ethash_params; |
|
|
|
|
|
|
|
|
typedef struct ethash_return_value { |
|
|
typedef struct ethash_return_value { |
|
@ -52,8 +52,8 @@ typedef struct ethash_return_value { |
|
|
uint8_t mix_hash[32]; |
|
|
uint8_t mix_hash[32]; |
|
|
} ethash_return_value; |
|
|
} ethash_return_value; |
|
|
|
|
|
|
|
|
size_t ethash_get_datasize(const uint32_t block_number); |
|
|
uint64_t ethash_get_datasize(const uint32_t block_number); |
|
|
size_t ethash_get_cachesize(const uint32_t block_number); |
|
|
uint64_t ethash_get_cachesize(const uint32_t block_number); |
|
|
|
|
|
|
|
|
// initialize the parameters
|
|
|
// initialize the parameters
|
|
|
static inline void ethash_params_init(ethash_params *params, const uint32_t block_number) { |
|
|
static inline void ethash_params_init(ethash_params *params, const uint32_t block_number) { |
|
@ -93,23 +93,30 @@ static inline void ethash_compute_full(ethash_return_value *ret, void const *ful |
|
|
ethash_full(ret, full, params, header_hash, nonce); |
|
|
ethash_full(ret, full, params, header_hash, nonce); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Returns if hash is less than or equal to difficulty
|
|
|
/// @brief Compare two s256-bit big-endian values.
|
|
|
static inline int ethash_check_difficulty( |
|
|
/// @returns 1 if @a a is less than or equal to @a b, 0 otherwise.
|
|
|
const uint8_t hash[32], |
|
|
/// Both parameters are 256-bit big-endian values.
|
|
|
const uint8_t difficulty[32]) { |
|
|
static inline int ethash_leq_be256(const uint8_t a[32], const uint8_t b[32]) { |
|
|
// Difficulty is big endian
|
|
|
// Boundary is big endian
|
|
|
for (int i = 0; i < 32; i++) { |
|
|
for (int i = 0; i < 32; i++) { |
|
|
if (hash[i] == difficulty[i]) continue; |
|
|
if (a[i] == b[i]) |
|
|
return hash[i] < difficulty[i]; |
|
|
continue; |
|
|
|
|
|
return a[i] < b[i]; |
|
|
} |
|
|
} |
|
|
return 1; |
|
|
return 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ethash_quick_check_difficulty( |
|
|
/// Perofrms a cursory check on the validity of the nonce.
|
|
|
|
|
|
/// @returns 1 if the nonce may possibly be valid for the given header_hash & boundary.
|
|
|
|
|
|
/// @p boundary equivalent to 2 ^ 256 / block_difficulty, represented as a 256-bit big-endian.
|
|
|
|
|
|
int ethash_preliminary_check_boundary( |
|
|
const uint8_t header_hash[32], |
|
|
const uint8_t header_hash[32], |
|
|
const uint64_t nonce, |
|
|
const uint64_t nonce, |
|
|
const uint8_t mix_hash[32], |
|
|
const uint8_t mix_hash[32], |
|
|
const uint8_t difficulty[32]); |
|
|
const uint8_t boundary[32]); |
|
|
|
|
|
|
|
|
|
|
|
#define ethash_quick_check_difficulty ethash_preliminary_check_boundary |
|
|
|
|
|
#define ethash_check_difficulty ethash_leq_be256 |
|
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
#ifdef __cplusplus |
|
|
} |
|
|
} |
|
|