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_SUBTRIESsubtries, each handling nodes with paths of at leastUPPER_TRIE_MAX_DEPTHnibbles
Node placement is determined by path depth:
- Paths with <
UPPER_TRIE_MAX_DEPTHnibbles go to the upper subtrie - Paths with >=
UPPER_TRIE_MAX_DEPTHnibbles go to lower subtries, indexed by their firstUPPER_TRIE_MAX_DEPTHnibbles.
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
subtriesandupper_triecollection must have a corresponding entry invaluescollection. If the root node is a leaf, it must also have an entry invalues. - All keys in
valuescollection are full leaf paths.
Implementations§
Source§impl ParallelSparseTrie
impl ParallelSparseTrie
Sourcepub const fn with_parallelism_thresholds(
self,
thresholds: ParallelismThresholds,
) -> Self
pub const fn with_parallelism_thresholds( self, thresholds: ParallelismThresholds, ) -> Self
Sets the thresholds that control when parallelism is used during operations.
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>
Source§fn shrink_nodes_to(&mut self, size: usize)
fn shrink_nodes_to(&mut self, size: usize)
Source§fn shrink_values_to(&mut self, size: usize)
fn shrink_values_to(&mut self, size: usize)
§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: 4392 bytes