From f4fe77ad1ecb67a6934c3a7de18225944c1cccd2 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 15 Apr 2020 11:31:10 +1200 Subject: [PATCH] test: Run Equihash test vectors on both C++ and Rust validators --- src/test/equihash_tests.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/test/equihash_tests.cpp b/src/test/equihash_tests.cpp index e573f8e29..8e202fc68 100644 --- a/src/test/equihash_tests.cpp +++ b/src/test/equihash_tests.cpp @@ -15,6 +15,8 @@ #include "sodium.h" +#include "librustzcash.h" + #include #include #include @@ -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 soln, bool expected) { size_t cBitLen { n/(k+1) }; + auto minimal = GetMinimalFromIndices(soln, cBitLen); + + // First test the C++ validator crypto_generichash_blake2b_state state; EhInitialiseState(n, k, state); uint256 V = ArithToUint256(nonce); @@ -97,7 +102,15 @@ void TestEquihashValidator(unsigned int n, unsigned int k, const std::string &I, PrintSolution(strm, soln); BOOST_TEST_MESSAGE(strm.str()); 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); } @@ -219,6 +232,11 @@ BOOST_AUTO_TEST_CASE(validator_allbitsmatter) { bool isValid; EhIsValidSolution(n, k, state, sol_char, isValid); 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. 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)); EhIsValidSolution(n, k, state, mutated, isValid); 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())); } }