Auto merge of #1797 - ebfull:improve-joinsplit-diagnostics, r=bitcartel
Improve joinsplit diagnostics I don't advocate merging this for the hotfix release (to fix #1779) but this PR can be used to diagnose the real issue and should be merged ASAP afterward. ~I still need to add tests for `last()` and `element()` though.~ Done.
This commit is contained in:
@@ -204,6 +204,7 @@ void invokeAPIFailure(
|
||||
{
|
||||
try {
|
||||
invokeAPI(js, inputs, outputs, vpub_old, vpub_new, rt);
|
||||
FAIL() << "It worked, when it shouldn't have!";
|
||||
} catch(std::invalid_argument const & err) {
|
||||
EXPECT_EQ(err.what(), reason);
|
||||
} catch(...) {
|
||||
@@ -368,7 +369,7 @@ TEST(joinsplit, full_api_test)
|
||||
tree.root(),
|
||||
"nonsensical vpub_new value");
|
||||
|
||||
// input is not in tree
|
||||
// input witness for the wrong element
|
||||
invokeAPIFailure(js,
|
||||
{
|
||||
JSInput(witnesses[0], note1, sk),
|
||||
@@ -381,6 +382,22 @@ TEST(joinsplit, full_api_test)
|
||||
0,
|
||||
100,
|
||||
tree.root(),
|
||||
"witness of wrong element for joinsplit input");
|
||||
|
||||
// input witness doesn't match up with
|
||||
// real root
|
||||
invokeAPIFailure(js,
|
||||
{
|
||||
JSInput(witnesses[1], note1, sk),
|
||||
JSInput()
|
||||
},
|
||||
{
|
||||
JSOutput(),
|
||||
JSOutput()
|
||||
},
|
||||
0,
|
||||
100,
|
||||
uint256(),
|
||||
"joinsplit not anchored to the correct root");
|
||||
|
||||
// input is in the tree now! this should work
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "test/data/merkle_serialization.json.h"
|
||||
#include "test/data/merkle_witness_serialization.json.h"
|
||||
#include "test/data/merkle_path.json.h"
|
||||
#include "test/data/merkle_commitments.json.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
@@ -55,32 +56,46 @@ void expect_ser_test_vector(B& b, const C& c, const A& tree) {
|
||||
}
|
||||
|
||||
template<typename Tree, typename Witness>
|
||||
void test_tree(Array root_tests, Array ser_tests, Array witness_ser_tests, Array path_tests) {
|
||||
void test_tree(
|
||||
Array commitment_tests,
|
||||
Array root_tests,
|
||||
Array ser_tests,
|
||||
Array witness_ser_tests,
|
||||
Array path_tests
|
||||
)
|
||||
{
|
||||
Array::iterator commitment_iterator = commitment_tests.begin();
|
||||
Array::iterator root_iterator = root_tests.begin();
|
||||
Array::iterator ser_iterator = ser_tests.begin();
|
||||
Array::iterator witness_ser_iterator = witness_ser_tests.begin();
|
||||
Array::iterator path_iterator = path_tests.begin();
|
||||
|
||||
uint256 test_commitment = uint256S("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
|
||||
|
||||
Tree tree;
|
||||
|
||||
// The root of the tree at this point is expected to be the root of the
|
||||
// empty tree.
|
||||
ASSERT_TRUE(tree.root() == Tree::empty_root());
|
||||
|
||||
// The tree doesn't have a 'last' element added since it's blank.
|
||||
ASSERT_THROW(tree.last(), std::runtime_error);
|
||||
|
||||
// We need to witness at every single point in the tree, so
|
||||
// that the consistency of the tree and the merkle paths can
|
||||
// be checked.
|
||||
vector<Witness> witnesses;
|
||||
|
||||
for (size_t i = 0; i < 16; i++) {
|
||||
uint256 test_commitment = uint256S((commitment_iterator++)->get_str());
|
||||
|
||||
// Witness here
|
||||
witnesses.push_back(tree.witness());
|
||||
|
||||
// Now append a commitment to the tree
|
||||
tree.append(test_commitment);
|
||||
|
||||
// Last element added to the tree was `test_commitment`
|
||||
ASSERT_TRUE(tree.last() == test_commitment);
|
||||
|
||||
// Check tree root consistency
|
||||
expect_test_vector(root_iterator, tree.root());
|
||||
|
||||
@@ -95,6 +110,7 @@ void test_tree(Array root_tests, Array ser_tests, Array witness_ser_tests, Array
|
||||
|
||||
if (first) {
|
||||
ASSERT_THROW(wit.path(), std::runtime_error);
|
||||
ASSERT_THROW(wit.element(), std::runtime_error);
|
||||
} else {
|
||||
auto path = wit.path();
|
||||
|
||||
@@ -119,7 +135,8 @@ void test_tree(Array root_tests, Array ser_tests, Array witness_ser_tests, Array
|
||||
|
||||
std::vector<bool> commitment_bv;
|
||||
{
|
||||
std::vector<unsigned char> commitment_v(test_commitment.begin(), test_commitment.end());
|
||||
uint256 witnessed_commitment = wit.element();
|
||||
std::vector<unsigned char> commitment_v(witnessed_commitment.begin(), witnessed_commitment.end());
|
||||
commitment_bv = convertBytesVectorToVector(commitment_v);
|
||||
}
|
||||
|
||||
@@ -174,8 +191,9 @@ TEST(merkletree, vectors) {
|
||||
Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
|
||||
Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
|
||||
Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
|
||||
Array commitment_tests = read_json(std::string(json_tests::merkle_commitments, json_tests::merkle_commitments + sizeof(json_tests::merkle_commitments)));
|
||||
|
||||
test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(root_tests, ser_tests, witness_ser_tests, path_tests);
|
||||
test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(commitment_tests, root_tests, ser_tests, witness_ser_tests, path_tests);
|
||||
}
|
||||
|
||||
TEST(merkletree, emptyroots) {
|
||||
|
||||
Reference in New Issue
Block a user