Struct RevealedSparseTrie

Source
pub struct RevealedSparseTrie<P = DefaultBlindedProvider> { /* private fields */ }
Expand description

The representation of revealed sparse trie.

The revealed sparse trie contains the actual trie structure with nodes, values, and tracking for changes. It supports operations like inserting, updating, and removing nodes.

§Invariants

  • The root node is always present in nodes collection.
  • Each leaf entry in nodes collection must have a corresponding entry in values collection. The opposite is also true.
  • All keys in values collection are full leaf paths.

Implementations§

Source§

impl RevealedSparseTrie

Source

pub fn from_root( root: TrieNode, masks: TrieMasks, retain_updates: bool, ) -> SparseTrieResult<Self>

Creates a new revealed sparse trie from the given root node.

This function initializes the internal structures and then reveals the root. It is a convenient method to create a RevealedSparseTrie when you already have the root node available.

§Returns

A RevealedSparseTrie if successful, or an error if revealing fails.

Source§

impl<P> RevealedSparseTrie<P>

Source

pub fn from_provider_and_root( provider: P, node: TrieNode, masks: TrieMasks, retain_updates: bool, ) -> SparseTrieResult<Self>

Creates a new revealed sparse trie from the given provider and root node.

Similar to from_root, but allows specifying a custom provider for retrieving blinded nodes.

§Returns

A RevealedSparseTrie if successful, or an error if revealing fails.

Source

pub fn with_provider<BP>(self, provider: BP) -> RevealedSparseTrie<BP>

Replaces the current provider with a new provider.

This allows changing how blinded nodes are retrieved without rebuilding the entire trie structure.

§Returns

A new RevealedSparseTrie with the updated provider.

Source

pub fn with_updates(self, retain_updates: bool) -> Self

Configures the trie to retain information about updates.

If retain_updates is true, the trie will record branch node updates and deletions. This information can then be used to efficiently update an external database.

Source

pub fn updates_ref(&self) -> Cow<'_, SparseTrieUpdates>

Returns a reference to the current sparse trie updates.

If no updates have been made/recorded, returns an empty update set.

Source

pub const fn nodes_ref(&self) -> &HashMap<Nibbles, SparseNode>

Returns an immutable reference to all nodes in the sparse trie.

Source

pub fn get_leaf_value(&self, path: &Nibbles) -> Option<&Vec<u8>>

Retrieves a reference to the leaf value stored at the given key path, if it is revealed.

This method efficiently retrieves values from the trie without traversing the entire node structure, as values are stored in a separate map.

Note: a value can exist in the full trie and this function still returns None because the value has not been revealed. Hence a None indicates two possibilities:

  • The value does not exists in the trie, so it cannot be revealed
  • The value has not yet been revealed. In order to determine which is true, one would need an exclusion proof.
Source

pub fn take_updates(&mut self) -> SparseTrieUpdates

Consumes and returns the currently accumulated trie updates.

This is useful when you want to apply the updates to an external database, and then start tracking a new set of updates.

Source

pub fn reserve_nodes(&mut self, additional: usize)

Reserves capacity in the nodes map for at least additional more nodes.

Source

pub fn reveal_node( &mut self, path: Nibbles, node: TrieNode, masks: TrieMasks, ) -> SparseTrieResult<()>

Reveals a trie node if it has not been revealed before.

This internal function decodes a trie node and inserts it into the nodes map. It handles different node types (leaf, extension, branch) by appropriately adding them to the trie structure and recursively revealing their children.

§Returns

Ok(()) if successful, or an error if node was not revealed.

Source

pub fn wipe(&mut self)

Removes all nodes and values from the trie, resetting it to a blank state with only an empty root node.

Note: All previously tracked changes to the trie are also removed.

Source

pub fn root(&mut self) -> B256

Calculates and returns the root hash of the trie.

Before computing the hash, this function processes any remaining (dirty) nodes by updating their RLP encodings. The root hash is either:

  1. The cached hash (if no dirty nodes were found)
  2. The keccak256 hash of the root node’s RLP representation
Source

pub fn update_rlp_node_level(&mut self, depth: usize)

Recalculates and updates the RLP hashes of nodes deeper than or equal to the specified depth.

The root node is considered to be at level 0. This method is useful for optimizing hash recalculations after localized changes to the trie structure:

This function identifies all nodes that have changed (based on the prefix set) at the given depth and recalculates their RLP representation.

Source

pub fn rlp_node_allocate(&mut self, prefix_set: &mut PrefixSet) -> RlpNode

Look up or calculate the RLP of the node at the root path.

§Panics

If the node at provided path does not exist.

Source

pub fn rlp_node( &mut self, prefix_set: &mut PrefixSet, buffers: &mut RlpNodeBuffers, rlp_buf: &mut Vec<u8>, ) -> RlpNode

Looks up or computes the RLP encoding of the node specified by the current path in the provided buffers.

The function uses a stack (RlpNodeBuffers::path_stack) to track the traversal and accumulate RLP encodings.

§Parameters
  • prefix_set: The set of trie paths that need their nodes updated.
  • buffers: The reusable buffers for stack management and temporary RLP values.
§Panics

If the node at provided path does not exist.

Source§

impl<P: BlindedProvider> RevealedSparseTrie<P>

Source

pub fn clear(&mut self)

This clears all data structures in the sparse trie, keeping the backing data structures allocated.

This is useful for reusing the trie without needing to reallocate memory.

Source

pub fn find_leaf( &self, path: &Nibbles, expected_value: Option<&Vec<u8>>, ) -> Result<LeafLookup, LeafLookupError>

Attempts to find a leaf node at the specified path.

This method traverses the trie from the root down to the given path, checking if a leaf exists at that path. It can be used to verify the existence of a leaf or to generate an exclusion proof (proof that a leaf does not exist).

§Parameters
  • path: The path to search for.
  • expected_value: Optional expected value. If provided, will verify the leaf value matches.
§Returns
  • Ok(LeafLookup::Exists) if the leaf exists with the expected value.
  • Ok(LeafLookup::NonExistent) if the leaf definitely does not exist (exclusion proof).
  • Err(LeafLookupError) if the search encountered a blinded node or found a different value.
Source

pub fn update_leaf( &mut self, path: Nibbles, value: Vec<u8>, is_private: bool, ) -> SparseTrieResult<()>

Updates or inserts a leaf node at the specified key path with the provided RLP-encoded value.

This method updates the internal prefix set and, if the leaf did not previously exist, adjusts the trie structure by inserting new leaf nodes, splitting branch nodes, or collapsing extension nodes as needed.

§Returns

Returns Ok(()) if the update is successful.

Note: If an update requires revealing a blinded node, an error is returned if the blinded provider returns an error.

Source

pub fn remove_leaf(&mut self, path: &Nibbles) -> SparseTrieResult<()>

Removes a leaf node from the trie at the specified key path.

This function removes the leaf value from the internal values map and then traverses the trie to remove or adjust intermediate nodes, merging or collapsing them as necessary.

§Returns

Returns Ok(()) if the leaf is successfully removed, otherwise returns an error if the leaf is not present or if a blinded node prevents removal.

Trait Implementations§

Source§

impl<P: Clone> Clone for RevealedSparseTrie<P>

Source§

fn clone(&self) -> RevealedSparseTrie<P>

Returns a duplicate 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<P> Debug for RevealedSparseTrie<P>

Source§

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

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

impl Default for RevealedSparseTrie

Source§

fn default() -> Self

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

impl<P: BlindedProvider> Display for RevealedSparseTrie<P>

Source§

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

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

impl<P: PartialEq> PartialEq for RevealedSparseTrie<P>

Source§

fn eq(&self, other: &RevealedSparseTrie<P>) -> 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<P: Eq> Eq for RevealedSparseTrie<P>

Source§

impl<P> StructuralPartialEq for RevealedSparseTrie<P>

Auto Trait Implementations§

§

impl<P> Freeze for RevealedSparseTrie<P>
where P: Freeze,

§

impl<P> RefUnwindSafe for RevealedSparseTrie<P>
where P: RefUnwindSafe,

§

impl<P> Send for RevealedSparseTrie<P>
where P: Send,

§

impl<P> Sync for RevealedSparseTrie<P>
where P: Sync,

§

impl<P> Unpin for RevealedSparseTrie<P>
where P: Unpin,

§

impl<P> UnwindSafe for RevealedSparseTrie<P>
where P: 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

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

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

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

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<TxEnv, T> FromRecoveredTx<&T> for TxEnv
where TxEnv: FromRecoveredTx<T>,

§

fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv

Builds a TxEnv from a transaction and a sender address.
§

impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnv
where TxEnv: FromTxWithEncoded<T>,

§

fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv

Builds a TxEnv from a transaction, its sender, and encoded transaction bytes.
§

impl<T> Instrument for T

§

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

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

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
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

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
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeDebug for T
where T: Debug,

§

impl<T> MaybeSend for T
where T: Send,

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.