Skip to content

Commit

Permalink
Merge branch 'scroll' into feat/execution-strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
greged93 committed Dec 4, 2024
2 parents f6293f4 + 59a1ccd commit d4374f1
Show file tree
Hide file tree
Showing 53 changed files with 599 additions and 208 deletions.
9 changes: 3 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions bin/reth/src/commands/debug_cmd/build_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,8 @@ impl<C: ChainSpecParser<ChainSpec = ChainSpec>> Command<C> {
let block_with_senders =
SealedBlockWithSenders::<BlockTy<N>>::new(block.clone(), senders).unwrap();

let db = StateProviderDatabase::new(blockchain_db.latest()?);
let state_provider = blockchain_db.latest()?;
let db = StateProviderDatabase::new(&state_provider);
let executor =
EthExecutorProvider::ethereum(provider_factory.chain_spec()).executor(db);

Expand All @@ -271,7 +272,7 @@ impl<C: ChainSpecParser<ChainSpec = ChainSpec>> Command<C> {
ExecutionOutcome::from((block_execution_output, block.number));
debug!(target: "reth::cli", ?execution_outcome, "Executed block");

let hashed_post_state = execution_outcome.hash_state_slow();
let hashed_post_state = state_provider.hashed_post_state(execution_outcome.state());
let (state_root, trie_updates) = StateRoot::overlay_root_with_updates(
provider_factory.provider()?.tx_ref(),
hashed_post_state.clone(),
Expand Down
10 changes: 6 additions & 4 deletions bin/reth/src/commands/debug_cmd/in_memory_merkle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ use reth_node_ethereum::EthExecutorProvider;
use reth_primitives::BlockExt;
use reth_provider::{
providers::ProviderNodeTypes, AccountExtReader, ChainSpecProvider, DatabaseProviderFactory,
HashingWriter, HeaderProvider, LatestStateProviderRef, OriginalValuesKnown, ProviderFactory,
StageCheckpointReader, StateWriter, StorageLocation, StorageReader,
HashedPostStateProvider, HashingWriter, HeaderProvider, LatestStateProviderRef,
OriginalValuesKnown, ProviderFactory, StageCheckpointReader, StateWriter, StorageLocation,
StorageReader,
};
use reth_revm::database::StateProviderDatabase;
use reth_stages::StageId;
Expand Down Expand Up @@ -142,7 +143,8 @@ impl<C: ChainSpecParser<ChainSpec = ChainSpec>> Command<C> {
)
.await?;

let db = StateProviderDatabase::new(LatestStateProviderRef::new(&provider));
let state_provider = LatestStateProviderRef::new(&provider);
let db = StateProviderDatabase::new(&state_provider);

let executor = EthExecutorProvider::ethereum(provider_factory.chain_spec()).executor(db);

Expand All @@ -164,7 +166,7 @@ impl<C: ChainSpecParser<ChainSpec = ChainSpec>> Command<C> {
// Unpacked `BundleState::state_root_slow` function
let (in_memory_state_root, in_memory_updates) = StateRoot::overlay_root_with_updates(
provider.tx_ref(),
execution_outcome.hash_state_slow(),
state_provider.hashed_post_state(execution_outcome.state()),
)?;

if in_memory_state_root == block.state_root {
Expand Down
13 changes: 9 additions & 4 deletions crates/blockchain-tree/src/blockchain_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ use reth_primitives::{
use reth_provider::{
BlockExecutionWriter, BlockNumReader, BlockWriter, CanonStateNotification,
CanonStateNotificationSender, CanonStateNotifications, ChainSpecProvider, ChainSplit,
ChainSplitTarget, DBProvider, DisplayBlocksChain, HeaderProvider, ProviderError,
StaticFileProviderFactory, StorageLocation,
ChainSplitTarget, DBProvider, DisplayBlocksChain, HashedPostStateProvider, HeaderProvider,
ProviderError, StaticFileProviderFactory, StorageLocation,
};
use reth_stages_api::{MetricEvent, MetricEventsSender};
use reth_storage_errors::provider::{ProviderResult, RootMismatch};
Expand Down Expand Up @@ -1215,7 +1215,7 @@ where
recorder: &mut MakeCanonicalDurationsRecorder,
) -> Result<(), CanonicalError> {
let (blocks, state, chain_trie_updates) = chain.into_inner();
let hashed_state = state.hash_state_slow();
let hashed_state = self.externals.provider_factory.hashed_post_state(state.state());
let prefix_sets = hashed_state.construct_prefix_sets().freeze();
let hashed_state_sorted = hashed_state.into_sorted();

Expand Down Expand Up @@ -1880,7 +1880,12 @@ mod tests {
);

let provider = tree.externals.provider_factory.provider().unwrap();
let prefix_sets = exec5.hash_state_slow().construct_prefix_sets().freeze();
let prefix_sets = tree
.externals
.provider_factory
.hashed_post_state(exec5.state())
.construct_prefix_sets()
.freeze();
let state_root =
StateRoot::from_tx(provider.tx_ref()).with_prefix_sets(prefix_sets).root().unwrap();
assert_eq!(state_root, block5.state_root);
Expand Down
11 changes: 5 additions & 6 deletions crates/blockchain-tree/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ use reth_execution_types::{Chain, ExecutionOutcome};
use reth_primitives::{GotExpected, SealedBlockWithSenders, SealedHeader};
use reth_provider::{
providers::{BundleStateProvider, ConsistentDbView, ProviderNodeTypes},
DBProvider, FullExecutionDataProvider, ProviderError, StateRootProvider,
TryIntoHistoricalStateProvider,
DBProvider, FullExecutionDataProvider, HashedPostStateProvider, ProviderError,
StateRootProvider, TryIntoHistoricalStateProvider,
};
use reth_trie::{updates::TrieUpdates, HashedPostState, TrieInput};
use reth_trie::{updates::TrieUpdates, TrieInput};
use reth_trie_parallel::root::ParallelStateRoot;
use std::{
collections::BTreeMap,
Expand Down Expand Up @@ -230,14 +230,13 @@ impl AppendableChain {
execution_outcome.extend(initial_execution_outcome.clone());
ParallelStateRoot::new(
consistent_view,
TrieInput::from_state(execution_outcome.hash_state_slow()),
TrieInput::from_state(provider.hashed_post_state(execution_outcome.state())),
)
.incremental_root_with_updates()
.map(|(root, updates)| (root, Some(updates)))
.map_err(ProviderError::from)?
} else {
let hashed_state =
HashedPostState::from_bundle_state(&initial_execution_outcome.state().state);
let hashed_state = provider.hashed_post_state(initial_execution_outcome.state());
let state_root = provider.state_root(hashed_state)?;
(state_root, None)
};
Expand Down
6 changes: 2 additions & 4 deletions crates/chain-state/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ reth-trie.workspace = true
alloy-eips.workspace = true
alloy-primitives.workspace = true
alloy-consensus.workspace = true
revm.workspace = true

# async
tokio = { workspace = true, default-features = false, features = ["sync", "macros"] }
Expand All @@ -44,25 +45,22 @@ pin-project.workspace = true
alloy-signer = { workspace = true, optional = true }
alloy-signer-local = { workspace = true, optional = true }
rand = { workspace = true, optional = true }
revm = { workspace = true, optional = true }

[dev-dependencies]
reth-testing-utils.workspace = true
alloy-signer.workspace = true
alloy-signer-local.workspace = true
alloy-consensus.workspace = true
rand.workspace = true
revm.workspace = true

[features]
test-utils = [
"alloy-signer",
"alloy-signer-local",
"rand",
"revm",
"reth-chainspec/test-utils",
"reth-primitives/test-utils",
"reth-primitives-traits/test-utils",
"reth-trie/test-utils",
"revm?/test-utils",
"revm/test-utils",
]
25 changes: 23 additions & 2 deletions crates/chain-state/src/in_memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -949,12 +949,15 @@ mod tests {
use reth_errors::ProviderResult;
use reth_primitives::{Account, Bytecode, EthPrimitives, Receipt};
use reth_storage_api::{
AccountReader, BlockHashReader, StateProofProvider, StateProvider, StateRootProvider,
AccountReader, BlockHashReader, HashedPostStateProvider, HashedStorageProvider,
KeyHasherProvider, StateProofProvider, StateProvider, StateRootProvider,
StorageRootProvider,
};
use reth_trie::{
AccountProof, HashedStorage, MultiProof, StorageMultiProof, StorageProof, TrieInput,
AccountProof, HashedStorage, KeccakKeyHasher, KeyHasher, MultiProof, StorageMultiProof,
StorageProof, TrieInput,
};
use revm::db::BundleAccount;

fn create_mock_state(
test_block_builder: &mut TestBlockBuilder<EthPrimitives>,
Expand Down Expand Up @@ -1047,6 +1050,24 @@ mod tests {
}
}

impl HashedPostStateProvider for MockStateProvider {
fn hashed_post_state(&self, _bundle_state: &revm::db::BundleState) -> HashedPostState {
HashedPostState::default()
}
}

impl HashedStorageProvider for MockStateProvider {
fn hashed_storage(&self, _account: &BundleAccount) -> HashedStorage {
HashedStorage::default()
}
}

impl KeyHasherProvider for MockStateProvider {
fn hash_key(&self, bytes: &[u8]) -> B256 {
KeccakKeyHasher::hash_key(bytes)
}
}

impl StorageRootProvider for MockStateProvider {
fn storage_root(
&self,
Expand Down
30 changes: 24 additions & 6 deletions crates/chain-state/src/memory_overlay.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
use super::ExecutedBlock;
use alloy_consensus::BlockHeader;
use alloy_primitives::{
keccak256,
map::{HashMap, HashSet},
Address, BlockNumber, Bytes, StorageKey, StorageValue, B256,
};
use reth_errors::ProviderResult;
use reth_primitives::{Account, Bytecode, NodePrimitives};
use reth_storage_api::{
AccountReader, BlockHashReader, StateProofProvider, StateProvider, StateRootProvider,
StorageRootProvider,
AccountReader, BlockHashReader, HashedPostStateProvider, HashedStorageProvider,
KeyHasherProvider, StateProofProvider, StateProvider, StateRootProvider, StorageRootProvider,
};
use reth_trie::{
updates::TrieUpdates, AccountProof, HashedPostState, HashedStorage, MultiProof,
StorageMultiProof, TrieInput,
};
use revm::db::{BundleAccount, BundleState};
use std::sync::OnceLock;

/// A state provider that stores references to in-memory blocks along with their state as well as a
Expand Down Expand Up @@ -151,7 +151,7 @@ macro_rules! impl_state_provider {
fn storage_root(&self, address: Address, storage: HashedStorage) -> ProviderResult<B256> {
let state = &self.trie_state().state;
let mut hashed_storage =
state.storages.get(&keccak256(address)).cloned().unwrap_or_default();
state.storages.get(&self.hash_key(address.as_ref())).cloned().unwrap_or_default();
hashed_storage.extend(&storage);
self.historical.storage_root(address, hashed_storage)
}
Expand All @@ -165,7 +165,7 @@ macro_rules! impl_state_provider {
) -> ProviderResult<reth_trie::StorageProof> {
let state = &self.trie_state().state;
let mut hashed_storage =
state.storages.get(&keccak256(address)).cloned().unwrap_or_default();
state.storages.get(&self.hash_key(address.as_ref())).cloned().unwrap_or_default();
hashed_storage.extend(&storage);
self.historical.storage_proof(address, slot, hashed_storage)
}
Expand All @@ -179,7 +179,7 @@ macro_rules! impl_state_provider {
) -> ProviderResult<StorageMultiProof> {
let state = &self.trie_state().state;
let mut hashed_storage =
state.storages.get(&keccak256(address)).cloned().unwrap_or_default();
state.storages.get(&self.hash_key(address.as_ref())).cloned().unwrap_or_default();
hashed_storage.extend(&storage);
self.historical.storage_multiproof(address, slots, hashed_storage)
}
Expand Down Expand Up @@ -218,6 +218,24 @@ macro_rules! impl_state_provider {
}
}

impl $($tokens)* HashedPostStateProvider for $type {
fn hashed_post_state(&self, bundle_state: &BundleState) -> HashedPostState {
self.historical.hashed_post_state(bundle_state)
}
}

impl $($tokens)* HashedStorageProvider for $type {
fn hashed_storage(&self, account: &BundleAccount) -> HashedStorage {
self.historical.hashed_storage(account)
}
}

impl $($tokens)* KeyHasherProvider for $type {
fn hash_key(&self, bytes: &[u8]) -> B256 {
self.historical.hash_key(bytes)
}
}

impl $($tokens)* StateProvider for $type {
fn storage(
&self,
Expand Down
14 changes: 7 additions & 7 deletions crates/engine/invalid-block-hooks/src/witness.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use alloy_consensus::Header;
use alloy_primitives::{keccak256, B256, U256};
use alloy_primitives::{B256, U256};
use alloy_rpc_types_debug::ExecutionWitness;
use eyre::OptionExt;
use pretty_assertions::Comparison;
Expand All @@ -18,7 +18,7 @@ use reth_revm::{
use reth_rpc_api::DebugApiClient;
use reth_scroll_execution::FinalizeExecution;
use reth_tracing::tracing::warn;
use reth_trie::{updates::TrieUpdates, HashedPostState, HashedStorage};
use reth_trie::{updates::TrieUpdates, HashedStorage};
use serde::Serialize;
use std::{collections::HashMap, fmt::Debug, fs::File, io::Write, path::PathBuf};

Expand Down Expand Up @@ -69,9 +69,9 @@ where
// Setup database.
let provider = self.provider.state_by_block_hash(parent_header.hash())?;
#[cfg(not(feature = "scroll"))]
let state = reth_revm::database::StateProviderDatabase::new(provider);
let state = reth_revm::database::StateProviderDatabase::new(&provider);
#[cfg(feature = "scroll")]
let state = reth_scroll_storage::ScrollStateProviderDatabase::new(provider);
let state = reth_scroll_storage::ScrollStateProviderDatabase::new(&provider);
let mut db = StateBuilder::new().with_database(state).with_bundle_update().build();

// Setup environment for the execution.
Expand Down Expand Up @@ -127,9 +127,9 @@ where
//
// Note: We grab *all* accounts in the cache here, as the `BundleState` prunes
// referenced accounts + storage slots.
let mut hashed_state = HashedPostState::from_bundle_state(&bundle_state.state);
let mut hashed_state = db.database.hashed_post_state(&bundle_state);
for (address, account) in db.cache.accounts {
let hashed_address = keccak256(address);
let hashed_address = provider.hash_key(address.as_ref());
#[cfg(feature = "scroll")]
let hashed_account = account.account.as_ref().map(|a| {
Into::<reth_scroll_revm::AccountInfo>::into((
Expand All @@ -152,7 +152,7 @@ where

for (slot, value) in account.storage {
let slot = B256::from(slot);
let hashed_slot = keccak256(slot);
let hashed_slot = provider.hash_key(slot.as_ref());
storage.storage.insert(hashed_slot, value);

state_preimages.insert(hashed_slot, alloy_rlp::encode(slot).into());
Expand Down
Loading

0 comments on commit d4374f1

Please sign in to comment.