use alloc::{boxed::Box, vec::Vec};
use super::{
SmtStorage, SmtStorageReader, StorageError, StorageUpdateParts, StorageUpdates, SubtreeUpdate,
};
use crate::{
EMPTY_WORD, Map, MapEntry, Word,
merkle::{
NodeIndex,
smt::{
InnerNode, SmtLeaf,
large::{IN_MEMORY_DEPTH, subtree::Subtree},
},
},
};
#[derive(Debug, Clone)]
pub struct MemoryStorage {
pub leaves: Map<u64, SmtLeaf>,
pub subtrees: Map<NodeIndex, Subtree>,
}
impl MemoryStorage {
pub fn new() -> Self {
Self { leaves: Map::new(), subtrees: Map::new() }
}
pub fn into_snapshot(self) -> MemoryStorageSnapshot {
MemoryStorageSnapshot(self)
}
}
impl Default for MemoryStorage {
fn default() -> Self {
Self::new()
}
}
impl SmtStorageReader for MemoryStorage {
fn leaf_count(&self) -> Result<usize, StorageError> {
Ok(self.leaves.len())
}
fn entry_count(&self) -> Result<usize, StorageError> {
Ok(self.leaves.values().map(SmtLeaf::num_entries).sum())
}
fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError> {
Ok(self.leaves.get(&index).cloned())
}
fn get_leaves(&self, indices: &[u64]) -> Result<Vec<Option<SmtLeaf>>, StorageError> {
let leaves = indices.iter().map(|idx| self.leaves.get(idx).cloned()).collect();
Ok(leaves)
}
fn has_leaves(&self) -> Result<bool, StorageError> {
Ok(!self.leaves.is_empty())
}
fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError> {
Ok(self.subtrees.get(&index).cloned())
}
fn get_subtrees(&self, indices: &[NodeIndex]) -> Result<Vec<Option<Subtree>>, StorageError> {
let subtrees: Vec<_> = indices.iter().map(|idx| self.subtrees.get(idx).cloned()).collect();
Ok(subtrees)
}
fn get_inner_node(&self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError> {
if index.depth() < IN_MEMORY_DEPTH {
return Err(StorageError::Unsupported(
"Cannot get inner node from upper part of the tree".into(),
));
}
let subtree_root_index = Subtree::find_subtree_root(index);
Ok(self
.subtrees
.get(&subtree_root_index)
.and_then(|subtree| subtree.get_inner_node(index)))
}
fn iter_leaves(&self) -> Result<Box<dyn Iterator<Item = (u64, SmtLeaf)> + '_>, StorageError> {
Ok(Box::new(self.leaves.iter().map(|(&k, v)| (k, v.clone()))))
}
fn iter_subtrees(&self) -> Result<Box<dyn Iterator<Item = Subtree> + '_>, StorageError> {
Ok(Box::new(self.subtrees.values().cloned()))
}
fn get_depth24(&self) -> Result<Vec<(u64, Word)>, StorageError> {
let depth24 = self
.subtrees
.values()
.filter(|subtree| subtree.root_index().depth() == IN_MEMORY_DEPTH)
.filter_map(|subtree| {
subtree
.get_inner_node(subtree.root_index())
.map(|node| (subtree.root_index().position(), node.hash()))
})
.collect();
Ok(depth24)
}
}
impl SmtStorage for MemoryStorage {
type Reader = MemoryStorageSnapshot;
fn reader(&self) -> Result<Self::Reader, StorageError> {
Ok(self.clone().into_snapshot())
}
fn insert_value(
&mut self,
index: u64,
key: Word,
value: Word,
) -> Result<Option<Word>, StorageError> {
debug_assert_ne!(value, EMPTY_WORD);
match self.leaves.get_mut(&index) {
Some(leaf) => Ok(leaf.insert(key, value)?),
None => {
self.leaves.insert(index, SmtLeaf::Single((key, value)));
Ok(None)
},
}
}
fn remove_value(&mut self, index: u64, key: Word) -> Result<Option<Word>, StorageError> {
let old_value = match self.leaves.entry(index) {
MapEntry::Occupied(mut entry) => {
let (old_value, is_empty) = entry.get_mut().remove(key);
if is_empty {
entry.remove();
}
old_value
},
MapEntry::Vacant(_) => None,
};
Ok(old_value)
}
fn set_leaves(&mut self, leaves_map: Map<u64, SmtLeaf>) -> Result<(), StorageError> {
self.leaves.extend(leaves_map);
Ok(())
}
fn remove_leaf(&mut self, index: u64) -> Result<Option<SmtLeaf>, StorageError> {
Ok(self.leaves.remove(&index))
}
fn set_subtree(&mut self, subtree: &Subtree) -> Result<(), StorageError> {
self.subtrees.insert(subtree.root_index(), subtree.clone());
Ok(())
}
fn set_subtrees(&mut self, subtrees_vec: Vec<Subtree>) -> Result<(), StorageError> {
self.subtrees
.extend(subtrees_vec.into_iter().map(|subtree| (subtree.root_index(), subtree)));
Ok(())
}
fn remove_subtree(&mut self, index: NodeIndex) -> Result<(), StorageError> {
self.subtrees.remove(&index);
Ok(())
}
fn set_inner_node(
&mut self,
index: NodeIndex,
node: InnerNode,
) -> Result<Option<InnerNode>, StorageError> {
if index.depth() < IN_MEMORY_DEPTH {
return Err(StorageError::Unsupported(
"Cannot set inner node in upper part of the tree".into(),
));
}
let subtree_root_index = Subtree::find_subtree_root(index);
let mut subtree = self
.subtrees
.remove(&subtree_root_index)
.unwrap_or_else(|| Subtree::new(subtree_root_index));
let old_node = subtree.insert_inner_node(index, node);
self.subtrees.insert(subtree_root_index, subtree);
Ok(old_node)
}
fn remove_inner_node(&mut self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError> {
if index.depth() < IN_MEMORY_DEPTH {
return Err(StorageError::Unsupported(
"Cannot remove inner node from upper part of the tree".into(),
));
}
let subtree_root_index = Subtree::find_subtree_root(index);
let inner_node: Option<InnerNode> =
self.subtrees.remove(&subtree_root_index).and_then(|mut subtree| {
let old_node = subtree.remove_inner_node(index);
if !subtree.is_empty() {
self.subtrees.insert(subtree_root_index, subtree);
}
old_node
});
Ok(inner_node)
}
fn apply(&mut self, updates: StorageUpdates) -> Result<(), StorageError> {
let StorageUpdateParts {
leaf_updates,
subtree_updates,
leaf_count_delta: _,
entry_count_delta: _,
} = updates.into_parts();
for (index, leaf_opt) in leaf_updates {
if let Some(leaf) = leaf_opt {
self.leaves.insert(index, leaf);
} else {
self.leaves.remove(&index);
}
}
for update in subtree_updates {
match update {
SubtreeUpdate::Store { index, subtree } => {
self.subtrees.insert(index, subtree);
},
SubtreeUpdate::Delete { index } => {
self.subtrees.remove(&index);
},
}
}
Ok(())
}
}
#[derive(Debug, Clone)]
pub struct MemoryStorageSnapshot(MemoryStorage);
impl SmtStorageReader for MemoryStorageSnapshot {
fn leaf_count(&self) -> Result<usize, StorageError> {
self.0.leaf_count()
}
fn entry_count(&self) -> Result<usize, StorageError> {
self.0.entry_count()
}
fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError> {
self.0.get_leaf(index)
}
fn get_leaves(&self, indices: &[u64]) -> Result<Vec<Option<SmtLeaf>>, StorageError> {
self.0.get_leaves(indices)
}
fn has_leaves(&self) -> Result<bool, StorageError> {
self.0.has_leaves()
}
fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError> {
self.0.get_subtree(index)
}
fn get_subtrees(&self, indices: &[NodeIndex]) -> Result<Vec<Option<Subtree>>, StorageError> {
self.0.get_subtrees(indices)
}
fn get_leaf_and_subtrees(
&self,
leaf_index: u64,
subtree_indices: &[NodeIndex],
) -> Result<(Option<SmtLeaf>, Vec<Option<Subtree>>), StorageError> {
self.0.get_leaf_and_subtrees(leaf_index, subtree_indices)
}
fn get_inner_node(&self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError> {
self.0.get_inner_node(index)
}
fn iter_leaves(&self) -> Result<Box<dyn Iterator<Item = (u64, SmtLeaf)> + '_>, StorageError> {
self.0.iter_leaves()
}
fn iter_subtrees(&self) -> Result<Box<dyn Iterator<Item = Subtree> + '_>, StorageError> {
self.0.iter_subtrees()
}
fn get_depth24(&self) -> Result<Vec<(u64, Word)>, StorageError> {
self.0.get_depth24()
}
}