Skip to content

Commit 0c76bbe

Browse files
authored
Merge pull request #32 from quake/quake/new-with-store
feat: load root from store
2 parents 6579723 + 4270433 commit 0c76bbe

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/tests/tree.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,13 @@ proptest! {
493493
}
494494
}
495495

496+
#[test]
497+
fn test_from_store((pairs, _n) in leaves(1, 20)) {
498+
let smt = new_smt(pairs.clone());
499+
let smt2 = SMT::new_with_store(smt.store().clone()).expect("from store");
500+
assert_eq!(smt.root(), smt2.root());
501+
}
502+
496503
#[test]
497504
fn test_smt_update_all((pairs, _n) in leaves(1, 20), (pairs2, _n2) in leaves(1, 10)){
498505
let mut smt = new_smt(pairs.clone());

src/tree.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,23 @@ impl<H, V, S> SparseMerkleTree<H, V, S> {
8888
}
8989
}
9090

91+
impl<H: Hasher + Default, V, S: StoreReadOps<V>> SparseMerkleTree<H, V, S> {
92+
/// Build a merkle tree from store, the root will be calculated automatically
93+
pub fn new_with_store(store: S) -> Result<SparseMerkleTree<H, V, S>> {
94+
let root_branch_key = BranchKey::new(core::u8::MAX, H256::zero());
95+
store
96+
.get_branch(&root_branch_key)
97+
.map(|branch_node| {
98+
branch_node
99+
.map(|n| {
100+
merge::<H>(core::u8::MAX, &H256::zero(), &n.left, &n.right).hash::<H>()
101+
})
102+
.unwrap_or_default()
103+
})
104+
.map(|root| SparseMerkleTree::new(root, store))
105+
}
106+
}
107+
91108
impl<H: Hasher + Default, V: Value, S: StoreReadOps<V> + StoreWriteOps<V>>
92109
SparseMerkleTree<H, V, S>
93110
{

0 commit comments

Comments
 (0)