Skip to content

Commit

Permalink
Improve accuracy of constraint system violation diagnostics.
Browse files Browse the repository at this point in the history
  • Loading branch information
ebfull committed Nov 5, 2016
1 parent b55744e commit 5f0a73c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 7 deletions.
4 changes: 1 addition & 3 deletions src/gtest/test_joinsplit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,14 +204,12 @@ 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);
return;
} catch(...) {
FAIL() << "Expected invalid_argument exception.";
}

FAIL() << "It worked, when it shouldn't have!";
}

TEST(joinsplit, h_sig)
Expand Down
11 changes: 11 additions & 0 deletions src/zcash/IncrementalMerkleTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,17 @@ void IncrementalMerkleTree<Depth, Hash>::wfcheck() const {
}
}

template<size_t Depth, typename Hash>
Hash IncrementalMerkleTree<Depth, Hash>::last() const {
if (right) {
return *right;
} else if (left) {
return *left;
} else {
throw std::runtime_error("tree has no cursor");
}
}

template<size_t Depth, typename Hash>
void IncrementalMerkleTree<Depth, Hash>::append(Hash obj) {
if (is_complete(Depth)) {
Expand Down
7 changes: 7 additions & 0 deletions src/zcash/IncrementalMerkleTree.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ friend class IncrementalWitness<Depth, Hash>;
Hash root() const {
return root(Depth, std::deque<Hash>());
}
Hash last() const;

IncrementalWitness<Depth, Hash> witness() const {
return IncrementalWitness<Depth, Hash>(*this);
Expand Down Expand Up @@ -138,6 +139,12 @@ friend class IncrementalMerkleTree<Depth, Hash>;
return tree.path(partial_path());
}

// Return the element being witnessed (should be a note
// commitment!)
Hash element() const {
return tree.last();
}

Hash root() const {
return tree.root(Depth, partial_path());
}
Expand Down
15 changes: 11 additions & 4 deletions src/zcash/JoinSplit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,17 @@ class JoinSplitCircuit : public JoinSplit<NumInputs, NumOutputs> {
for (size_t i = 0; i < NumInputs; i++) {
// Sanity checks of input
{
// If note has nonzero value, its witness's root must be equal to the
// input.
if ((inputs[i].note.value != 0) && (inputs[i].witness.root() != rt)) {
throw std::invalid_argument("joinsplit not anchored to the correct root");
// If note has nonzero value
if (inputs[i].note.value != 0) {
// The witness root must equal the input root.
if (inputs[i].witness.root() != rt) {
throw std::invalid_argument("joinsplit not anchored to the correct root");
}

// The tree must witness the correct element
if (inputs[i].note.cm() != inputs[i].witness.element()) {
throw std::invalid_argument("witness of wrong element for joinsplit input");
}
}

// Ensure we have the key to this note.
Expand Down

0 comments on commit 5f0a73c

Please sign in to comment.