Skip to content

Commit

Permalink
store: support adding existing structures
Browse files Browse the repository at this point in the history
  • Loading branch information
hackaugusto committed Apr 19, 2023
1 parent 1581673 commit 57a9583
Showing 1 changed file with 33 additions and 42 deletions.
75 changes: 33 additions & 42 deletions src/merkle/store/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::mmr::{Mmr, MmrPeaks};
use super::{
BTreeMap, EmptySubtreeRoots, MerkleError, MerklePath, MerklePathSet, MerkleTree, NodeIndex,
RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word,
BTreeMap, EmptySubtreeRoots, InnerNodeInfo, MerkleError, MerklePath, MerklePathSet, MerkleTree,
NodeIndex, RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word,
};
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};

Expand Down Expand Up @@ -310,6 +310,18 @@ impl MerkleStore {
// STATE MUTATORS
// --------------------------------------------------------------------------------------------

/// Adds a new [InnerNodeInfo] into the store.
pub fn add_inner_nodes(&mut self, iter: impl Iterator<Item = InnerNodeInfo>) {
for node in iter {
let value: RpoDigest = node.value.into();
let left: RpoDigest = node.left.into();
let right: RpoDigest = node.right.into();

debug_assert_eq!(Rpo256::merge(&[left, right]), value);
self.nodes.insert(value, Node { left, right });
}
}

/// Adds all the nodes of a Merkle tree represented by `leaves`.
///
/// This will instantiate a Merkle tree using `leaves` and include all the nodes into the
Expand All @@ -330,15 +342,7 @@ impl MerkleStore {
}

let tree = MerkleTree::new(leaves)?;
for node in tree.inner_nodes() {
self.nodes.insert(
node.value.into(),
Node {
left: node.left.into(),
right: node.right.into(),
},
);
}
self.add_inner_nodes(tree.inner_nodes());

Ok(tree.root())
}
Expand All @@ -361,15 +365,7 @@ impl MerkleStore {
I: Iterator<Item = (u64, Word)> + ExactSizeIterator,
{
let smt = SimpleSmt::new(depth)?.with_leaves(entries)?;
for node in smt.inner_nodes() {
self.nodes.insert(
node.value.into(),
Node {
left: node.left.into(),
right: node.right.into(),
},
);
}
self.add_inner_nodes(smt.inner_nodes());

Ok(smt.root())
}
Expand Down Expand Up @@ -441,15 +437,7 @@ impl MerkleStore {
I: IntoIterator<Item = Word>,
{
let mmr = Mmr::from(leaves);
for node in mmr.inner_nodes() {
self.nodes.insert(
node.value.into(),
Node {
left: node.left.into(),
right: node.right.into(),
},
);
}
self.add_inner_nodes(mmr.inner_nodes());

Ok(mmr.accumulator())
}
Expand Down Expand Up @@ -482,19 +470,22 @@ impl MerkleStore {
///
/// Merges arbitrary values. They may be leafs, nodes, or a mixture of both.
pub fn merge_roots(&mut self, root1: Word, root2: Word) -> Result<Word, MerkleError> {
let root1: RpoDigest = root1.into();
let root2: RpoDigest = root2.into();

let parent: Word = Rpo256::merge(&[root1, root2]).into();
self.nodes.insert(
parent.into(),
Node {
left: root1,
right: root2,
},
);

Ok(parent)
let left: RpoDigest = root1.into();
let right: RpoDigest = root2.into();

let parent = Rpo256::merge(&[left, right]);
self.nodes.insert(parent, Node { left, right });

Ok(parent.into())
}
}

// ITERATORS
// ================================================================================================

impl Extend<InnerNodeInfo> for MerkleStore {
fn extend<T: IntoIterator<Item = InnerNodeInfo>>(&mut self, iter: T) {
self.add_inner_nodes(iter.into_iter());
}
}

Expand Down

0 comments on commit 57a9583

Please sign in to comment.