test: Run Equihash test vectors on both C++ and Rust validators
This commit is contained in:
parent
084303d8c2
commit
f4fe77ad1e
|
@ -15,6 +15,8 @@
|
||||||
|
|
||||||
#include "sodium.h"
|
#include "sodium.h"
|
||||||
|
|
||||||
|
#include "librustzcash.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -87,6 +89,9 @@ void TestEquihashSolvers(unsigned int n, unsigned int k, const std::string &I, c
|
||||||
|
|
||||||
void TestEquihashValidator(unsigned int n, unsigned int k, const std::string &I, const arith_uint256 &nonce, std::vector<uint32_t> soln, bool expected) {
|
void TestEquihashValidator(unsigned int n, unsigned int k, const std::string &I, const arith_uint256 &nonce, std::vector<uint32_t> soln, bool expected) {
|
||||||
size_t cBitLen { n/(k+1) };
|
size_t cBitLen { n/(k+1) };
|
||||||
|
auto minimal = GetMinimalFromIndices(soln, cBitLen);
|
||||||
|
|
||||||
|
// First test the C++ validator
|
||||||
crypto_generichash_blake2b_state state;
|
crypto_generichash_blake2b_state state;
|
||||||
EhInitialiseState(n, k, state);
|
EhInitialiseState(n, k, state);
|
||||||
uint256 V = ArithToUint256(nonce);
|
uint256 V = ArithToUint256(nonce);
|
||||||
|
@ -97,7 +102,15 @@ void TestEquihashValidator(unsigned int n, unsigned int k, const std::string &I,
|
||||||
PrintSolution(strm, soln);
|
PrintSolution(strm, soln);
|
||||||
BOOST_TEST_MESSAGE(strm.str());
|
BOOST_TEST_MESSAGE(strm.str());
|
||||||
bool isValid;
|
bool isValid;
|
||||||
EhIsValidSolution(n, k, state, GetMinimalFromIndices(soln, cBitLen), isValid);
|
EhIsValidSolution(n, k, state, minimal, isValid);
|
||||||
|
BOOST_CHECK(isValid == expected);
|
||||||
|
|
||||||
|
// The Rust validator should have the exact same result
|
||||||
|
isValid = librustzcash_eh_isvalid(
|
||||||
|
n, k,
|
||||||
|
(unsigned char*)&I[0], I.size(),
|
||||||
|
V.begin(), V.size(),
|
||||||
|
minimal.data(), minimal.size());
|
||||||
BOOST_CHECK(isValid == expected);
|
BOOST_CHECK(isValid == expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,6 +232,11 @@ BOOST_AUTO_TEST_CASE(validator_allbitsmatter) {
|
||||||
bool isValid;
|
bool isValid;
|
||||||
EhIsValidSolution(n, k, state, sol_char, isValid);
|
EhIsValidSolution(n, k, state, sol_char, isValid);
|
||||||
BOOST_CHECK(isValid == true);
|
BOOST_CHECK(isValid == true);
|
||||||
|
BOOST_CHECK(librustzcash_eh_isvalid(
|
||||||
|
n, k,
|
||||||
|
(unsigned char*)&I[0], I.size(),
|
||||||
|
V.begin(), V.size(),
|
||||||
|
sol_char.data(), sol_char.size()));
|
||||||
|
|
||||||
// Changing any single bit of the encoded solution should make it invalid.
|
// Changing any single bit of the encoded solution should make it invalid.
|
||||||
for (size_t i = 0; i < sol_char.size() * 8; i++) {
|
for (size_t i = 0; i < sol_char.size() * 8; i++) {
|
||||||
|
@ -226,6 +244,11 @@ BOOST_AUTO_TEST_CASE(validator_allbitsmatter) {
|
||||||
mutated.at(i/8) ^= (1 << (i % 8));
|
mutated.at(i/8) ^= (1 << (i % 8));
|
||||||
EhIsValidSolution(n, k, state, mutated, isValid);
|
EhIsValidSolution(n, k, state, mutated, isValid);
|
||||||
BOOST_CHECK(isValid == false);
|
BOOST_CHECK(isValid == false);
|
||||||
|
BOOST_CHECK(!librustzcash_eh_isvalid(
|
||||||
|
n, k,
|
||||||
|
(unsigned char*)&I[0], I.size(),
|
||||||
|
V.begin(), V.size(),
|
||||||
|
mutated.data(), mutated.size()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue