@ -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 ]
@ -205,24 +205,24 @@ fn test_add_sparse_merkle_tree_one_level() -> Result<(), MerkleError> {
let mut store = MerkleStore ::default ( ) ;
let keys2 : [ u64 ; 2 ] = [ 0 , 1 ] ;
let leaves2 : [ Word ; 2 ] = [ int_to_node ( 1 ) , int_to_node ( 2 ) ] ;
store . add_sparse_merkle_tree ( keys2 . into_iter ( ) . zip ( leaves2 . into_iter ( ) ) ) ? ;
store . add_sparse_merkle_tree ( 48 , keys2 . into_iter ( ) . zip ( leaves2 . into_iter ( ) ) ) ? ;
let smt = SimpleSmt ::new ( 1 )
. unwrap ( )
. 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 ( ( ) )
@ -231,7 +231,10 @@ fn test_add_sparse_merkle_tree_one_level() -> Result<(), MerkleError> {
#[ test ]
fn test_sparse_merkle_tree ( ) -> Result < ( ) , MerkleError > {
let mut store = MerkleStore ::default ( ) ;
store . add_sparse_merkle_tree ( KEYS4 . into_iter ( ) . zip ( LEAVES4 . into_iter ( ) ) ) ? ;
store . add_sparse_merkle_tree (
SimpleSmt ::MAX_DEPTH ,
KEYS4 . into_iter ( ) . zip ( LEAVES4 . into_iter ( ) ) ,
) ? ;
let smt = SimpleSmt ::new ( SimpleSmt ::MAX_DEPTH )
. unwrap ( )
@ -241,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"
) ;
@ -269,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"
) ;
@ -369,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 ) ,
@ -398,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"
) ;
@ -421,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"
) ;
@ -547,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 ;
@ -560,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 ) ,
@ -579,54 +582,222 @@ fn test_constructors() -> Result<(), MerkleError> {
let depth = mtree . depth ( ) ;
let leaves = 2 u64 . 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 ) ;
}
let depth = 32 ;
let store = MerkleStore ::default ( )
. with_sparse_merkle_tree ( KEYS4 . into_iter ( ) . zip ( LEAVES4 . into_iter ( ) ) ) ? ;
let smt = SimpleSmt ::new ( SimpleSmt ::MAX_DEPTH )
. with_sparse_merkle_tree ( depth , KEYS4 . into_iter ( ) . zip ( LEAVES4 . into_iter ( ) ) ) ? ;
let smt = SimpleSmt ::new ( depth )
. unwrap ( )
. with_leaves ( KEYS4 . into_iter ( ) . zip ( LEAVES4 . into_iter ( ) ) )
. unwrap ( ) ;
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 ) ;
}
Ok ( ( ) )
}
#[ test ]
fn node_path_should_be_truncated_by_midtier_insert ( ) {
let key = 0b11010010_11001100_11001100_11001100_11001100_11001100_11001100_11001100_ u64 ;
let mut store = MerkleStore ::new ( ) ;
let root : Word = EmptySubtreeRoots ::empty_hashes ( 64 ) [ 0 ] . into ( ) ;
// insert first node - works as expected
let depth = 64 ;
let node = [ Felt ::new ( key ) ; WORD_SIZE ] ;
let index = NodeIndex ::new ( depth , key ) . unwrap ( ) ;
let root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
let result = store . get_node ( root , index ) . unwrap ( ) ;
let path = store . get_path ( root , index ) . unwrap ( ) . path ;
assert_eq ! ( node , result ) ;
assert_eq ! ( path . depth ( ) , depth ) ;
assert ! ( path . verify ( index . value ( ) , result , & root ) ) ;
// flip the first bit of the key and insert the second node on a different depth
let key = key ^ ( 1 < < 63 ) ;
let key = key > > 8 ;
let depth = 56 ;
let node = [ Felt ::new ( key ) ; WORD_SIZE ] ;
let index = NodeIndex ::new ( depth , key ) . unwrap ( ) ;
let root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
let result = store . get_node ( root , index ) . unwrap ( ) ;
let path = store . get_path ( root , index ) . unwrap ( ) . path ;
assert_eq ! ( node , result ) ;
assert_eq ! ( path . depth ( ) , depth ) ;
assert ! ( path . verify ( index . value ( ) , result , & root ) ) ;
// attempt to fetch a path of the second node to depth 64
// should fail because the previously inserted node will remove its sub-tree from the set
let key = key < < 8 ;
let index = NodeIndex ::new ( 64 , key ) . unwrap ( ) ;
assert ! ( store . get_node ( root , index ) . is_err ( ) ) ;
}
#[ test ]
fn get_leaf_depth_works_depth_64 ( ) {
let mut store = MerkleStore ::new ( ) ;
let mut root : Word = EmptySubtreeRoots ::empty_hashes ( 64 ) [ 0 ] . into ( ) ;
let key = u64 ::MAX ;
// this will create a rainbow tree and test all opening to depth 64
for d in 0 . . 64 {
let k = key & ( u64 ::MAX > > d ) ;
let node = [ Felt ::new ( k ) ; WORD_SIZE ] ;
let index = NodeIndex ::new ( 64 , k ) . unwrap ( ) ;
// assert the leaf doesn't exist before the insert. the returned depth should always
// increment with the paths count of the set, as they are insersecting one another up to
// the first bits of the used key.
assert_eq ! ( d , store . get_leaf_depth ( root , 64 , k ) . unwrap ( ) ) ;
// insert and assert the correct depth
root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
assert_eq ! ( 64 , store . get_leaf_depth ( root , 64 , k ) . unwrap ( ) ) ;
}
}
#[ test ]
fn get_leaf_depth_works_with_incremental_depth ( ) {
let mut store = MerkleStore ::new ( ) ;
let mut root : Word = EmptySubtreeRoots ::empty_hashes ( 64 ) [ 0 ] . into ( ) ;
// insert some path to the left of the root and assert it
let key = 0b01001011_10110110_00001101_01110100_00111011_10101101_00000100_01000001_ u64 ;
assert_eq ! ( 0 , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
let depth = 64 ;
let index = NodeIndex ::new ( depth , key ) . unwrap ( ) ;
let node = [ Felt ::new ( key ) ; WORD_SIZE ] ;
root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
assert_eq ! ( depth , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
// flip the key to the right of the root and insert some content on depth 16
let key = 0b11001011_10110110_00000000_00000000_00000000_00000000_00000000_00000000_ u64 ;
assert_eq ! ( 1 , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
let depth = 16 ;
let index = NodeIndex ::new ( depth , key > > ( 64 - depth ) ) . unwrap ( ) ;
let node = [ Felt ::new ( key ) ; WORD_SIZE ] ;
root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
assert_eq ! ( depth , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
// attempt the sibling of the previous leaf
let key = 0b11001011_10110111_00000000_00000000_00000000_00000000_00000000_00000000_ u64 ;
assert_eq ! ( 16 , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
let index = NodeIndex ::new ( depth , key > > ( 64 - depth ) ) . unwrap ( ) ;
let node = [ Felt ::new ( key ) ; WORD_SIZE ] ;
root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
assert_eq ! ( depth , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
// move down to the next depth and assert correct behavior
let key = 0b11001011_10110100_00000000_00000000_00000000_00000000_00000000_00000000_ u64 ;
assert_eq ! ( 15 , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
let depth = 17 ;
let index = NodeIndex ::new ( depth , key > > ( 64 - depth ) ) . unwrap ( ) ;
let node = [ Felt ::new ( key ) ; WORD_SIZE ] ;
root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
assert_eq ! ( depth , store . get_leaf_depth ( root , 64 , key ) . unwrap ( ) ) ;
}
#[ test ]
fn get_leaf_depth_works_with_depth_8 ( ) {
let mut store = MerkleStore ::new ( ) ;
let mut root : Word = EmptySubtreeRoots ::empty_hashes ( 8 ) [ 0 ] . into ( ) ;
// insert some random, 8 depth keys. `a` diverges from the first bit
let a = 0b01101001_ u64 ;
let b = 0b10011001_ u64 ;
let c = 0b10010110_ u64 ;
let d = 0b11110110_ u64 ;
for k in [ a , b , c , d ] {
let index = NodeIndex ::new ( 8 , k ) . unwrap ( ) ;
let node = [ Felt ::new ( k ) ; WORD_SIZE ] ;
root = store . set_node ( root , index , node ) . unwrap ( ) . root ;
}
// assert all leaves returns the inserted depth
for k in [ a , b , c , d ] {
assert_eq ! ( 8 , store . get_leaf_depth ( root , 8 , k ) . unwrap ( ) ) ;
}
// flip last bit of a and expect it to return the the same depth, but for an empty node
assert_eq ! ( 8 , store . get_leaf_depth ( root , 8 , 0b01101000_ u64 ) . unwrap ( ) ) ;
// flip fourth bit of a and expect an empty node on depth 4
assert_eq ! ( 4 , store . get_leaf_depth ( root , 8 , 0b01111001_ u64 ) . unwrap ( ) ) ;
// flip third bit of a and expect an empty node on depth 3
assert_eq ! ( 3 , store . get_leaf_depth ( root , 8 , 0b01001001_ u64 ) . unwrap ( ) ) ;
// flip second bit of a and expect an empty node on depth 2
assert_eq ! ( 2 , store . get_leaf_depth ( root , 8 , 0b00101001_ u64 ) . unwrap ( ) ) ;
// flip fourth bit of c and expect an empty node on depth 4
assert_eq ! ( 4 , store . get_leaf_depth ( root , 8 , 0b10000110_ u64 ) . unwrap ( ) ) ;
// flip second bit of d and expect an empty node on depth 3 as depth 2 conflicts with b and c
assert_eq ! ( 3 , store . get_leaf_depth ( root , 8 , 0b10110110_ u64 ) . unwrap ( ) ) ;
// duplicate the tree on `a` and assert the depth is short-circuited by such sub-tree
let index = NodeIndex ::new ( 8 , a ) . unwrap ( ) ;
root = store . set_node ( root , index , root ) . unwrap ( ) . root ;
assert_eq ! (
Err ( MerkleError ::DepthTooBig ( 9 ) ) ,
store . get_leaf_depth ( root , 8 , a )
) ;
}
#[ cfg(std) ]
#[ test ]
fn test_serialization ( ) -> Result < ( ) , Box < dyn Error > > {