mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
chore(trie): simplify blinded provider (#13753)
This commit is contained in:
@ -17,7 +17,7 @@ use reth_trie::{
|
|||||||
use reth_trie_parallel::{proof::ParallelProof, root::ParallelStateRootError};
|
use reth_trie_parallel::{proof::ParallelProof, root::ParallelStateRootError};
|
||||||
use reth_trie_sparse::{
|
use reth_trie_sparse::{
|
||||||
blinded::{BlindedProvider, BlindedProviderFactory},
|
blinded::{BlindedProvider, BlindedProviderFactory},
|
||||||
errors::{SparseStateTrieError, SparseStateTrieResult, SparseTrieError, SparseTrieErrorKind},
|
errors::{SparseStateTrieError, SparseStateTrieResult, SparseTrieErrorKind},
|
||||||
SparseStateTrie,
|
SparseStateTrie,
|
||||||
};
|
};
|
||||||
use revm_primitives::{keccak256, EvmState, B256};
|
use revm_primitives::{keccak256, EvmState, B256};
|
||||||
@ -278,7 +278,7 @@ pub struct StateRootTask<'env, Factory, BPF: BlindedProviderFactory> {
|
|||||||
thread_pool: &'env rayon::ThreadPool,
|
thread_pool: &'env rayon::ThreadPool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'env, Factory, ABP, SBP, BPF> StateRootTask<'env, Factory, BPF>
|
impl<'env, Factory, BPF> StateRootTask<'env, Factory, BPF>
|
||||||
where
|
where
|
||||||
Factory: DatabaseProviderFactory<Provider: BlockReader>
|
Factory: DatabaseProviderFactory<Provider: BlockReader>
|
||||||
+ StateCommitmentProvider
|
+ StateCommitmentProvider
|
||||||
@ -286,12 +286,9 @@ where
|
|||||||
+ Send
|
+ Send
|
||||||
+ Sync
|
+ Sync
|
||||||
+ 'static,
|
+ 'static,
|
||||||
ABP: BlindedProvider<Error = SparseTrieError> + Send + Sync + 'env,
|
BPF: BlindedProviderFactory + Send + Sync + 'env,
|
||||||
SBP: BlindedProvider<Error = SparseTrieError> + Send + Sync + 'env,
|
BPF::AccountNodeProvider: BlindedProvider + Send + Sync + 'env,
|
||||||
BPF: BlindedProviderFactory<AccountNodeProvider = ABP, StorageNodeProvider = SBP>
|
BPF::StorageNodeProvider: BlindedProvider + Send + Sync + 'env,
|
||||||
+ Send
|
|
||||||
+ Sync
|
|
||||||
+ 'env,
|
|
||||||
{
|
{
|
||||||
/// Creates a new state root task with the unified message channel
|
/// Creates a new state root task with the unified message channel
|
||||||
pub fn new(
|
pub fn new(
|
||||||
@ -759,16 +756,17 @@ where
|
|||||||
|
|
||||||
/// Updates the sparse trie with the given proofs and state, and returns the updated trie and the
|
/// Updates the sparse trie with the given proofs and state, and returns the updated trie and the
|
||||||
/// time it took.
|
/// time it took.
|
||||||
fn update_sparse_trie<
|
fn update_sparse_trie<BPF>(
|
||||||
ABP: BlindedProvider<Error = SparseTrieError> + Send + Sync,
|
|
||||||
SBP: BlindedProvider<Error = SparseTrieError> + Send + Sync,
|
|
||||||
BPF: BlindedProviderFactory<AccountNodeProvider = ABP, StorageNodeProvider = SBP> + Send + Sync,
|
|
||||||
>(
|
|
||||||
mut trie: Box<SparseStateTrie<BPF>>,
|
mut trie: Box<SparseStateTrie<BPF>>,
|
||||||
multiproof: MultiProof,
|
multiproof: MultiProof,
|
||||||
targets: MultiProofTargets,
|
targets: MultiProofTargets,
|
||||||
state: HashedPostState,
|
state: HashedPostState,
|
||||||
) -> SparseStateTrieResult<(Box<SparseStateTrie<BPF>>, Duration)> {
|
) -> SparseStateTrieResult<(Box<SparseStateTrie<BPF>>, Duration)>
|
||||||
|
where
|
||||||
|
BPF: BlindedProviderFactory + Send + Sync,
|
||||||
|
BPF::AccountNodeProvider: BlindedProvider + Send + Sync,
|
||||||
|
BPF::StorageNodeProvider: BlindedProvider + Send + Sync,
|
||||||
|
{
|
||||||
trace!(target: "engine::root::sparse", "Updating sparse trie");
|
trace!(target: "engine::root::sparse", "Updating sparse trie");
|
||||||
let started_at = Instant::now();
|
let started_at = Instant::now();
|
||||||
|
|
||||||
|
|||||||
@ -20,11 +20,8 @@ pub trait BlindedProviderFactory {
|
|||||||
|
|
||||||
/// Trie node provider for retrieving blinded nodes.
|
/// Trie node provider for retrieving blinded nodes.
|
||||||
pub trait BlindedProvider {
|
pub trait BlindedProvider {
|
||||||
/// The error type for the provider.
|
|
||||||
type Error: Into<SparseTrieError>;
|
|
||||||
|
|
||||||
/// Retrieve blinded node by path.
|
/// Retrieve blinded node by path.
|
||||||
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, Self::Error>;
|
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, SparseTrieError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default blinded node provider factory that creates [`DefaultBlindedProvider`].
|
/// Default blinded node provider factory that creates [`DefaultBlindedProvider`].
|
||||||
@ -49,9 +46,7 @@ impl BlindedProviderFactory for DefaultBlindedProviderFactory {
|
|||||||
pub struct DefaultBlindedProvider;
|
pub struct DefaultBlindedProvider;
|
||||||
|
|
||||||
impl BlindedProvider for DefaultBlindedProvider {
|
impl BlindedProvider for DefaultBlindedProvider {
|
||||||
type Error = SparseTrieError;
|
fn blinded_node(&mut self, _path: &Nibbles) -> Result<Option<Bytes>, SparseTrieError> {
|
||||||
|
|
||||||
fn blinded_node(&mut self, _path: &Nibbles) -> Result<Option<Bytes>, Self::Error> {
|
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
blinded::{BlindedProvider, BlindedProviderFactory, DefaultBlindedProviderFactory},
|
blinded::{BlindedProviderFactory, DefaultBlindedProviderFactory},
|
||||||
RevealedSparseTrie, SparseTrie,
|
RevealedSparseTrie, SparseTrie,
|
||||||
};
|
};
|
||||||
use alloy_primitives::{
|
use alloy_primitives::{
|
||||||
@ -8,9 +8,7 @@ use alloy_primitives::{
|
|||||||
Bytes, B256,
|
Bytes, B256,
|
||||||
};
|
};
|
||||||
use alloy_rlp::{Decodable, Encodable};
|
use alloy_rlp::{Decodable, Encodable};
|
||||||
use reth_execution_errors::{
|
use reth_execution_errors::{SparseStateTrieErrorKind, SparseStateTrieResult, SparseTrieErrorKind};
|
||||||
SparseStateTrieErrorKind, SparseStateTrieResult, SparseTrieError, SparseTrieErrorKind,
|
|
||||||
};
|
|
||||||
use reth_primitives_traits::Account;
|
use reth_primitives_traits::Account;
|
||||||
use reth_tracing::tracing::trace;
|
use reth_tracing::tracing::trace;
|
||||||
use reth_trie_common::{
|
use reth_trie_common::{
|
||||||
@ -452,12 +450,7 @@ impl<F: BlindedProviderFactory> SparseStateTrie<F> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<F> SparseStateTrie<F>
|
impl<F: BlindedProviderFactory> SparseStateTrie<F> {
|
||||||
where
|
|
||||||
F: BlindedProviderFactory,
|
|
||||||
SparseTrieError: From<<F::AccountNodeProvider as BlindedProvider>::Error>
|
|
||||||
+ From<<F::StorageNodeProvider as BlindedProvider>::Error>,
|
|
||||||
{
|
|
||||||
/// Update the account leaf node.
|
/// Update the account leaf node.
|
||||||
pub fn update_account_leaf(
|
pub fn update_account_leaf(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|||||||
@ -5,7 +5,7 @@ use alloy_primitives::{
|
|||||||
B256,
|
B256,
|
||||||
};
|
};
|
||||||
use alloy_rlp::Decodable;
|
use alloy_rlp::Decodable;
|
||||||
use reth_execution_errors::{SparseTrieError, SparseTrieErrorKind, SparseTrieResult};
|
use reth_execution_errors::{SparseTrieErrorKind, SparseTrieResult};
|
||||||
use reth_tracing::tracing::trace;
|
use reth_tracing::tracing::trace;
|
||||||
use reth_trie_common::{
|
use reth_trie_common::{
|
||||||
prefix_set::{PrefixSet, PrefixSetMut},
|
prefix_set::{PrefixSet, PrefixSetMut},
|
||||||
@ -73,7 +73,7 @@ impl<P> SparseTrie<P> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns reference to revealed sparse trie if the trie is not blind.
|
/// Returns reference to revealed sparse trie if the trie is not blind.
|
||||||
pub fn as_revealed_ref(&self) -> Option<&RevealedSparseTrie<P>> {
|
pub const fn as_revealed_ref(&self) -> Option<&RevealedSparseTrie<P>> {
|
||||||
if let Self::Revealed(revealed) = self {
|
if let Self::Revealed(revealed) = self {
|
||||||
Some(revealed)
|
Some(revealed)
|
||||||
} else {
|
} else {
|
||||||
@ -131,11 +131,7 @@ impl<P> SparseTrie<P> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<P> SparseTrie<P>
|
impl<P: BlindedProvider> SparseTrie<P> {
|
||||||
where
|
|
||||||
P: BlindedProvider,
|
|
||||||
SparseTrieError: From<P::Error>,
|
|
||||||
{
|
|
||||||
/// Update the leaf node.
|
/// Update the leaf node.
|
||||||
pub fn update_leaf(&mut self, path: Nibbles, value: Vec<u8>) -> SparseTrieResult<()> {
|
pub fn update_leaf(&mut self, path: Nibbles, value: Vec<u8>) -> SparseTrieResult<()> {
|
||||||
let revealed = self.as_revealed_mut().ok_or(SparseTrieErrorKind::Blind)?;
|
let revealed = self.as_revealed_mut().ok_or(SparseTrieErrorKind::Blind)?;
|
||||||
@ -825,11 +821,7 @@ impl<P> RevealedSparseTrie<P> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<P> RevealedSparseTrie<P>
|
impl<P: BlindedProvider> RevealedSparseTrie<P> {
|
||||||
where
|
|
||||||
P: BlindedProvider,
|
|
||||||
SparseTrieError: From<P::Error>,
|
|
||||||
{
|
|
||||||
/// Update the leaf node with provided value.
|
/// Update the leaf node with provided value.
|
||||||
pub fn update_leaf(&mut self, path: Nibbles, value: Vec<u8>) -> SparseTrieResult<()> {
|
pub fn update_leaf(&mut self, path: Nibbles, value: Vec<u8>) -> SparseTrieResult<()> {
|
||||||
self.prefix_set.insert(path.clone());
|
self.prefix_set.insert(path.clone());
|
||||||
|
|||||||
@ -84,9 +84,7 @@ where
|
|||||||
T: TrieCursorFactory + Clone + Send + Sync,
|
T: TrieCursorFactory + Clone + Send + Sync,
|
||||||
H: HashedCursorFactory + Clone + Send + Sync,
|
H: HashedCursorFactory + Clone + Send + Sync,
|
||||||
{
|
{
|
||||||
type Error = SparseTrieError;
|
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, SparseTrieError> {
|
||||||
|
|
||||||
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, Self::Error> {
|
|
||||||
let targets = HashMap::from_iter([(pad_path_to_key(path), HashSet::default())]);
|
let targets = HashMap::from_iter([(pad_path_to_key(path), HashSet::default())]);
|
||||||
let proof =
|
let proof =
|
||||||
Proof::new(self.trie_cursor_factory.clone(), self.hashed_cursor_factory.clone())
|
Proof::new(self.trie_cursor_factory.clone(), self.hashed_cursor_factory.clone())
|
||||||
@ -128,9 +126,7 @@ where
|
|||||||
T: TrieCursorFactory + Clone + Send + Sync,
|
T: TrieCursorFactory + Clone + Send + Sync,
|
||||||
H: HashedCursorFactory + Clone + Send + Sync,
|
H: HashedCursorFactory + Clone + Send + Sync,
|
||||||
{
|
{
|
||||||
type Error = SparseTrieError;
|
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, SparseTrieError> {
|
||||||
|
|
||||||
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, Self::Error> {
|
|
||||||
let targets = HashSet::from_iter([pad_path_to_key(path)]);
|
let targets = HashSet::from_iter([pad_path_to_key(path)]);
|
||||||
let storage_prefix_set =
|
let storage_prefix_set =
|
||||||
self.prefix_sets.storage_prefix_sets.get(&self.account).cloned().unwrap_or_default();
|
self.prefix_sets.storage_prefix_sets.get(&self.account).cloned().unwrap_or_default();
|
||||||
|
|||||||
@ -212,8 +212,8 @@ impl<F> WitnessBlindedProviderFactory<F> {
|
|||||||
impl<F> BlindedProviderFactory for WitnessBlindedProviderFactory<F>
|
impl<F> BlindedProviderFactory for WitnessBlindedProviderFactory<F>
|
||||||
where
|
where
|
||||||
F: BlindedProviderFactory,
|
F: BlindedProviderFactory,
|
||||||
F::AccountNodeProvider: BlindedProvider<Error = SparseTrieError>,
|
F::AccountNodeProvider: BlindedProvider,
|
||||||
F::StorageNodeProvider: BlindedProvider<Error = SparseTrieError>,
|
F::StorageNodeProvider: BlindedProvider,
|
||||||
{
|
{
|
||||||
type AccountNodeProvider = WitnessBlindedProvider<F::AccountNodeProvider>;
|
type AccountNodeProvider = WitnessBlindedProvider<F::AccountNodeProvider>;
|
||||||
type StorageNodeProvider = WitnessBlindedProvider<F::StorageNodeProvider>;
|
type StorageNodeProvider = WitnessBlindedProvider<F::StorageNodeProvider>;
|
||||||
@ -243,13 +243,8 @@ impl<P> WitnessBlindedProvider<P> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<P> BlindedProvider for WitnessBlindedProvider<P>
|
impl<P: BlindedProvider> BlindedProvider for WitnessBlindedProvider<P> {
|
||||||
where
|
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, SparseTrieError> {
|
||||||
P: BlindedProvider<Error = SparseTrieError>,
|
|
||||||
{
|
|
||||||
type Error = P::Error;
|
|
||||||
|
|
||||||
fn blinded_node(&mut self, path: &Nibbles) -> Result<Option<Bytes>, Self::Error> {
|
|
||||||
let maybe_node = self.provider.blinded_node(path)?;
|
let maybe_node = self.provider.blinded_node(path)?;
|
||||||
if let Some(node) = &maybe_node {
|
if let Some(node) = &maybe_node {
|
||||||
self.tx
|
self.tx
|
||||||
|
|||||||
Reference in New Issue
Block a user