miden_crypto::merkle

Struct Smt

source
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.

Implementations§

source§

impl Smt

source

pub const EMPTY_VALUE: Word = _

The default value used to compute the hash of empty leaves

source

pub fn new() -> Self

Returns a new Smt.

All leaves in the returned tree are set to Self::EMPTY_VALUE.

source

pub fn with_entries( entries: impl IntoIterator<Item = (RpoDigest, Word)>, ) -> Result<Self, MerkleError>

Returns a new Smt instantiated with leaves set as specified by the provided entries.

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) -> RpoDigest

Returns the root of the tree

source

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

Returns the leaf to which key maps

source

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

Returns the value associated with key

source

pub fn open(&self, key: &RpoDigest) -> 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) -> bool

Returns a boolean value indicating whether the SMT is empty.

source

pub fn leaves(&self) -> impl Iterator<Item = (LeafIndex<SMT_DEPTH>, &SmtLeaf)>

Returns an iterator over the leaves of this Smt.

source

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

Returns an iterator over the key-value pairs of this Smt.

source

pub fn inner_nodes(&self) -> impl Iterator<Item = InnerNodeInfo> + '_

Returns an iterator over the inner nodes of this Smt.

source

pub fn insert(&mut self, key: RpoDigest, value: Word) -> Word

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.

source

pub fn compute_mutations( &self, kv_pairs: impl IntoIterator<Item = (RpoDigest, Word)>, ) -> MutationSet<SMT_DEPTH, RpoDigest, Word>

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 = (RpoDigest::default(), Word::default());
let mutations = smt.compute_mutations(vec![pair]);
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<SMT_DEPTH, RpoDigest, Word>, ) -> Result<(), MerkleError>

Apply 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.

Trait Implementations§

source§

impl Clone for Smt

source§

fn clone(&self) -> Smt

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Smt

source§

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

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

impl Default for Smt

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl Deserializable for Smt

source§

fn read_from<R: ByteReader>( source: &mut R, ) -> Result<Self, DeserializationError>

Reads a sequence of bytes from the provided source, attempts to deserialize these bytes into Self, and returns the result. Read more
source§

fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>

Attempts to deserialize the provided bytes into Self and returns the result. Read more
source§

impl<T: KvMap<RpoDigest, StoreNode>> From<&Smt> for MerkleStore<T>

source§

fn from(value: &Smt) -> Self

Converts to this type from the input type.
source§

impl PartialEq for Smt

source§

fn eq(&self, other: &Smt) -> bool

Tests for self and other values to be equal, and is used by ==.
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 Serializable for Smt

source§

fn write_into<W: ByteWriter>(&self, target: &mut W)

Serializes self into bytes and writes these bytes into the target.
source§

fn get_size_hint(&self) -> usize

Returns an estimate of how many bytes are needed to represent self. Read more
source§

fn to_bytes(&self) -> Vec<u8>

Serializes self into a vector of bytes.
source§

impl Eq for Smt

source§

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> 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> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

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> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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