pub enum SparseTrie<T = SerialSparseTrie> {
Blind(Option<Box<T>>),
Revealed(Box<T>),
}
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(Option<Box<T>>)
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.
In this state the SparseTrie
can optionally carry with it a cleared SerialSparseTrie
.
This allows for reusing the trie’s allocations between payload executions.
Revealed(Box<T>)
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<T: SparseTrieInterface + Default> SparseTrie<T>
impl<T: SparseTrieInterface + Default> SparseTrie<T>
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::{provider::DefaultTrieNodeProvider, SerialSparseTrie, SparseTrie};
let trie = SparseTrie::<SerialSparseTrie>::revealed_empty();
assert!(!trie.is_blind());
Sourcepub fn reveal_root(
&mut self,
root: TrieNode,
masks: TrieMasks,
retain_updates: bool,
) -> SparseTrieResult<&mut T>
pub fn reveal_root( &mut self, root: TrieNode, masks: TrieMasks, retain_updates: bool, ) -> SparseTrieResult<&mut T>
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 SparseTrieInterface
.
Source§impl<T: SparseTrieInterface> SparseTrie<T>
impl<T: SparseTrieInterface> SparseTrie<T>
Sourcepub const fn blind() -> Self
pub const fn blind() -> Self
Creates a new blind sparse trie.
§Examples
use reth_trie_sparse::{provider::DefaultTrieNodeProvider, SerialSparseTrie, SparseTrie};
let trie = SparseTrie::<SerialSparseTrie>::blind();
assert!(trie.is_blind());
let trie = SparseTrie::<SerialSparseTrie>::default();
assert!(trie.is_blind());
Sourcepub const fn is_revealed(&self) -> bool
pub const fn is_revealed(&self) -> bool
Returns true
if the sparse trie is revealed.
Sourcepub const fn as_revealed_ref(&self) -> Option<&T>
pub const fn as_revealed_ref(&self) -> Option<&T>
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 T>
pub fn as_revealed_mut(&mut self) -> Option<&mut T>
Returns a mutable reference to the underlying revealed sparse trie.
Returns None
if the trie is blinded.
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.
Sourcepub fn clear(self) -> Self
pub fn clear(self) -> Self
Returns a SparseTrie::Blind
based on this one. If this instance was revealed, or was
itself a Blind
with a pre-allocated SparseTrieInterface
, this will return
a Blind
carrying a cleared pre-allocated SparseTrieInterface
.
Sourcepub fn update_leaf(
&mut self,
path: Nibbles,
value: Vec<u8>,
provider: impl TrieNodeProvider,
) -> SparseTrieResult<()>
pub fn update_leaf( &mut self, path: Nibbles, value: Vec<u8>, provider: impl TrieNodeProvider, ) -> SparseTrieResult<()>
Updates (or inserts) a leaf at the given key path with the specified RLP-encoded value.
§Errors
Returns an error if the trie is still blind, or if the update fails.
Sourcepub fn remove_leaf(
&mut self,
path: &Nibbles,
provider: impl TrieNodeProvider,
) -> SparseTrieResult<()>
pub fn remove_leaf( &mut self, path: &Nibbles, provider: impl TrieNodeProvider, ) -> 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<T: Debug> Debug for SparseTrie<T>
impl<T: Debug> Debug for SparseTrie<T>
Source§impl<T: Default> Default for SparseTrie<T>
impl<T: Default> Default for SparseTrie<T>
Source§impl<T: PartialEq> PartialEq for SparseTrie<T>
impl<T: PartialEq> PartialEq for SparseTrie<T>
impl<T: Eq> Eq for SparseTrie<T>
impl<T> StructuralPartialEq for SparseTrie<T>
Auto Trait Implementations§
impl<T> Freeze for SparseTrie<T>
impl<T> RefUnwindSafe for SparseTrie<T>where
T: RefUnwindSafe,
impl<T> Send for SparseTrie<T>where
T: Send,
impl<T> Sync for SparseTrie<T>where
T: Sync,
impl<T> Unpin for SparseTrie<T>
impl<T> UnwindSafe for SparseTrie<T>where
T: 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> MaybeDebug for Twhere
T: Debug,
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: 16 bytes
Size for each variant:
Blind
: 8 bytesRevealed
: 8 bytes