pub struct Smt { /* private fields */ }Expand description
Sparse Merkle tree mapping 256-bit keys to 256-bit values. Both keys and values are represented by 4 field elements.
All leaves sit at depth 64. The most significant element of the key is used to identify the leaf to which the key maps.
A leaf is either empty, or holds one or more key-value pairs. An empty leaf hashes to the empty word. Otherwise, a leaf hashes to the hash of its key-value pairs, ordered by key first, value second.
depth
T 0 Root
│ . / \
│ 1 left right
│ . / \ / \
│
│ .. .. .. .. .. .. .. ..
│
│ 63
│ / \ / \ \
│ ↓ / \ / \ \
│ 64 Leaf₀ Leaf₁ Leaf₂ Leaf₃ ... Leaf₂⁶⁴₋₂³²
0x0..0 0x0..1 0x0..2 0x0..3 0xFFFFFFFF00000000
The digest is 256 bits, or 4 field elements:
[elem₀, elem₁, elem₂, elem₃]
↑
Most significant element determines leaf
index, mapping into the actual Leaf lookup
table where the values are stored.
Zooming into a leaf, i.e. Leaf₁:
┌─────────────────────────────────────────────────┐
│ Leaf₁ (index: 0x0..1) │
├─────────────────────────────────────────────────┤
│ Possible states: │
│ │
│ 1. Empty leaf: │
│ └─ hash = EMPTY_WORD │
│ │
│ 2. Single entry: │
│ └─ (key₁, value₁) │
│ └─ hash = H(key₁, value₁) │
│ │
│ 3. Multiple entries: │
│ └─ (key₁, value₁) │
│ └─ (key₂, value₂) │
│ └─ ... │
│ └─ hash = H(key₁, value₁, key₂, value₂, ...) │
└─────────────────────────────────────────────────┘
Leaf states:
- Empty: hashes to EMPTY_WORD
- Non-empty: contains (key, value) pairs
hash = H(key₁, value₁, key₂, value₂, ...)Implementations§
Source§impl Smt
impl Smt
Sourcepub const EMPTY_VALUE: Word
pub const EMPTY_VALUE: Word
The default value used to compute the hash of empty leaves
Sourcepub fn new() -> Smt
pub fn new() -> Smt
Returns a new Smt.
All leaves in the returned tree are set to Self::EMPTY_VALUE.
Sourcepub fn with_entries(
entries: impl IntoIterator<Item = (Word, Word)>,
) -> Result<Smt, MerkleError>
pub fn with_entries( entries: impl IntoIterator<Item = (Word, Word)>, ) -> Result<Smt, MerkleError>
Returns a new Smt instantiated with leaves set as specified by the provided entries.
If the concurrent feature is enabled, this function uses a parallel implementation to
process the entries efficiently, otherwise it defaults to the sequential implementation.
All leaves omitted from the entries list are set to Self::EMPTY_VALUE.
§Errors
Returns an error if:
- the provided entries contain multiple values for the same key.
- inserting a key-value pair would exceed
MAX_LEAF_ENTRIES(1024 entries) in a leaf.
Sourcepub fn with_sorted_entries(
entries: impl IntoIterator<Item = (Word, Word)>,
) -> Result<Smt, MerkleError>
pub fn with_sorted_entries( entries: impl IntoIterator<Item = (Word, Word)>, ) -> Result<Smt, MerkleError>
Similar to with_entries but avoids the overhead of sorting if the entries are already
sorted.
This only applies if the “concurrent” feature is enabled. Without the feature, the behavior
is equivalent to with_entiries.
§Errors
Returns an error if inserting a key-value pair would exceed MAX_LEAF_ENTRIES (1024
entries) in a leaf.
Sourcepub fn from_raw_parts(
inner_nodes: BTreeMap<NodeIndex, InnerNode>,
leaves: BTreeMap<u64, SmtLeaf>,
root: Word,
) -> Smt
pub fn from_raw_parts( inner_nodes: BTreeMap<NodeIndex, InnerNode>, leaves: BTreeMap<u64, SmtLeaf>, root: Word, ) -> Smt
Returns a new Smt instantiated from already computed leaves and nodes.
This function performs minimal consistency checking. It is the caller’s responsibility to ensure the passed arguments are correct and consistent with each other.
§Panics
With debug assertions on, this function panics if root does not match the root node in
inner_nodes.
Sourcepub fn num_leaves(&self) -> usize
pub fn num_leaves(&self) -> usize
Returns the number of non-empty leaves in this tree.
Note that this may return a different value from Self::num_entries() as a single leaf may contain more than one key-value pair.
Sourcepub fn num_entries(&self) -> usize
pub fn num_entries(&self) -> usize
Returns the number of key-value pairs with non-default values in this tree.
Note that this may return a different value from Self::num_leaves() as a single leaf may contain more than one key-value pair.
Sourcepub fn open(&self, key: &Word) -> SmtProof
pub fn open(&self, key: &Word) -> SmtProof
Returns an opening of the leaf associated with key. Conceptually, an opening is a Merkle
path to the leaf, as well as the leaf itself.
Sourcepub fn leaves(
&self,
) -> impl Iterator<Item = (LeafIndex<miden_crypto::::merkle::smt::full::{impl#0}::leaves::{constant#0}>, &SmtLeaf)>
pub fn leaves( &self, ) -> impl Iterator<Item = (LeafIndex<miden_crypto::::merkle::smt::full::{impl#0}::leaves::{constant#0}>, &SmtLeaf)>
Returns an iterator over the leaves of this Smt in arbitrary order.
Sourcepub fn entries(&self) -> impl Iterator<Item = &(Word, Word)>
pub fn entries(&self) -> impl Iterator<Item = &(Word, Word)>
Returns an iterator over the key-value pairs of this Smt in arbitrary order.
Sourcepub fn inner_nodes(&self) -> impl Iterator<Item = InnerNodeInfo>
pub fn inner_nodes(&self) -> impl Iterator<Item = InnerNodeInfo>
Returns an iterator over the inner nodes of this Smt.
Sourcepub fn inner_node_indices(&self) -> impl Iterator<Item = (NodeIndex, InnerNode)>
pub fn inner_node_indices(&self) -> impl Iterator<Item = (NodeIndex, InnerNode)>
Sourcepub fn insert(&mut self, key: Word, value: Word) -> Result<Word, MerkleError>
pub fn insert(&mut self, key: Word, value: Word) -> Result<Word, MerkleError>
Inserts a value at the specified key, returning the previous value associated with that key.
Recall that by definition, any key that hasn’t been updated is associated with
Self::EMPTY_VALUE.
This also recomputes all hashes between the leaf (associated with the key) and the root, updating the root itself.
§Errors
Returns an error if inserting the key-value pair would exceed MAX_LEAF_ENTRIES (1024
entries) in the leaf.
Sourcepub fn compute_mutations(
&self,
kv_pairs: impl IntoIterator<Item = (Word, Word)>,
) -> Result<MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::compute_mutations::{constant#1}, Word, Word>, MerkleError>
pub fn compute_mutations( &self, kv_pairs: impl IntoIterator<Item = (Word, Word)>, ) -> Result<MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::compute_mutations::{constant#1}, Word, Word>, MerkleError>
Computes what changes are necessary to insert the specified key-value pairs into this Merkle tree, allowing for validation before applying those changes.
This method returns a MutationSet, which contains all the information for inserting
kv_pairs into this Merkle tree already calculated, including the new root hash, which can
be queried with MutationSet::root(). Once a mutation set is returned,
Smt::apply_mutations() can be called in order to commit these changes to the Merkle
tree, or drop() to discard them.
§Example
let mut smt = Smt::new();
let pair = (Word::default(), Word::default());
let mutations = smt.compute_mutations(vec![pair]).unwrap();
assert_eq!(mutations.root(), *EmptySubtreeRoots::entry(SMT_DEPTH, 0));
smt.apply_mutations(mutations).unwrap();
assert_eq!(smt.root(), *EmptySubtreeRoots::entry(SMT_DEPTH, 0));Sourcepub fn apply_mutations(
&mut self,
mutations: MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::apply_mutations::{constant#1}, Word, Word>,
) -> Result<(), MerkleError>
pub fn apply_mutations( &mut self, mutations: MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::apply_mutations::{constant#1}, Word, Word>, ) -> Result<(), MerkleError>
Applies the prospective mutations computed with Smt::compute_mutations() to this tree.
§Errors
If mutations was computed on a tree with a different root than this one, returns
MerkleError::ConflictingRoots with a two-item Vec. The first item is the root hash
the mutations were computed against, and the second item is the actual current root of
this tree.
Sourcepub fn apply_mutations_with_reversion(
&mut self,
mutations: MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::apply_mutations_with_reversion::{constant#1}, Word, Word>,
) -> Result<MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::apply_mutations_with_reversion::{constant#2}, Word, Word>, MerkleError>
pub fn apply_mutations_with_reversion( &mut self, mutations: MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::apply_mutations_with_reversion::{constant#1}, Word, Word>, ) -> Result<MutationSet<miden_crypto::::merkle::smt::full::{impl#0}::apply_mutations_with_reversion::{constant#2}, Word, Word>, MerkleError>
Applies the prospective mutations computed with Smt::compute_mutations() to this tree
and returns the reverse mutation set.
Applying the reverse mutation sets to the updated tree will revert the changes.
§Errors
If mutations was computed on a tree with a different root than this one, returns
MerkleError::ConflictingRoots with a two-item Vec. The first item is the root hash
the mutations were computed against, and the second item is the actual current root of
this tree.
Trait Implementations§
Source§impl Deserializable for Smt
impl Deserializable for Smt
Source§fn read_from<R>(source: &mut R) -> Result<Smt, DeserializationError>where
R: ByteReader,
fn read_from<R>(source: &mut R) -> Result<Smt, DeserializationError>where
R: ByteReader,
source, attempts to deserialize these bytes
into Self, and returns the result. Read moreSource§fn min_serialized_size() -> usize
fn min_serialized_size() -> usize
Source§fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
Source§fn read_from_bytes_with_budget(
bytes: &[u8],
budget: usize,
) -> Result<Self, DeserializationError>
fn read_from_bytes_with_budget( bytes: &[u8], budget: usize, ) -> Result<Self, DeserializationError>
Self from bytes with a byte budget limit. Read moreSource§impl<'de> Deserialize<'de> for Smt
impl<'de> Deserialize<'de> for Smt
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Smt, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Smt, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl From<&Smt> for MerkleStore
impl From<&Smt> for MerkleStore
Source§fn from(value: &Smt) -> MerkleStore
fn from(value: &Smt) -> MerkleStore
Source§impl Serializable for Smt
impl Serializable for Smt
Source§fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
self into bytes and writes these bytes into the target.Source§fn get_size_hint(&self) -> usize
fn get_size_hint(&self) -> usize
Source§impl Serialize for Smt
impl Serialize for Smt
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Eq for Smt
impl StructuralPartialEq for Smt
Auto Trait Implementations§
impl Freeze for Smt
impl RefUnwindSafe for Smt
impl Send for Smt
impl Sync for Smt
impl Unpin for Smt
impl UnwindSafe for Smt
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more