pub struct ParallelSparseTrie { /* private fields */ }
Expand description
A revealed sparse trie with subtries that can be updated in parallel.
§Structure
The trie is divided into two tiers for efficient parallel processing:
- Upper subtrie: Contains nodes with paths shorter than
UPPER_TRIE_MAX_DEPTH
- Lower subtries: An array of
NUM_LOWER_SUBTRIES
subtries, each handling nodes with paths of at leastUPPER_TRIE_MAX_DEPTH
nibbles
Node placement is determined by path depth:
- Paths with <
UPPER_TRIE_MAX_DEPTH
nibbles go to the upper subtrie - Paths with >=
UPPER_TRIE_MAX_DEPTH
nibbles go to lower subtries, indexed by their firstUPPER_TRIE_MAX_DEPTH
nibbles.
Each lower subtrie tracks its root via the path
field, which represents the shortest path
in that subtrie. This path will have at least UPPER_TRIE_MAX_DEPTH
nibbles, but may be
longer when an extension node in the upper trie “reaches into” the lower subtrie. For example,
if the upper trie has an extension from 0x1
to 0x12345
, then the lower subtrie for prefix
0x12
will have its root at path 0x12345
rather than at 0x12
.
§Node Revealing
The trie uses lazy loading to efficiently handle large state tries. Nodes can be:
- Blind nodes: Stored as hashes ([
SparseNode::Hash
]), representing unloaded trie parts - Revealed nodes: Fully loaded nodes (Branch, Extension, Leaf) with complete structure
Note: An empty trie contains an EmptyRoot
node at the root path, rather than no nodes at all.
A trie with no nodes is blinded, its root may be EmptyRoot
or some other node type.
Revealing is generally done using pre-loaded node data provided to via reveal_nodes
. In
certain cases, such as edge-cases when updating/removing leaves, nodes are revealed on-demand.
§Leaf Operations
Update: When updating a leaf, the new value is stored in the appropriate subtrie’s values map. If the leaf is new, the trie structure is updated by walking to the leaf from the root, creating necessary intermediate branch nodes.
Removal: Leaf removal may require parent node modifications. The algorithm walks up the trie, removing nodes that become empty and converting single-child branches to extensions.
During leaf operations the overall structure of the trie may change, causing nodes to be moved from the upper to lower trie or vice-versa.
The prefix_set
is modified during both leaf updates and removals to track changed leaf paths.
§Root Hash Calculation
Root hash computation follows a bottom-up approach:
- Update hashes for all modified lower subtries (can be done in parallel)
- Update hashes for the upper subtrie (which may reference lower subtrie hashes)
- Calculate the final root hash from the upper subtrie’s root node
The prefix_set
tracks which paths have been modified, enabling incremental updates instead of
recalculating the entire trie.
§Invariants
- Each leaf entry in the
subtries
andupper_trie
collection must have a corresponding entry invalues
collection. If the root node is a leaf, it must also have an entry invalues
. - All keys in
values
collection are full leaf paths.
Implementations§
Source§impl ParallelSparseTrie
impl ParallelSparseTrie
Sourcepub fn from_root(
root: TrieNode,
masks: TrieMasks,
retain_updates: bool,
) -> SparseTrieResult<Self>
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 trie when you already have the root node available.
§Arguments
root
- The root node of the triemasks
- Trie masks for root branch noderetain_updates
- Whether to track updates
§Returns
Self if successful, or an error if revealing fails.
Trait Implementations§
Source§impl Clone for ParallelSparseTrie
impl Clone for ParallelSparseTrie
Source§fn clone(&self) -> ParallelSparseTrie
fn clone(&self) -> ParallelSparseTrie
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for ParallelSparseTrie
impl Debug for ParallelSparseTrie
Source§impl Default for ParallelSparseTrie
impl Default for ParallelSparseTrie
Source§impl PartialEq for ParallelSparseTrie
impl PartialEq for ParallelSparseTrie
Source§impl SparseTrieInterface for ParallelSparseTrie
impl SparseTrieInterface for ParallelSparseTrie
Source§fn with_root(
self,
root: TrieNode,
masks: TrieMasks,
retain_updates: bool,
) -> SparseTrieResult<Self>
fn with_root( self, root: TrieNode, masks: TrieMasks, retain_updates: bool, ) -> SparseTrieResult<Self>
Source§fn with_updates(self, retain_updates: bool) -> Self
fn with_updates(self, retain_updates: bool) -> Self
Source§fn reveal_nodes(
&mut self,
nodes: Vec<RevealedSparseNode>,
) -> SparseTrieResult<()>
fn reveal_nodes( &mut self, nodes: Vec<RevealedSparseNode>, ) -> SparseTrieResult<()>
Source§fn update_leaf<P: TrieNodeProvider>(
&mut self,
full_path: Nibbles,
value: Vec<u8>,
provider: P,
) -> SparseTrieResult<()>
fn update_leaf<P: TrieNodeProvider>( &mut self, full_path: Nibbles, value: Vec<u8>, provider: P, ) -> SparseTrieResult<()>
Source§fn remove_leaf<P: TrieNodeProvider>(
&mut self,
full_path: &Nibbles,
provider: P,
) -> SparseTrieResult<()>
fn remove_leaf<P: TrieNodeProvider>( &mut self, full_path: &Nibbles, provider: P, ) -> SparseTrieResult<()>
Source§fn update_subtrie_hashes(&mut self)
fn update_subtrie_hashes(&mut self)
Source§fn get_leaf_value(&self, full_path: &Nibbles) -> Option<&Vec<u8>>
fn get_leaf_value(&self, full_path: &Nibbles) -> Option<&Vec<u8>>
Source§fn updates_ref(&self) -> Cow<'_, SparseTrieUpdates>
fn updates_ref(&self) -> Cow<'_, SparseTrieUpdates>
Source§fn take_updates(&mut self) -> SparseTrieUpdates
fn take_updates(&mut self) -> SparseTrieUpdates
Source§fn wipe(&mut self)
fn wipe(&mut self)
Source§fn clear(&mut self)
fn clear(&mut self)
crate::SparseNode::Empty
] is inserted at the root. Read moreSource§fn find_leaf(
&self,
full_path: &Nibbles,
expected_value: Option<&Vec<u8>>,
) -> Result<LeafLookup, LeafLookupError>
fn find_leaf( &self, full_path: &Nibbles, expected_value: Option<&Vec<u8>>, ) -> Result<LeafLookup, LeafLookupError>
§fn reserve_nodes(&mut self, _additional: usize)
fn reserve_nodes(&mut self, _additional: usize)
§fn reveal_node(
&mut self,
path: Nibbles,
node: TrieNode,
masks: TrieMasks,
) -> Result<(), SparseTrieError>
fn reveal_node( &mut self, path: Nibbles, node: TrieNode, masks: TrieMasks, ) -> Result<(), SparseTrieError>
reveal_nodes
. Read moreimpl Eq for ParallelSparseTrie
impl StructuralPartialEq for ParallelSparseTrie
Auto Trait Implementations§
impl Freeze for ParallelSparseTrie
impl !RefUnwindSafe for ParallelSparseTrie
impl Send for ParallelSparseTrie
impl Sync for ParallelSparseTrie
impl Unpin for ParallelSparseTrie
impl !UnwindSafe for ParallelSparseTrie
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§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: 4376 bytes