Update Equihash hash generation to match the Zcash spec
Changes: - floor(512/n)*n/8 bytes of BLAKE2b output is split between floor(512/n) adjacent indices, instead of using one hash call per index. - Parameters with n/(k+1) mod 8 != 0 will expand the BLAKE2b output to byte boundaries for colliding, instead of using a longer output and clearing bits. - The genesis blocks have been regenerated. - The test vectors have been regenerated. - The Equihash inputs for the cancellation tests were modified to ensure that valid solutions were available to exercise the full solver.
This commit is contained in:
@@ -45,8 +45,8 @@ protected:
|
||||
unsigned char hash[WIDTH];
|
||||
|
||||
public:
|
||||
StepRow(const eh_HashState& base_state, eh_index i,
|
||||
size_t hLen, size_t cBitLen, size_t cByteLen);
|
||||
StepRow(const unsigned char* hashIn, size_t hInLen,
|
||||
size_t hLen, size_t cBitLen);
|
||||
~StepRow() { }
|
||||
|
||||
template<size_t W>
|
||||
@@ -83,8 +83,8 @@ class FullStepRow : public StepRow<WIDTH>
|
||||
using StepRow<WIDTH>::hash;
|
||||
|
||||
public:
|
||||
FullStepRow(const eh_HashState& base_state, eh_index i,
|
||||
size_t hLen, size_t cBitLen, size_t cByteLen);
|
||||
FullStepRow(const unsigned char* hashIn, size_t hInLen,
|
||||
size_t hLen, size_t cBitLen, eh_index i);
|
||||
~FullStepRow() { }
|
||||
|
||||
FullStepRow(const FullStepRow<WIDTH>& a) : StepRow<WIDTH> {a} { }
|
||||
@@ -108,9 +108,9 @@ class TruncatedStepRow : public StepRow<WIDTH>
|
||||
using StepRow<WIDTH>::hash;
|
||||
|
||||
public:
|
||||
TruncatedStepRow(const eh_HashState& base_state, eh_index i,
|
||||
size_t hLen, size_t cBitLen, size_t cByteLen,
|
||||
unsigned int ilen);
|
||||
TruncatedStepRow(const unsigned char* hashIn, size_t hInLen,
|
||||
size_t hLen, size_t cBitLen,
|
||||
eh_index i, unsigned int ilen);
|
||||
~TruncatedStepRow() { }
|
||||
|
||||
TruncatedStepRow(const TruncatedStepRow<WIDTH>& a) : StepRow<WIDTH> {a} { }
|
||||
@@ -155,7 +155,9 @@ private:
|
||||
BOOST_STATIC_ASSERT((N/(K+1)) + 1 < 8*sizeof(eh_index));
|
||||
|
||||
public:
|
||||
enum { CollisionBitLength=N/(K+1) };
|
||||
enum : size_t { IndicesPerHashOutput=512/N };
|
||||
enum : size_t { HashOutput=IndicesPerHashOutput*N/8 };
|
||||
enum : size_t { CollisionBitLength=N/(K+1) };
|
||||
enum : size_t { CollisionByteLength=(CollisionBitLength+7)/8 };
|
||||
enum : size_t { HashLength=(K+1)*CollisionByteLength };
|
||||
enum : size_t { FullWidth=2*CollisionByteLength+sizeof(eh_index)*(1 << (K-1)) };
|
||||
|
||||
Reference in New Issue
Block a user