tornado-nova/circuits/merkleTreeUpdater.circom
2021-10-17 14:05:01 +03:00

38 lines
1.3 KiB
Plaintext

include "./merkleProof.circom";
include "./merkleTree.circom";
// inserts a subtree into a merkle tree
// checks that tree previously contained zeroes is the same positions
// zeroSubtreeRoot is a root of a subtree that contains only zeroes
template MerkleTreeUpdater(levels, subtreeLevels, zeroSubtreeRoot) {
var remainingLevels = levels - subtreeLevels;
signal input oldRoot;
signal input newRoot;
signal input leaves[1 << subtreeLevels];
signal input pathIndices;
signal private input pathElements[remainingLevels];
// calculate subtree root
component subtree = MerkleTree(subtreeLevels);
for(var i = 0; i < (1 << subtreeLevels); i++) {
subtree.leaves[i] <== leaves[i];
}
component treeBefore = MerkleProof(remainingLevels);
for(var i = 0; i < remainingLevels; i++) {
treeBefore.pathElements[i] <== pathElements[i];
}
treeBefore.pathIndices <== pathIndices;
treeBefore.leaf <== zeroSubtreeRoot;
treeBefore.root === oldRoot;
component treeAfter = MerkleProof(remainingLevels);
for(var i = 0; i < remainingLevels; i++) {
treeAfter.pathElements[i] <== pathElements[i];
}
treeAfter.pathIndices <== pathIndices;
treeAfter.leaf <== subtree.root;
treeAfter.root === newRoot;
}