|
|
@ -22,12 +22,12 @@ fn test_root_not_in_store() -> Result<(), MerkleError> { |
|
|
|
let mtree = MerkleTree::new(LEAVES4.to_vec())?;
|
|
|
|
let store = MerkleStore::default().with_merkle_tree(LEAVES4)?;
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(LEAVES4[0], NodeIndex::new(mtree.depth(), 0)),
|
|
|
|
store.get_node(LEAVES4[0], NodeIndex::make(mtree.depth(), 0)),
|
|
|
|
Err(MerkleError::RootNotInStore(LEAVES4[0])),
|
|
|
|
"Leaf 0 is not a root"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_path(LEAVES4[0], NodeIndex::new(mtree.depth(), 0)),
|
|
|
|
store.get_path(LEAVES4[0], NodeIndex::make(mtree.depth(), 0)),
|
|
|
|
Err(MerkleError::RootNotInStore(LEAVES4[0])),
|
|
|
|
"Leaf 0 is not a root"
|
|
|
|
);
|
|
|
@ -45,22 +45,22 @@ fn test_merkle_tree() -> Result<(), MerkleError> { |
|
|
|
// STORE LEAVES ARE CORRECT ==============================================================
|
|
|
|
// checks the leaves in the store corresponds to the expected values
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 0)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 0)),
|
|
|
|
Ok(LEAVES4[0]),
|
|
|
|
"node 0 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 1)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 1)),
|
|
|
|
Ok(LEAVES4[1]),
|
|
|
|
"node 1 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 2)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 2)),
|
|
|
|
Ok(LEAVES4[2]),
|
|
|
|
"node 2 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 3)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 3)),
|
|
|
|
Ok(LEAVES4[3]),
|
|
|
|
"node 3 must be in the tree"
|
|
|
|
);
|
|
|
@ -68,76 +68,76 @@ fn test_merkle_tree() -> Result<(), MerkleError> { |
|
|
|
// STORE LEAVES MATCH TREE ===============================================================
|
|
|
|
// sanity check the values returned by the store and the tree
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_node(NodeIndex::new(mtree.depth(), 0)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 0)),
|
|
|
|
mtree.get_node(NodeIndex::make(mtree.depth(), 0)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 0)),
|
|
|
|
"node 0 must be the same for both MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_node(NodeIndex::new(mtree.depth(), 1)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 1)),
|
|
|
|
mtree.get_node(NodeIndex::make(mtree.depth(), 1)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 1)),
|
|
|
|
"node 1 must be the same for both MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_node(NodeIndex::new(mtree.depth(), 2)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 2)),
|
|
|
|
mtree.get_node(NodeIndex::make(mtree.depth(), 2)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 2)),
|
|
|
|
"node 2 must be the same for both MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_node(NodeIndex::new(mtree.depth(), 3)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 3)),
|
|
|
|
mtree.get_node(NodeIndex::make(mtree.depth(), 3)),
|
|
|
|
store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 3)),
|
|
|
|
"node 3 must be the same for both MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
// STORE MERKLE PATH MATCHS ==============================================================
|
|
|
|
// assert the merkle path returned by the store is the same as the one in the tree
|
|
|
|
let result = store
|
|
|
|
.get_path(mtree.root(), NodeIndex::new(mtree.depth(), 0))
|
|
|
|
.get_path(mtree.root(), NodeIndex::make(mtree.depth(), 0))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[0], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_path(NodeIndex::new(mtree.depth(), 0)),
|
|
|
|
mtree.get_path(NodeIndex::make(mtree.depth(), 0)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(mtree.root(), NodeIndex::new(mtree.depth(), 1))
|
|
|
|
.get_path(mtree.root(), NodeIndex::make(mtree.depth(), 1))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[1], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_path(NodeIndex::new(mtree.depth(), 1)),
|
|
|
|
mtree.get_path(NodeIndex::make(mtree.depth(), 1)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 1 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(mtree.root(), NodeIndex::new(mtree.depth(), 2))
|
|
|
|
.get_path(mtree.root(), NodeIndex::make(mtree.depth(), 2))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[2], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_path(NodeIndex::new(mtree.depth(), 2)),
|
|
|
|
mtree.get_path(NodeIndex::make(mtree.depth(), 2)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(mtree.root(), NodeIndex::new(mtree.depth(), 3))
|
|
|
|
.get_path(mtree.root(), NodeIndex::make(mtree.depth(), 3))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[3], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
mtree.get_path(NodeIndex::new(mtree.depth(), 3)),
|
|
|
|
mtree.get_path(NodeIndex::make(mtree.depth(), 3)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
@ -153,7 +153,7 @@ fn test_empty_roots() { |
|
|
|
for depth in 0..255 {
|
|
|
|
root = Rpo256::merge(&[root; 2]);
|
|
|
|
assert!(
|
|
|
|
store.get_node(root.into(), NodeIndex::new(0, 0)).is_ok(),
|
|
|
|
store.get_node(root.into(), NodeIndex::make(0, 0)).is_ok(),
|
|
|
|
"The root of the empty tree of depth {depth} must be registered"
|
|
|
|
);
|
|
|
|
}
|
|
|
@ -169,7 +169,7 @@ fn test_leaf_paths_for_empty_trees() -> Result<(), MerkleError> { |
|
|
|
for depth in 1..64 {
|
|
|
|
let smt = SimpleSmt::new(depth)?;
|
|
|
|
|
|
|
|
let index = NodeIndex::new(depth, 0);
|
|
|
|
let index = NodeIndex::make(depth, 0);
|
|
|
|
let store_path = store.get_path(smt.root(), index)?;
|
|
|
|
let smt_path = smt.get_path(index)?;
|
|
|
|
assert_eq!(
|
|
|
@ -181,7 +181,7 @@ fn test_leaf_paths_for_empty_trees() -> Result<(), MerkleError> { |
|
|
|
"the returned merkle path does not match the computed values"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store_path.path.compute_root(depth.into(), EMPTY),
|
|
|
|
store_path.path.compute_root(depth.into(), EMPTY).unwrap(),
|
|
|
|
smt.root(),
|
|
|
|
"computed root from the path must match the empty tree root"
|
|
|
|
);
|
|
|
@ -197,7 +197,7 @@ fn test_get_invalid_node() { |
|
|
|
store
|
|
|
|
.add_merkle_tree(LEAVES4.to_vec())
|
|
|
|
.expect("adding a merkle tree to the store must work");
|
|
|
|
let _ = store.get_node(mtree.root(), NodeIndex::new(mtree.depth(), 3));
|
|
|
|
let _ = store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 3));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
@ -211,18 +211,18 @@ fn test_add_sparse_merkle_tree_one_level() -> Result<(), MerkleError> { |
|
|
|
.with_leaves(keys2.into_iter().zip(leaves2.into_iter()))
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let idx = NodeIndex::new(1, 0);
|
|
|
|
assert_eq!(smt.get_node(&idx).unwrap(), leaves2[0]);
|
|
|
|
let idx = NodeIndex::make(1, 0);
|
|
|
|
assert_eq!(smt.get_node(idx).unwrap(), leaves2[0]);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), idx).unwrap(),
|
|
|
|
smt.get_node(&idx).unwrap()
|
|
|
|
smt.get_node(idx).unwrap()
|
|
|
|
);
|
|
|
|
|
|
|
|
let idx = NodeIndex::new(1, 1);
|
|
|
|
assert_eq!(smt.get_node(&idx).unwrap(), leaves2[1]);
|
|
|
|
let idx = NodeIndex::make(1, 1);
|
|
|
|
assert_eq!(smt.get_node(idx).unwrap(), leaves2[1]);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), idx).unwrap(),
|
|
|
|
smt.get_node(&idx).unwrap()
|
|
|
|
smt.get_node(idx).unwrap()
|
|
|
|
);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
@ -244,27 +244,27 @@ fn test_sparse_merkle_tree() -> Result<(), MerkleError> { |
|
|
|
// STORE LEAVES ARE CORRECT ==============================================================
|
|
|
|
// checks the leaves in the store corresponds to the expected values
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 0)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 0)),
|
|
|
|
Ok(LEAVES4[0]),
|
|
|
|
"node 0 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 1)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 1)),
|
|
|
|
Ok(LEAVES4[1]),
|
|
|
|
"node 1 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 2)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 2)),
|
|
|
|
Ok(LEAVES4[2]),
|
|
|
|
"node 2 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 3)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 3)),
|
|
|
|
Ok(LEAVES4[3]),
|
|
|
|
"node 3 must be in the tree"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 4)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 4)),
|
|
|
|
Ok(EMPTY),
|
|
|
|
"unmodified node 4 must be ZERO"
|
|
|
|
);
|
|
|
@ -272,94 +272,94 @@ fn test_sparse_merkle_tree() -> Result<(), MerkleError> { |
|
|
|
// STORE LEAVES MATCH TREE ===============================================================
|
|
|
|
// sanity check the values returned by the store and the tree
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_node(&NodeIndex::new(smt.depth(), 0)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 0)),
|
|
|
|
smt.get_node(NodeIndex::make(smt.depth(), 0)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 0)),
|
|
|
|
"node 0 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_node(&NodeIndex::new(smt.depth(), 1)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 1)),
|
|
|
|
smt.get_node(NodeIndex::make(smt.depth(), 1)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 1)),
|
|
|
|
"node 1 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_node(&NodeIndex::new(smt.depth(), 2)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 2)),
|
|
|
|
smt.get_node(NodeIndex::make(smt.depth(), 2)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 2)),
|
|
|
|
"node 2 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_node(&NodeIndex::new(smt.depth(), 3)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 3)),
|
|
|
|
smt.get_node(NodeIndex::make(smt.depth(), 3)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 3)),
|
|
|
|
"node 3 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_node(&NodeIndex::new(smt.depth(), 4)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::new(smt.depth(), 4)),
|
|
|
|
smt.get_node(NodeIndex::make(smt.depth(), 4)),
|
|
|
|
store.get_node(smt.root(), NodeIndex::make(smt.depth(), 4)),
|
|
|
|
"node 4 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
// STORE MERKLE PATH MATCHS ==============================================================
|
|
|
|
// assert the merkle path returned by the store is the same as the one in the tree
|
|
|
|
let result = store
|
|
|
|
.get_path(smt.root(), NodeIndex::new(smt.depth(), 0))
|
|
|
|
.get_path(smt.root(), NodeIndex::make(smt.depth(), 0))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[0], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_path(NodeIndex::new(smt.depth(), 0)),
|
|
|
|
smt.get_path(NodeIndex::make(smt.depth(), 0)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(smt.root(), NodeIndex::new(smt.depth(), 1))
|
|
|
|
.get_path(smt.root(), NodeIndex::make(smt.depth(), 1))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[1], result.value,
|
|
|
|
"Value for merkle path at index 1 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_path(NodeIndex::new(smt.depth(), 1)),
|
|
|
|
smt.get_path(NodeIndex::make(smt.depth(), 1)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 1 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(smt.root(), NodeIndex::new(smt.depth(), 2))
|
|
|
|
.get_path(smt.root(), NodeIndex::make(smt.depth(), 2))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[2], result.value,
|
|
|
|
"Value for merkle path at index 2 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_path(NodeIndex::new(smt.depth(), 2)),
|
|
|
|
smt.get_path(NodeIndex::make(smt.depth(), 2)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 2 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(smt.root(), NodeIndex::new(smt.depth(), 3))
|
|
|
|
.get_path(smt.root(), NodeIndex::make(smt.depth(), 3))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[3], result.value,
|
|
|
|
"Value for merkle path at index 3 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_path(NodeIndex::new(smt.depth(), 3)),
|
|
|
|
smt.get_path(NodeIndex::make(smt.depth(), 3)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 3 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(smt.root(), NodeIndex::new(smt.depth(), 4))
|
|
|
|
.get_path(smt.root(), NodeIndex::make(smt.depth(), 4))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
EMPTY, result.value,
|
|
|
|
"Value for merkle path at index 4 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
smt.get_path(NodeIndex::new(smt.depth(), 4)),
|
|
|
|
smt.get_path(NodeIndex::make(smt.depth(), 4)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 4 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
@ -372,16 +372,16 @@ fn test_add_merkle_paths() -> Result<(), MerkleError> { |
|
|
|
let mtree = MerkleTree::new(LEAVES4.to_vec())?;
|
|
|
|
|
|
|
|
let i0 = 0;
|
|
|
|
let p0 = mtree.get_path(NodeIndex::new(2, i0)).unwrap();
|
|
|
|
let p0 = mtree.get_path(NodeIndex::make(2, i0)).unwrap();
|
|
|
|
|
|
|
|
let i1 = 1;
|
|
|
|
let p1 = mtree.get_path(NodeIndex::new(2, i1)).unwrap();
|
|
|
|
let p1 = mtree.get_path(NodeIndex::make(2, i1)).unwrap();
|
|
|
|
|
|
|
|
let i2 = 2;
|
|
|
|
let p2 = mtree.get_path(NodeIndex::new(2, i2)).unwrap();
|
|
|
|
let p2 = mtree.get_path(NodeIndex::make(2, i2)).unwrap();
|
|
|
|
|
|
|
|
let i3 = 3;
|
|
|
|
let p3 = mtree.get_path(NodeIndex::new(2, i3)).unwrap();
|
|
|
|
let p3 = mtree.get_path(NodeIndex::make(2, i3)).unwrap();
|
|
|
|
|
|
|
|
let paths = [
|
|
|
|
(i0, LEAVES4[i0 as usize], p0),
|
|
|
@ -401,22 +401,22 @@ fn test_add_merkle_paths() -> Result<(), MerkleError> { |
|
|
|
// STORE LEAVES ARE CORRECT ==============================================================
|
|
|
|
// checks the leaves in the store corresponds to the expected values
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 0)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 0)),
|
|
|
|
Ok(LEAVES4[0]),
|
|
|
|
"node 0 must be in the set"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 1)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 1)),
|
|
|
|
Ok(LEAVES4[1]),
|
|
|
|
"node 1 must be in the set"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 2)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 2)),
|
|
|
|
Ok(LEAVES4[2]),
|
|
|
|
"node 2 must be in the set"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 3)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 3)),
|
|
|
|
Ok(LEAVES4[3]),
|
|
|
|
"node 3 must be in the set"
|
|
|
|
);
|
|
|
@ -424,76 +424,76 @@ fn test_add_merkle_paths() -> Result<(), MerkleError> { |
|
|
|
// STORE LEAVES MATCH SET ================================================================
|
|
|
|
// sanity check the values returned by the store and the set
|
|
|
|
assert_eq!(
|
|
|
|
set.get_node(NodeIndex::new(set.depth(), 0)),
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 0)),
|
|
|
|
set.get_node(NodeIndex::make(set.depth(), 0)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 0)),
|
|
|
|
"node 0 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_node(NodeIndex::new(set.depth(), 1)),
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 1)),
|
|
|
|
set.get_node(NodeIndex::make(set.depth(), 1)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 1)),
|
|
|
|
"node 1 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_node(NodeIndex::new(set.depth(), 2)),
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 2)),
|
|
|
|
set.get_node(NodeIndex::make(set.depth(), 2)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 2)),
|
|
|
|
"node 2 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_node(NodeIndex::new(set.depth(), 3)),
|
|
|
|
store.get_node(set.root(), NodeIndex::new(set.depth(), 3)),
|
|
|
|
set.get_node(NodeIndex::make(set.depth(), 3)),
|
|
|
|
store.get_node(set.root(), NodeIndex::make(set.depth(), 3)),
|
|
|
|
"node 3 must be the same for both SparseMerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
// STORE MERKLE PATH MATCHS ==============================================================
|
|
|
|
// assert the merkle path returned by the store is the same as the one in the set
|
|
|
|
let result = store
|
|
|
|
.get_path(set.root(), NodeIndex::new(set.depth(), 0))
|
|
|
|
.get_path(set.root(), NodeIndex::make(set.depth(), 0))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[0], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_path(NodeIndex::new(set.depth(), 0)),
|
|
|
|
set.get_path(NodeIndex::make(set.depth(), 0)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(set.root(), NodeIndex::new(set.depth(), 1))
|
|
|
|
.get_path(set.root(), NodeIndex::make(set.depth(), 1))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[1], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_path(NodeIndex::new(set.depth(), 1)),
|
|
|
|
set.get_path(NodeIndex::make(set.depth(), 1)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 1 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(set.root(), NodeIndex::new(set.depth(), 2))
|
|
|
|
.get_path(set.root(), NodeIndex::make(set.depth(), 2))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[2], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_path(NodeIndex::new(set.depth(), 2)),
|
|
|
|
set.get_path(NodeIndex::make(set.depth(), 2)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
|
|
|
|
|
let result = store
|
|
|
|
.get_path(set.root(), NodeIndex::new(set.depth(), 3))
|
|
|
|
.get_path(set.root(), NodeIndex::make(set.depth(), 3))
|
|
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
LEAVES4[3], result.value,
|
|
|
|
"Value for merkle path at index 0 must match leaf value"
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
set.get_path(NodeIndex::new(set.depth(), 3)),
|
|
|
|
set.get_path(NodeIndex::make(set.depth(), 3)),
|
|
|
|
Ok(result.path),
|
|
|
|
"merkle path for index 0 must be the same for the MerkleTree and MerkleStore"
|
|
|
|
);
|
|
|
@ -550,7 +550,7 @@ fn store_path_opens_from_leaf() { |
|
|
|
.with_merkle_tree([a, b, c, d, e, f, g, h])
|
|
|
|
.unwrap();
|
|
|
|
let path = store
|
|
|
|
.get_path(root.into(), NodeIndex::new(3, 1))
|
|
|
|
.get_path(root.into(), NodeIndex::make(3, 1))
|
|
|
|
.unwrap()
|
|
|
|
.path;
|
|
|
|
|
|
|
@ -563,7 +563,7 @@ fn test_set_node() -> Result<(), MerkleError> { |
|
|
|
let mtree = MerkleTree::new(LEAVES4.to_vec())?;
|
|
|
|
let mut store = MerkleStore::default().with_merkle_tree(LEAVES4)?;
|
|
|
|
let value = int_to_node(42);
|
|
|
|
let index = NodeIndex::new(mtree.depth(), 0);
|
|
|
|
let index = NodeIndex::make(mtree.depth(), 0);
|
|
|
|
let new_root = store.set_node(mtree.root(), index, value)?.root;
|
|
|
|
assert_eq!(
|
|
|
|
store.get_node(new_root, index),
|
|
|
@ -582,7 +582,7 @@ fn test_constructors() -> Result<(), MerkleError> { |
|
|
|
let depth = mtree.depth();
|
|
|
|
let leaves = 2u64.pow(depth.into());
|
|
|
|
for index in 0..leaves {
|
|
|
|
let index = NodeIndex::new(depth, index);
|
|
|
|
let index = NodeIndex::make(depth, index);
|
|
|
|
let value_path = store.get_path(mtree.root(), index)?;
|
|
|
|
assert_eq!(mtree.get_path(index)?, value_path.path);
|
|
|
|
}
|
|
|
@ -597,34 +597,50 @@ fn test_constructors() -> Result<(), MerkleError> { |
|
|
|
let depth = smt.depth();
|
|
|
|
|
|
|
|
for key in KEYS4 {
|
|
|
|
let index = NodeIndex::new(depth, key);
|
|
|
|
let index = NodeIndex::make(depth, key);
|
|
|
|
let value_path = store.get_path(smt.root(), index)?;
|
|
|
|
assert_eq!(smt.get_path(index)?, value_path.path);
|
|
|
|
}
|
|
|
|
|
|
|
|
let d = 2;
|
|
|
|
let paths = [
|
|
|
|
(0, LEAVES4[0], mtree.get_path(NodeIndex::new(d, 0)).unwrap()),
|
|
|
|
(1, LEAVES4[1], mtree.get_path(NodeIndex::new(d, 1)).unwrap()),
|
|
|
|
(2, LEAVES4[2], mtree.get_path(NodeIndex::new(d, 2)).unwrap()),
|
|
|
|
(3, LEAVES4[3], mtree.get_path(NodeIndex::new(d, 3)).unwrap()),
|
|
|
|
(
|
|
|
|
0,
|
|
|
|
LEAVES4[0],
|
|
|
|
mtree.get_path(NodeIndex::make(d, 0)).unwrap(),
|
|
|
|
),
|
|
|
|
(
|
|
|
|
1,
|
|
|
|
LEAVES4[1],
|
|
|
|
mtree.get_path(NodeIndex::make(d, 1)).unwrap(),
|
|
|
|
),
|
|
|
|
(
|
|
|
|
2,
|
|
|
|
LEAVES4[2],
|
|
|
|
mtree.get_path(NodeIndex::make(d, 2)).unwrap(),
|
|
|
|
),
|
|
|
|
(
|
|
|
|
3,
|
|
|
|
LEAVES4[3],
|
|
|
|
mtree.get_path(NodeIndex::make(d, 3)).unwrap(),
|
|
|
|
),
|
|
|
|
];
|
|
|
|
|
|
|
|
let store1 = MerkleStore::default().with_merkle_paths(paths.clone())?;
|
|
|
|
let store2 = MerkleStore::default()
|
|
|
|
.with_merkle_path(0, LEAVES4[0], mtree.get_path(NodeIndex::new(d, 0))?)?
|
|
|
|
.with_merkle_path(1, LEAVES4[1], mtree.get_path(NodeIndex::new(d, 1))?)?
|
|
|
|
.with_merkle_path(2, LEAVES4[2], mtree.get_path(NodeIndex::new(d, 2))?)?
|
|
|
|
.with_merkle_path(3, LEAVES4[3], mtree.get_path(NodeIndex::new(d, 3))?)?;
|
|
|
|
.with_merkle_path(0, LEAVES4[0], mtree.get_path(NodeIndex::make(d, 0))?)?
|
|
|
|
.with_merkle_path(1, LEAVES4[1], mtree.get_path(NodeIndex::make(d, 1))?)?
|
|
|
|
.with_merkle_path(2, LEAVES4[2], mtree.get_path(NodeIndex::make(d, 2))?)?
|
|
|
|
.with_merkle_path(3, LEAVES4[3], mtree.get_path(NodeIndex::make(d, 3))?)?;
|
|
|
|
let set = MerklePathSet::new(d).with_paths(paths).unwrap();
|
|
|
|
|
|
|
|
for key in [0, 1, 2, 3] {
|
|
|
|
let index = NodeIndex::new(d, key);
|
|
|
|
let index = NodeIndex::make(d, key);
|
|
|
|
let value_path1 = store1.get_path(set.root(), index)?;
|
|
|
|
let value_path2 = store2.get_path(set.root(), index)?;
|
|
|
|
assert_eq!(value_path1, value_path2);
|
|
|
|
|
|
|
|
let index = NodeIndex::new(d, key);
|
|
|
|
let index = NodeIndex::make(d, key);
|
|
|
|
assert_eq!(set.get_path(index)?, value_path1.path);
|
|
|
|
}
|
|
|
|
|
|
|
|