store: support adding existing structures

This commit is contained in:
Augusto F. Hack 2023-04-19 15:30:16 +02:00
parent 158167356d
commit 8161477d6a
No known key found for this signature in database
GPG key ID: 3F3584B7FB1DFB76

View file

@ -1,7 +1,7 @@
use super::mmr::{Mmr, MmrPeaks}; use super::mmr::{Mmr, MmrPeaks};
use super::{ use super::{
BTreeMap, EmptySubtreeRoots, MerkleError, MerklePath, MerklePathSet, MerkleTree, NodeIndex, BTreeMap, EmptySubtreeRoots, InnerNodeInfo, MerkleError, MerklePath, MerklePathSet, MerkleTree,
RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word, NodeIndex, RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word,
}; };
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
@ -310,6 +310,20 @@ impl MerkleStore {
// STATE MUTATORS // STATE MUTATORS
// -------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------
/// Adds a new [InnerNodeInfo] into the store.
pub fn extend(&mut self, iter: impl Iterator<Item = InnerNodeInfo>) -> &mut MerkleStore {
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 });
}
self
}
/// Adds all the nodes of a Merkle tree represented by `leaves`. /// 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 /// This will instantiate a Merkle tree using `leaves` and include all the nodes into the
@ -330,15 +344,7 @@ impl MerkleStore {
} }
let tree = MerkleTree::new(leaves)?; let tree = MerkleTree::new(leaves)?;
for node in tree.inner_nodes() { self.extend(tree.inner_nodes());
self.nodes.insert(
node.value.into(),
Node {
left: node.left.into(),
right: node.right.into(),
},
);
}
Ok(tree.root()) Ok(tree.root())
} }
@ -361,15 +367,7 @@ impl MerkleStore {
I: Iterator<Item = (u64, Word)> + ExactSizeIterator, I: Iterator<Item = (u64, Word)> + ExactSizeIterator,
{ {
let smt = SimpleSmt::new(depth)?.with_leaves(entries)?; let smt = SimpleSmt::new(depth)?.with_leaves(entries)?;
for node in smt.inner_nodes() { self.extend(smt.inner_nodes());
self.nodes.insert(
node.value.into(),
Node {
left: node.left.into(),
right: node.right.into(),
},
);
}
Ok(smt.root()) Ok(smt.root())
} }
@ -441,15 +439,7 @@ impl MerkleStore {
I: IntoIterator<Item = Word>, I: IntoIterator<Item = Word>,
{ {
let mmr = Mmr::from(leaves); let mmr = Mmr::from(leaves);
for node in mmr.inner_nodes() { self.extend(mmr.inner_nodes());
self.nodes.insert(
node.value.into(),
Node {
left: node.left.into(),
right: node.right.into(),
},
);
}
Ok(mmr.accumulator()) Ok(mmr.accumulator())
} }
@ -482,19 +472,22 @@ impl MerkleStore {
/// ///
/// Merges arbitrary values. They may be leafs, nodes, or a mixture of both. /// 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> { pub fn merge_roots(&mut self, root1: Word, root2: Word) -> Result<Word, MerkleError> {
let root1: RpoDigest = root1.into(); let left: RpoDigest = root1.into();
let root2: RpoDigest = root2.into(); let right: RpoDigest = root2.into();
let parent: Word = Rpo256::merge(&[root1, root2]).into(); let parent = Rpo256::merge(&[left, right]);
self.nodes.insert( self.nodes.insert(parent, Node { left, right });
parent.into(),
Node {
left: root1,
right: root2,
},
);
Ok(parent) Ok(parent.into())
}
}
// ITERATORS
// ================================================================================================
impl Extend<InnerNodeInfo> for MerkleStore {
fn extend<T: IntoIterator<Item = InnerNodeInfo>>(&mut self, iter: T) {
self.extend(iter.into_iter());
} }
} }