Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/scroll' into feat/scroll-bmpt
Browse files Browse the repository at this point in the history
  • Loading branch information
frisitano committed Dec 4, 2024
2 parents dc7ae24 + dad6d74 commit b04a441
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 31 deletions.
15 changes: 8 additions & 7 deletions crates/blockchain-tree/src/blockchain_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ use reth_provider::{
BlockExecutionWriter, BlockNumReader, BlockWriter, CanonStateNotification,
CanonStateNotificationSender, CanonStateNotifications, ChainSpecProvider, ChainSplit,
ChainSplitTarget, DBProvider, DisplayBlocksChain, HashedPostStateProvider, HeaderProvider,
LatestStateProviderRef, ProviderError, StateRootProvider, StaticFileProviderFactory,
LatestStateProviderRef, ProviderError, StateRootProviderExt, StaticFileProviderFactory,
StorageLocation,
};
use reth_stages_api::{MetricEvent, MetricEventsSender};
Expand Down Expand Up @@ -1219,11 +1219,11 @@ where
// Compute state root or retrieve cached trie updates before opening write transaction.
let block_hash_numbers =
blocks.iter().map(|(number, b)| (number, b.hash())).collect::<Vec<_>>();
let trie_updates = match chain_trie_updates {
let (trie_updates, hashed_state_sorted) = match chain_trie_updates {
Some(updates) => {
debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Using cached trie updates");
self.metrics.trie_updates_insert_cached.increment(1);
updates
(updates, hashed_state.into_sorted())
}
None => {
debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Recomputing state root for insert");
Expand All @@ -1234,8 +1234,9 @@ where
// State root calculation can take a while, and we're sure no write transaction
// will be open in parallel. See https://github.com/paradigmxyz/reth/issues/6168.
.disable_long_read_transaction_safety();
let (state_root, trie_updates) = LatestStateProviderRef::new(&provider)
.state_root_from_state_with_updates(hashed_state.clone())?;
let (state_root, trie_updates, hashed_state_sorted) =
LatestStateProviderRef::new(&provider)
.state_root_from_state_with_updates_and_sorted_state(hashed_state)?;
let tip = blocks.tip();
if state_root != tip.state_root {
return Err(ProviderError::StateRootMismatch(Box::new(RootMismatch {
Expand All @@ -1246,7 +1247,7 @@ where
.into())
}
self.metrics.trie_updates_insert_recomputed.increment(1);
trie_updates
(trie_updates, hashed_state_sorted)
}
};
recorder.record_relative(MakeCanonicalAction::RetrieveStateTrieUpdates);
Expand All @@ -1256,7 +1257,7 @@ where
.append_blocks_with_state(
blocks.into_blocks().collect(),
state,
hashed_state.into_sorted(),
hashed_state_sorted,
trie_updates,
)
.map_err(|e| CanonicalError::CanonicalCommit(e.to_string()))?;
Expand Down
11 changes: 6 additions & 5 deletions crates/scroll/state-commitment/src/root.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ use reth_trie::{
trie_cursor::{InMemoryTrieCursorFactory, TrieCursorFactory},
updates::{StorageTrieUpdates, TrieUpdates},
walker::TrieWalker,
HashedPostState, HashedStorage, IntermediateStateRootState, KeyHasher, Nibbles,
StateRootProgress, TrieInput,
HashedPostState, HashedPostStateSorted, HashedStorage, IntermediateStateRootState, KeyHasher,
Nibbles, StateRootProgress, TrieInput,
};
use tracing::{debug, trace};

Expand Down Expand Up @@ -526,15 +526,16 @@ impl<'a, TX: DbTx> DatabaseStateRoot<'a, TX>
fn overlay_root_with_updates(
tx: &'a TX,
post_state: HashedPostState,
) -> Result<(B256, TrieUpdates), StateRootError> {
) -> Result<(B256, TrieUpdates, HashedPostStateSorted), StateRootError> {
let prefix_sets = post_state.construct_prefix_sets().freeze();
let state_sorted = post_state.into_sorted();
StateRoot::new(
let (root, updates) = StateRoot::new(
DatabaseTrieCursorFactory::new(tx),
HashedPostStateCursorFactory::new(DatabaseHashedCursorFactory::new(tx), &state_sorted),
)
.with_prefix_sets(prefix_sets)
.root_with_updates()
.root_with_updates()?;
Ok((root, updates, state_sorted))
}

fn overlay_root_from_nodes(tx: &'a TX, input: TrieInput) -> Result<B256, StateRootError> {
Expand Down
12 changes: 7 additions & 5 deletions crates/storage/provider/src/providers/state/historical.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,11 +322,13 @@ impl<Provider: DBProvider + BlockNumReader + StateCommitmentProvider> StateRootP
) -> ProviderResult<(B256, TrieUpdates)> {
let mut revert_state = self.revert_state()?;
revert_state.extend(hashed_state);
<Provider::StateCommitment as StateCommitment>::StateRoot::overlay_root_with_updates(
self.tx(),
revert_state,
)
.map_err(|err| ProviderError::Database(err.into()))
let (root, updates, _state_sorted) =
<Provider::StateCommitment as StateCommitment>::StateRoot::overlay_root_with_updates(
self.tx(),
revert_state,
)
.map_err(|err| ProviderError::Database(err.into()))?;
Ok((root, updates))
}

fn state_root_from_nodes_with_updates(
Expand Down
23 changes: 18 additions & 5 deletions crates/storage/provider/src/providers/state/latest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,13 @@ impl<Provider: DBProvider + StateCommitmentProvider> StateRootProvider
&self,
hashed_state: HashedPostState,
) -> ProviderResult<(B256, TrieUpdates)> {
<Provider::StateCommitment as StateCommitment>::StateRoot::overlay_root_with_updates(
self.tx(),
hashed_state,
)
.map_err(|err| ProviderError::Database(err.into()))
let (root, updates, _state_sorted) =
<Provider::StateCommitment as StateCommitment>::StateRoot::overlay_root_with_updates(
self.tx(),
hashed_state,
)
.map_err(|err| ProviderError::Database(err.into()))?;
Ok((root, updates))
}

fn state_root_from_nodes_with_updates(
Expand Down Expand Up @@ -149,6 +151,17 @@ impl<Provider: DBProvider + StateCommitmentProvider> StateRootProviderExt
)
.map_err(|err| ProviderError::Database(err.into()))
}

fn state_root_from_state_with_updates_and_sorted_state(
&self,
hashed_state: HashedPostState,
) -> ProviderResult<(B256, TrieUpdates, reth_trie::HashedPostStateSorted)> {
<Provider::StateCommitment as StateCommitment>::StateRoot::overlay_root_with_updates(
self.tx(),
hashed_state,
)
.map_err(|err| ProviderError::Database(err.into()))
}
}

impl<Provider: DBProvider + StateCommitmentProvider> StorageRootProvider
Expand Down
12 changes: 10 additions & 2 deletions crates/storage/storage-api/src/trie.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ use reth_storage_errors::provider::ProviderResult;
use reth_trie::{
prefix_set::TriePrefixSets,
updates::{StorageTrieUpdates, TrieUpdates},
AccountProof, HashedPostState, HashedStorage, IntermediateStateRootState, MultiProof,
StateRootProgress, StorageMultiProof, StorageProof, TrieInput,
AccountProof, HashedPostState, HashedPostStateSorted, HashedStorage,
IntermediateStateRootState, MultiProof, StateRootProgress, StorageMultiProof, StorageProof,
TrieInput,
};

/// A type that can compute the state root of a given post state.
Expand Down Expand Up @@ -67,6 +68,13 @@ pub trait StateRootProviderExt: Send + Sync {
&self,
prefix_set: TriePrefixSets,
) -> ProviderResult<(B256, TrieUpdates)>;

/// Returns the state root of the [`HashedPostState`] on top of the current, the trie updates
/// and the sorted hashed post state ([`HashedPostStateSorted`]).
fn state_root_from_state_with_updates_and_sorted_state(
&self,
hashed_state: HashedPostState,
) -> ProviderResult<(B256, TrieUpdates, HashedPostStateSorted)>;
}

/// A type that can compute the storage root for a given account.
Expand Down
15 changes: 8 additions & 7 deletions crates/trie/db/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ use reth_execution_errors::StateRootError;
use reth_storage_errors::db::DatabaseError;
use reth_trie::{
hashed_cursor::HashedPostStateCursorFactory, prefix_set::TriePrefixSets,
trie_cursor::InMemoryTrieCursorFactory, updates::TrieUpdates, HashedPostState, HashedStorage,
IntermediateStateRootState, KeccakKeyHasher, KeyHasher, StateRoot, StateRootProgress,
TrieInput,
trie_cursor::InMemoryTrieCursorFactory, updates::TrieUpdates, HashedPostState,
HashedPostStateSorted, HashedStorage, IntermediateStateRootState, KeccakKeyHasher, KeyHasher,
StateRoot, StateRootProgress, TrieInput,
};
use std::{collections::HashMap, ops::RangeInclusive};
use tracing::debug;
Expand Down Expand Up @@ -113,7 +113,7 @@ pub trait DatabaseStateRoot<'a, TX>: Sized {
fn overlay_root_with_updates(
tx: &'a TX,
post_state: HashedPostState,
) -> Result<(B256, TrieUpdates), StateRootError>;
) -> Result<(B256, TrieUpdates, HashedPostStateSorted), StateRootError>;

/// Calculates the state root for provided [`HashedPostState`] using cached intermediate nodes.
fn overlay_root_from_nodes(tx: &'a TX, input: TrieInput) -> Result<B256, StateRootError>;
Expand Down Expand Up @@ -207,15 +207,16 @@ impl<'a, TX: DbTx> DatabaseStateRoot<'a, TX>
fn overlay_root_with_updates(
tx: &'a TX,
post_state: HashedPostState,
) -> Result<(B256, TrieUpdates), StateRootError> {
) -> Result<(B256, TrieUpdates, HashedPostStateSorted), StateRootError> {
let prefix_sets = post_state.construct_prefix_sets().freeze();
let state_sorted = post_state.into_sorted();
StateRoot::new(
let (root, updates) = StateRoot::new(
DatabaseTrieCursorFactory::new(tx),
HashedPostStateCursorFactory::new(DatabaseHashedCursorFactory::new(tx), &state_sorted),
)
.with_prefix_sets(prefix_sets)
.root_with_updates()
.root_with_updates()?;
Ok((root, updates, state_sorted))
}

fn overlay_root_from_nodes(tx: &'a TX, input: TrieInput) -> Result<B256, StateRootError> {
Expand Down

0 comments on commit b04a441

Please sign in to comment.