LargeSmt

Struct LargeSmt 

Source
pub struct LargeSmt<S>
where S: SmtStorage,
{ /* private fields */ }
Expand description

A large-scale Sparse Merkle tree mapping 256-bit keys to 256-bit values, backed by pluggable storage. Both keys and values are represented by 4 field elements.

Unlike the regular Smt, this implementation is designed for very large trees by using external storage (such as RocksDB) for the bulk of the tree data, while keeping only the upper levels (up to depth 24) in memory. This hybrid approach allows the tree to scale beyond memory limitations while maintaining good performance for common operations.

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.

The tree structure:

  • Depths 0-23: Stored in memory as a flat array for fast access
  • Depths 24-64: Stored in external storage organized as subtrees for efficient batch operations

Implementations§

Source§

impl<S> LargeSmt<S>
where S: SmtStorage,

Source

pub const EMPTY_VALUE: Word

The default value used to compute the hash of empty leaves.

Source

pub const SUBTREE_DEPTHS: [u8; 5]

Subtree depths for the subtrees stored in storage.

Source

pub fn new(storage: S) -> Result<LargeSmt<S>, LargeSmtError>

Returns a new LargeSmt backed by the provided storage.

The SMT’s root is fetched from the storage backend. If the storage is empty the SMT is initialized with the root of an empty tree. Otherwise, materializes in-memory nodes from the top subtrees.

§Errors

Returns an error if fetching the root or initial in-memory nodes from the storage fails.

Source

pub fn with_entries( storage: S, entries: impl IntoIterator<Item = (Word, Word)>, ) -> Result<LargeSmt<S>, LargeSmtError>

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.

Source

pub const fn depth(&self) -> u8

Returns the depth of the tree

Source

pub fn root(&self) -> Result<Word, LargeSmtError>

Returns the root of the tree

Source

pub fn num_leaves(&self) -> Result<usize, LargeSmtError>

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.

§Errors

Returns an error if there is a storage error when retrieving the leaf count.

Source

pub fn num_entries(&self) -> Result<usize, LargeSmtError>

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.

Also note that this is currently an expensive operation is counting the number of entries requires iterating over all leaves of the tree.

§Errors

Returns an error if there is a storage error when retrieving the entry count.

Source

pub fn get_leaf(&self, key: &Word) -> SmtLeaf

Returns the leaf to which key maps

Source

pub fn get_value(&self, key: &Word) -> Word

Returns the value associated with key

Source

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.

Source

pub fn is_empty(&self) -> Result<bool, LargeSmtError>

Returns a boolean value indicating whether the SMT is empty.

§Errors

Returns an error if there is a storage error when retrieving the root or leaf count.

Source

pub fn leaves( &self, ) -> Result<impl Iterator<Item = (LeafIndex<miden_crypto::::merkle::smt::large::{impl#0}::leaves::{constant#0}>, SmtLeaf)>, LargeSmtError>

Returns an iterator over the leaves of this Smt. Note: This iterator returns owned SmtLeaf values.

§Errors

Returns an error if the storage backend fails to create the iterator.

Source

pub fn entries( &self, ) -> Result<impl Iterator<Item = (Word, Word)>, LargeSmtError>

Returns an iterator over the key-value pairs of this Smt. Note: This iterator returns owned (Word, Word) tuples.

§Errors

Returns an error if the storage backend fails to create the iterator.

Source

pub fn inner_nodes( &self, ) -> Result<impl Iterator<Item = InnerNodeInfo>, LargeSmtError>

Returns an iterator over the inner nodes of this Smt.

§Errors

Returns an error if the storage backend fails during iteration setup.

Source

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.

Source

pub fn compute_mutations( &self, kv_pairs: impl IntoIterator<Item = (Word, Word)>, ) -> Result<MutationSet<miden_crypto::::merkle::smt::large::{impl#0}::compute_mutations::{constant#0}, Word, Word>, LargeSmtError>
where LargeSmt<S>: Sized + Sync,

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]).expect("compute_mutations ok");
assert_eq!(mutations.root(), *EmptySubtreeRoots::entry(SMT_DEPTH, 0));
smt.apply_mutations(mutations);
assert_eq!(smt.root(), *EmptySubtreeRoots::entry(SMT_DEPTH, 0));
Source

pub fn apply_mutations( &mut self, mutations: MutationSet<miden_crypto::::merkle::smt::large::{impl#0}::apply_mutations::{constant#0}, Word, Word>, ) -> Result<(), LargeSmtError>

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.

Source

pub fn apply_mutations_with_reversion( &mut self, mutations: MutationSet<miden_crypto::::merkle::smt::large::{impl#0}::apply_mutations_with_reversion::{constant#0}, Word, Word>, ) -> Result<MutationSet<miden_crypto::::merkle::smt::large::{impl#0}::apply_mutations_with_reversion::{constant#1}, Word, Word>, LargeSmtError>
where LargeSmt<S>: Sized,

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<Backend> AccountTreeBackend for LargeSmt<Backend>
where Backend: SmtStorage,

Available on crate feature std only.
Source§

type Error = MerkleError

Source§

fn num_leaves(&self) -> usize

Returns the number of leaves in the SMT.
Source§

fn leaves<'a>( &'a self, ) -> Box<dyn Iterator<Item = (LeafIndex<SMT_DEPTH>, SmtLeaf)> + 'a>

Returns all leaves in the SMT as an iterator over leaf index and leaf pairs.
Source§

fn open(&self, key: &Word) -> SmtProof

Opens the leaf at the given key, returning a Merkle proof.
Source§

fn apply_mutations( &mut self, set: MutationSet<SMT_DEPTH, Word, Word>, ) -> Result<(), Self::Error>

Applies the given mutation set to the SMT.
Source§

fn apply_mutations_with_reversion( &mut self, set: MutationSet<SMT_DEPTH, Word, Word>, ) -> Result<MutationSet<SMT_DEPTH, Word, Word>, Self::Error>

Applies the given mutation set to the SMT and returns the reverse mutation set. Read more
Source§

fn compute_mutations( &self, updates: Vec<(Word, Word)>, ) -> Result<MutationSet<SMT_DEPTH, Word, Word>, Self::Error>

Computes the mutation set required to apply the given updates to the SMT.
Source§

fn insert(&mut self, key: Word, value: Word) -> Result<Word, Self::Error>

Inserts a key-value pair into the SMT, returning the previous value at that key.
Source§

fn get_value(&self, key: &Word) -> Word

Returns the value associated with the given key.
Source§

fn get_leaf(&self, key: &Word) -> SmtLeaf

Returns the leaf at the given key.
Source§

fn root(&self) -> Word

Returns the root of the SMT.
Source§

impl<S> Debug for LargeSmt<S>
where S: Debug + SmtStorage,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<S> PartialEq for LargeSmt<S>
where S: SmtStorage,

Source§

fn eq(&self, other: &LargeSmt<S>) -> bool

Compares two LargeSmt instances based on their root hash and metadata.

Note: This comparison only checks the root hash and counts, not the underlying storage contents. Two SMTs with the same root should be cryptographically equivalent, but this doesn’t verify the storage backends are identical.

1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<S> Eq for LargeSmt<S>
where S: SmtStorage,

Auto Trait Implementations§

§

impl<S> Freeze for LargeSmt<S>
where S: Freeze,

§

impl<S> RefUnwindSafe for LargeSmt<S>
where S: RefUnwindSafe,

§

impl<S> Send for LargeSmt<S>

§

impl<S> Sync for LargeSmt<S>

§

impl<S> Unpin for LargeSmt<S>
where S: Unpin,

§

impl<S> UnwindSafe for LargeSmt<S>
where S: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more