use alloc::{boxed::Box, vec::Vec};
use core::{
fmt,
ops::{Deref, DerefMut},
};
use crate::{
Word,
merkle::{
NodeIndex,
smt::{InnerNode, Map, SmtLeaf, large::subtree::Subtree},
},
};
mod error;
pub use error::{StorageError, StorageResult};
#[cfg(feature = "rocksdb")]
mod rocksdb;
#[cfg(feature = "rocksdb")]
pub use rocksdb::{
RocksDbBloomFilterBitsPerKey, RocksDbConfig, RocksDbDurabilityMode, RocksDbMemoryBudget,
RocksDbSnapshotStorage, RocksDbStorage, RocksDbTuningOptions, RocksDbWriteBufferManagerBudget,
};
mod memory;
pub use memory::{MemoryStorage, MemoryStorageSnapshot};
mod updates;
pub use updates::{StorageUpdateParts, StorageUpdates, SubtreeUpdate};
pub type BoxedFallibleLeafIterator<'a> =
Box<dyn Iterator<Item = StorageResult<(u64, SmtLeaf)>> + 'a>;
pub trait SmtStorageReader: 'static + fmt::Debug + Send + Sync {
fn leaf_count(&self) -> StorageResult<usize>;
fn entry_count(&self) -> StorageResult<usize>;
fn get_leaf(&self, index: u64) -> StorageResult<Option<SmtLeaf>>;
fn get_leaves(&self, indices: &[u64]) -> StorageResult<Vec<Option<SmtLeaf>>>;
fn has_leaves(&self) -> StorageResult<bool>;
fn get_subtree(&self, index: NodeIndex) -> StorageResult<Option<Subtree>>;
fn get_subtrees(&self, indices: &[NodeIndex]) -> StorageResult<Vec<Option<Subtree>>>;
fn get_leaf_and_subtrees(
&self,
leaf_index: u64,
subtree_indices: &[NodeIndex],
) -> StorageResult<(Option<SmtLeaf>, Vec<Option<Subtree>>)> {
let leaf = self.get_leaf(leaf_index)?;
let subtrees = subtree_indices
.iter()
.map(|&idx| self.get_subtree(idx))
.collect::<Result<Vec<_>, _>>()?;
Ok((leaf, subtrees))
}
fn get_inner_node(&self, index: NodeIndex) -> StorageResult<Option<InnerNode>>;
fn iter_leaves(&self) -> StorageResult<BoxedFallibleLeafIterator<'_>>;
fn iter_subtrees(&self)
-> StorageResult<Box<dyn Iterator<Item = StorageResult<Subtree>> + '_>>;
fn get_top_subtree_roots(&self) -> StorageResult<Vec<(u64, Word)>>;
}
impl<T: SmtStorageReader + ?Sized> SmtStorageReader for Box<T> {
#[inline]
fn leaf_count(&self) -> StorageResult<usize> {
self.deref().leaf_count()
}
#[inline]
fn entry_count(&self) -> StorageResult<usize> {
self.deref().entry_count()
}
#[inline]
fn get_leaf(&self, index: u64) -> StorageResult<Option<SmtLeaf>> {
self.deref().get_leaf(index)
}
#[inline]
fn get_leaves(&self, indices: &[u64]) -> StorageResult<Vec<Option<SmtLeaf>>> {
self.deref().get_leaves(indices)
}
#[inline]
fn has_leaves(&self) -> StorageResult<bool> {
self.deref().has_leaves()
}
#[inline]
fn get_subtree(&self, index: NodeIndex) -> StorageResult<Option<Subtree>> {
self.deref().get_subtree(index)
}
#[inline]
fn get_subtrees(&self, indices: &[NodeIndex]) -> StorageResult<Vec<Option<Subtree>>> {
self.deref().get_subtrees(indices)
}
#[inline]
fn get_leaf_and_subtrees(
&self,
leaf_index: u64,
subtree_indices: &[NodeIndex],
) -> StorageResult<(Option<SmtLeaf>, Vec<Option<Subtree>>)> {
self.deref().get_leaf_and_subtrees(leaf_index, subtree_indices)
}
#[inline]
fn get_inner_node(&self, index: NodeIndex) -> StorageResult<Option<InnerNode>> {
self.deref().get_inner_node(index)
}
#[inline]
fn iter_leaves(&self) -> StorageResult<BoxedFallibleLeafIterator<'_>> {
self.deref().iter_leaves()
}
#[inline]
fn iter_subtrees(
&self,
) -> StorageResult<Box<dyn Iterator<Item = StorageResult<Subtree>> + '_>> {
self.deref().iter_subtrees()
}
#[inline]
fn get_top_subtree_roots(&self) -> StorageResult<Vec<(u64, Word)>> {
self.deref().get_top_subtree_roots()
}
}
pub trait SmtStorage: SmtStorageReader {
type Reader: SmtStorageReader;
fn reader(&self) -> StorageResult<Self::Reader>;
fn insert_value(&mut self, index: u64, key: Word, value: Word) -> StorageResult<Option<Word>>;
fn remove_value(&mut self, index: u64, key: Word) -> StorageResult<Option<Word>>;
fn set_leaves(&mut self, leaves: Map<u64, SmtLeaf>) -> StorageResult<()>;
fn remove_leaf(&mut self, index: u64) -> StorageResult<Option<SmtLeaf>>;
fn set_subtree(&mut self, subtree: &Subtree) -> StorageResult<()>;
fn set_subtrees(&mut self, subtrees: Vec<Subtree>) -> StorageResult<()>;
fn remove_subtree(&mut self, index: NodeIndex) -> StorageResult<()>;
fn set_inner_node(
&mut self,
index: NodeIndex,
node: InnerNode,
) -> StorageResult<Option<InnerNode>>;
fn remove_inner_node(&mut self, index: NodeIndex) -> StorageResult<Option<InnerNode>>;
fn apply(&mut self, updates: StorageUpdates) -> StorageResult<()>;
}
impl<T: SmtStorage + ?Sized> SmtStorage for Box<T> {
type Reader = T::Reader;
#[inline]
fn reader(&self) -> StorageResult<Self::Reader> {
self.deref().reader()
}
#[inline]
fn insert_value(&mut self, index: u64, key: Word, value: Word) -> StorageResult<Option<Word>> {
self.deref_mut().insert_value(index, key, value)
}
#[inline]
fn remove_value(&mut self, index: u64, key: Word) -> StorageResult<Option<Word>> {
self.deref_mut().remove_value(index, key)
}
#[inline]
fn set_leaves(&mut self, leaves: Map<u64, SmtLeaf>) -> StorageResult<()> {
self.deref_mut().set_leaves(leaves)
}
#[inline]
fn remove_leaf(&mut self, index: u64) -> StorageResult<Option<SmtLeaf>> {
self.deref_mut().remove_leaf(index)
}
#[inline]
fn set_subtree(&mut self, subtree: &Subtree) -> StorageResult<()> {
self.deref_mut().set_subtree(subtree)
}
#[inline]
fn set_subtrees(&mut self, subtrees: Vec<Subtree>) -> StorageResult<()> {
self.deref_mut().set_subtrees(subtrees)
}
#[inline]
fn remove_subtree(&mut self, index: NodeIndex) -> StorageResult<()> {
self.deref_mut().remove_subtree(index)
}
#[inline]
fn set_inner_node(
&mut self,
index: NodeIndex,
node: InnerNode,
) -> StorageResult<Option<InnerNode>> {
self.deref_mut().set_inner_node(index, node)
}
#[inline]
fn remove_inner_node(&mut self, index: NodeIndex) -> StorageResult<Option<InnerNode>> {
self.deref_mut().remove_inner_node(index)
}
#[inline]
fn apply(&mut self, updates: StorageUpdates) -> StorageResult<()> {
self.deref_mut().apply(updates)
}
}