pub enum SparseTrie<P = DefaultBlindedProvider> {
Blind,
Revealed(Box<RevealedSparseTrie<P>>),
}
Expand description
A sparse trie that is either in a “blind” state (no nodes are revealed, root node hash is unknown) or in a “revealed” state (root node has been revealed and the trie can be updated).
In blind mode the trie does not contain any decoded node data, which saves memory but prevents direct access to node contents. The revealed mode stores decoded nodes along with additional information such as values, allowing direct manipulation.
The sparse trie design is optimised for:
- Memory efficiency - only revealed nodes are loaded into memory
- Update tracking - changes to the trie structure can be tracked and selectively persisted
- Incremental operations - nodes can be revealed as needed without loading the entire trie. This is what gives rise to the notion of a “sparse” trie.
Variants§
Blind
The trie is blind – no nodes have been revealed
This is the default state. In this state, the trie cannot be directly queried or modified until nodes are revealed.
Revealed(Box<RevealedSparseTrie<P>>)
Some nodes in the Trie have been revealed.
In this state, the trie can be queried and modified for the parts that have been revealed. Other parts remain blind and require revealing before they can be accessed.
Implementations§
Source§impl SparseTrie
impl SparseTrie
Sourcepub const fn blind() -> Self
pub const fn blind() -> Self
Creates a new blind sparse trie.
§Examples
use reth_trie_sparse::{blinded::DefaultBlindedProvider, SparseTrie};
let trie: SparseTrie<DefaultBlindedProvider> = SparseTrie::blind();
assert!(trie.is_blind());
let trie: SparseTrie<DefaultBlindedProvider> = SparseTrie::default();
assert!(trie.is_blind());
Sourcepub fn revealed_empty() -> Self
pub fn revealed_empty() -> Self
Creates a new revealed but empty sparse trie with SparseNode::Empty
as root node.
§Examples
use reth_trie_sparse::{blinded::DefaultBlindedProvider, SparseTrie};
let trie: SparseTrie<DefaultBlindedProvider> = SparseTrie::revealed_empty();
assert!(!trie.is_blind());
Sourcepub fn reveal_root(
&mut self,
root: TrieNode,
masks: TrieMasks,
retain_updates: bool,
) -> SparseTrieResult<&mut RevealedSparseTrie>
pub fn reveal_root( &mut self, root: TrieNode, masks: TrieMasks, retain_updates: bool, ) -> SparseTrieResult<&mut RevealedSparseTrie>
Reveals the root node, converting a blind trie into a revealed one.
If the trie is blinded, its root node is replaced with root
.
The masks
are used to determine how the node’s children are stored.
The retain_updates
flag controls whether changes to the trie structure
should be tracked.
§Returns
A mutable reference to the underlying RevealedSparseTrie
.
Source§impl<P> SparseTrie<P>
impl<P> SparseTrie<P>
Sourcepub const fn as_revealed_ref(&self) -> Option<&RevealedSparseTrie<P>>
pub const fn as_revealed_ref(&self) -> Option<&RevealedSparseTrie<P>>
Returns an immutable reference to the underlying revealed sparse trie.
Returns None
if the trie is blinded.
Sourcepub fn as_revealed_mut(&mut self) -> Option<&mut RevealedSparseTrie<P>>
pub fn as_revealed_mut(&mut self) -> Option<&mut RevealedSparseTrie<P>>
Returns a mutable reference to the underlying revealed sparse trie.
Returns None
if the trie is blinded.
Sourcepub fn reveal_root_with_provider(
&mut self,
provider: P,
root: TrieNode,
masks: TrieMasks,
retain_updates: bool,
) -> SparseTrieResult<&mut RevealedSparseTrie<P>>
pub fn reveal_root_with_provider( &mut self, provider: P, root: TrieNode, masks: TrieMasks, retain_updates: bool, ) -> SparseTrieResult<&mut RevealedSparseTrie<P>>
Reveals the root node using a specified provider.
This function is similar to Self::reveal_root
but allows the caller to provide
a custom provider for fetching blinded nodes.
§Returns
Mutable reference to RevealedSparseTrie
.
Sourcepub fn wipe(&mut self) -> SparseTrieResult<()>
pub fn wipe(&mut self) -> SparseTrieResult<()>
Wipes the trie by removing all nodes and values, and resetting the trie to only contain an empty root node.
Note: This method will error if the trie is blinded.
Sourcepub fn root(&mut self) -> Option<B256>
pub fn root(&mut self) -> Option<B256>
Calculates the root hash of the trie.
This will update any remaining dirty nodes before computing the root hash. “dirty” nodes are nodes that need their hashes to be recomputed because one or more of their children’s hashes have changed.
§Returns
Some(B256)
with the calculated root hash if the trie is revealed.None
if the trie is still blind.
Sourcepub fn root_with_updates(&mut self) -> Option<(B256, SparseTrieUpdates)>
pub fn root_with_updates(&mut self) -> Option<(B256, SparseTrieUpdates)>
Returns the root hash along with any accumulated update information.
This is useful for when you need both the root hash and information about what nodes were modified, which can be used to efficiently update an external database.
§Returns
An Option
tuple consisting of:
- The trie root hash (
B256
). - A
SparseTrieUpdates
structure containing information about updated nodes. None
if the trie is still blind.
Source§impl<P: BlindedProvider> SparseTrie<P>
impl<P: BlindedProvider> SparseTrie<P>
Sourcepub fn update_leaf(
&mut self,
path: Nibbles,
value: Vec<u8>,
is_private: bool,
) -> SparseTrieResult<()>
pub fn update_leaf( &mut self, path: Nibbles, value: Vec<u8>, is_private: bool, ) -> SparseTrieResult<()>
Update the leaf node.
Sourcepub fn remove_leaf(&mut self, path: &Nibbles) -> SparseTrieResult<()>
pub fn remove_leaf(&mut self, path: &Nibbles) -> SparseTrieResult<()>
Removes a leaf node at the specified key path.
§Errors
Returns an error if the trie is still blind, or if the leaf cannot be removed
Trait Implementations§
Source§impl<P> Debug for SparseTrie<P>
impl<P> Debug for SparseTrie<P>
Source§impl<P> Default for SparseTrie<P>
impl<P> Default for SparseTrie<P>
Source§fn default() -> SparseTrie<P>
fn default() -> SparseTrie<P>
Source§impl<P: PartialEq> PartialEq for SparseTrie<P>
impl<P: PartialEq> PartialEq for SparseTrie<P>
impl<P: Eq> Eq for SparseTrie<P>
impl<P> StructuralPartialEq for SparseTrie<P>
Auto Trait Implementations§
impl<P> Freeze for SparseTrie<P>
impl<P> RefUnwindSafe for SparseTrie<P>where
P: RefUnwindSafe,
impl<P> Send for SparseTrie<P>where
P: Send,
impl<P> Sync for SparseTrie<P>where
P: Sync,
impl<P> Unpin for SparseTrie<P>
impl<P> UnwindSafe for SparseTrie<P>where
P: UnwindSafe,
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv
from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv
from a transaction, its sender, and encoded transaction bytes.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeDebug for Twhere
T: Debug,
impl<T> MaybeSend for Twhere
T: Send,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 8 bytes
Size for each variant:
Blind
: 0 bytesRevealed
: 8 bytes