arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
feat: remove clone requirement for MerkleStore From constructors
Bobbin Threadbare bobbinth@protonmail.com
Fri, 21 Apr 2023 11:22:36 -0700
commit

9be4253f195a2e2249a1b451dd3984a316616e13

parent

59595a2e0465ccf7de1893e986bb909176bc23d9

4 files changed, 40 insertions(+), 29 deletions(-)

jump to
M benches/store.rs → benches/store.rs

@@ -34,7 +34,7 @@

// both SMT and the store are pre-populated with empty hashes, accessing these values is what is // being benchmarked here, so no values are inserted into the backends let smt = SimpleSmt::new(depth).unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let root = smt.root(); group.bench_function(BenchmarkId::new("SimpleSmt", depth), |b| {

@@ -66,7 +66,7 @@ let leaves = &random_data[..size];

let mtree_leaves: Vec<Word> = leaves.iter().map(|v| v.into()).collect(); let mtree = MerkleTree::new(mtree_leaves.clone()).unwrap(); - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let depth = mtree.depth(); let root = mtree.root(); let size_u64 = size as u64;

@@ -108,7 +108,7 @@ let smt = SimpleSmt::new(SimpleSmt::MAX_DEPTH)

.unwrap() .with_leaves(smt_leaves.clone()) .unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let depth = smt.depth(); let root = smt.root(); let size_u64 = size as u64;

@@ -141,7 +141,7 @@ // both SMT and the store are pre-populated with the empty hashes, accessing the internal nodes

// of these values is what is being benchmarked here, so no values are inserted into the // backends. let smt = SimpleSmt::new(depth).unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let root = smt.root(); let half_depth = depth / 2; let half_size = 2_u64.pow(half_depth as u32);

@@ -176,7 +176,7 @@ let leaves = &random_data[..size];

let mtree_leaves: Vec<Word> = leaves.iter().map(|v| v.into()).collect(); let mtree = MerkleTree::new(mtree_leaves.clone()).unwrap(); - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let root = mtree.root(); let half_depth = mtree.depth() / 2; let half_size = 2_u64.pow(half_depth as u32);

@@ -219,7 +219,7 @@ let smt = SimpleSmt::new(SimpleSmt::MAX_DEPTH)

.unwrap() .with_leaves(smt_leaves.clone()) .unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let root = smt.root(); let half_depth = smt.depth() / 2; let half_size = 2_u64.pow(half_depth as u32);

@@ -254,7 +254,7 @@ let leaves = &random_data[..size];

let mtree_leaves: Vec<Word> = leaves.iter().map(|v| v.into()).collect(); let mtree = MerkleTree::new(mtree_leaves.clone()).unwrap(); - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let depth = mtree.depth(); let root = mtree.root(); let size_u64 = size as u64;

@@ -296,7 +296,7 @@ let smt = SimpleSmt::new(SimpleSmt::MAX_DEPTH)

.unwrap() .with_leaves(smt_leaves.clone()) .unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let depth = smt.depth(); let root = smt.root(); let size_u64 = size as u64;

@@ -346,7 +346,7 @@ b.iter_batched(

|| leaves.iter().map(|v| v.into()).collect::<Vec<Word>>(), |l| { let mtree = MerkleTree::new(l).unwrap(); - black_box(MerkleStore::from(mtree)); + black_box(MerkleStore::from(&mtree)); }, BatchSize::SmallInput, )

@@ -377,7 +377,7 @@ .collect::<Vec<(u64, Word)>>()

}, |l| { let smt = SimpleSmt::new(SimpleSmt::MAX_DEPTH).unwrap().with_leaves(l).unwrap(); - black_box(MerkleStore::from(smt)); + black_box(MerkleStore::from(&smt)); }, BatchSize::SmallInput, )

@@ -397,7 +397,7 @@ let leaves = &random_data[..size];

let mtree_leaves: Vec<Word> = leaves.iter().map(|v| v.into()).collect(); let mut mtree = MerkleTree::new(mtree_leaves.clone()).unwrap(); - let mut store: MerkleStore = mtree.clone().into(); + let mut store = MerkleStore::from(&mtree); let depth = mtree.depth(); let root = mtree.root(); let size_u64 = size as u64;

@@ -446,7 +446,7 @@ let mut smt = SimpleSmt::new(SimpleSmt::MAX_DEPTH)

.unwrap() .with_leaves(smt_leaves.clone()) .unwrap(); - let mut store: MerkleStore = smt.clone().into(); + let mut store = MerkleStore::from(&smt); let depth = smt.depth(); let root = smt.root(); let size_u64 = size as u64;
M src/merkle/merkle_tree.rs → src/merkle/merkle_tree.rs

@@ -192,6 +192,9 @@ }

} } +// UTILITY FUNCTIONS +// ================================================================================================ + /// Utility to visualize a [MerkleTree] in text. pub fn tree_to_text(tree: &MerkleTree) -> Result<String, fmt::Error> { let indent = " ";
M src/merkle/store/mod.rs → src/merkle/store/mod.rs

@@ -393,29 +393,37 @@ Ok(parent.into())

} } -// CONVERTIONS +// CONVERSIONS // ================================================================================================ -impl From<MerkleTree> for MerkleStore { - fn from(value: MerkleTree) -> Self { +impl From<&MerkleTree> for MerkleStore { + fn from(value: &MerkleTree) -> Self { let mut store = MerkleStore::new(); store.extend(value.inner_nodes()); store } } -impl From<SimpleSmt> for MerkleStore { - fn from(value: SimpleSmt) -> Self { +impl From<&SimpleSmt> for MerkleStore { + fn from(value: &SimpleSmt) -> Self { let mut store = MerkleStore::new(); store.extend(value.inner_nodes()); store } } -impl From<Mmr> for MerkleStore { - fn from(value: Mmr) -> Self { +impl From<&Mmr> for MerkleStore { + fn from(value: &Mmr) -> Self { let mut store = MerkleStore::new(); store.extend(value.inner_nodes()); + store + } +} + +impl FromIterator<InnerNodeInfo> for MerkleStore { + fn from_iter<T: IntoIterator<Item = InnerNodeInfo>>(iter: T) -> Self { + let mut store = MerkleStore::new(); + store.extend(iter.into_iter()); store } }
M src/merkle/store/tests.rs → src/merkle/store/tests.rs

@@ -15,7 +15,7 @@

#[test] fn test_root_not_in_store() -> Result<(), MerkleError> { let mtree = MerkleTree::new(LEAVES4.to_vec())?; - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); assert_eq!( store.get_node(LEAVES4[0], NodeIndex::make(mtree.depth(), 0)), Err(MerkleError::RootNotInStore(LEAVES4[0])),

@@ -33,7 +33,7 @@

#[test] fn test_merkle_tree() -> Result<(), MerkleError> { let mtree = MerkleTree::new(LEAVES4.to_vec())?; - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); // STORE LEAVES ARE CORRECT ============================================================== // checks the leaves in the store corresponds to the expected values

@@ -175,7 +175,7 @@

#[test] fn test_get_invalid_node() { let mtree = MerkleTree::new(LEAVES4.to_vec()).expect("creating a merkle tree must work"); - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let _ = store.get_node(mtree.root(), NodeIndex::make(mtree.depth(), 3)); }

@@ -187,7 +187,7 @@ let smt = SimpleSmt::new(1)

.unwrap() .with_leaves(keys2.into_iter().zip(leaves2.into_iter())) .unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let idx = NodeIndex::make(1, 0); assert_eq!(smt.get_node(idx).unwrap(), leaves2[0]);

@@ -207,7 +207,7 @@ .unwrap()

.with_leaves(KEYS4.into_iter().zip(LEAVES4.into_iter())) .unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); // STORE LEAVES ARE CORRECT ============================================================== // checks the leaves in the store corresponds to the expected values

@@ -465,7 +465,7 @@ // For this example, the depth of the Merkle tree is 1, as we have only two leaves. Here we

// attempt to fetch a node on the maximum depth, and it should fail because the root shouldn't // exist for the set. let mtree = MerkleTree::new(vec![a, b]).unwrap(); - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let index = NodeIndex::root(); let err = store.get_node(root, index).err().unwrap(); assert_eq!(err, MerkleError::RootNotInStore(root));

@@ -493,7 +493,7 @@

let root = Rpo256::merge(&[m.into(), n.into()]); let mtree = MerkleTree::new(vec![a, b, c, d, e, f, g, h]).unwrap(); - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let path = store.get_path(root.into(), NodeIndex::make(3, 1)).unwrap().path; let expected = MerklePath::new([a.into(), j.into(), n.into()].to_vec());

@@ -503,7 +503,7 @@

#[test] fn test_set_node() -> Result<(), MerkleError> { let mtree = MerkleTree::new(LEAVES4.to_vec())?; - let mut store: MerkleStore = mtree.clone().into(); + let mut store = MerkleStore::from(&mtree); let value = int_to_node(42); let index = NodeIndex::make(mtree.depth(), 0); let new_root = store.set_node(mtree.root(), index, value)?.root;

@@ -515,7 +515,7 @@

#[test] fn test_constructors() -> Result<(), MerkleError> { let mtree = MerkleTree::new(LEAVES4.to_vec())?; - let store: MerkleStore = mtree.clone().into(); + let store = MerkleStore::from(&mtree); let depth = mtree.depth(); let leaves = 2u64.pow(depth.into());

@@ -530,7 +530,7 @@ let smt = SimpleSmt::new(depth)

.unwrap() .with_leaves(KEYS4.into_iter().zip(LEAVES4.into_iter())) .unwrap(); - let store: MerkleStore = smt.clone().into(); + let store = MerkleStore::from(&smt); let depth = smt.depth(); for key in KEYS4 {