refactor: unify EVM traits (#14920)

This commit is contained in:
Arsenii Kulikov
2025-03-10 12:52:55 +04:00
committed by GitHub
parent a1ca2dec4c
commit 91eb292e3e
44 changed files with 588 additions and 772 deletions

View File

@@ -17,13 +17,13 @@ use alloy_rpc_types_eth::{
use futures::Future;
use reth_errors::{ProviderError, RethError};
use reth_evm::{
execute::BlockExecutionStrategyFactory, ConfigureEvm, ConfigureEvmEnv, Evm, EvmEnv,
HaltReasonFor, InspectorFor, SpecFor, TransactionEnv,
ConfigureEvm, Evm, EvmEnv, EvmEnvFor, HaltReasonFor, InspectorFor, SpecFor, TransactionEnv,
TxEnvFor,
};
use reth_node_api::BlockBody;
use reth_node_api::{BlockBody, NodePrimitives};
use reth_primitives::{Recovered, SealedHeader};
use reth_primitives_traits::SignedTransaction;
use reth_provider::{BlockIdReader, ProviderHeader};
use reth_provider::{BlockIdReader, ProviderHeader, ProviderTx};
use reth_revm::{
database::StateProviderDatabase,
db::{CacheDB, State},
@@ -359,7 +359,7 @@ pub trait EthCall: EstimateCall + Call + LoadPendingBlock + LoadBlock + FullEthA
/// [`BlockId`].
fn create_access_list_with(
&self,
mut evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
mut evm_env: EvmEnvFor<Self::Evm>,
at: BlockId,
mut request: TransactionRequest,
) -> Result<AccessListResult, Self::Error>
@@ -432,7 +432,12 @@ pub trait EthCall: EstimateCall + Call + LoadPendingBlock + LoadBlock + FullEthA
/// Executes code on state.
pub trait Call:
LoadState<
Evm: ConfigureEvm<Header = ProviderHeader<Self::Provider>>,
Evm: ConfigureEvm<
Primitives: NodePrimitives<
BlockHeader = ProviderHeader<Self::Provider>,
SignedTx = ProviderTx<Self::Provider>,
>,
>,
Error: FromEvmError<Self::Evm>,
> + SpawnBlocking
{
@@ -459,13 +464,10 @@ pub trait Call:
fn transact<DB>(
&self,
db: DB,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
tx_env: <Self::Evm as ConfigureEvmEnv>::TxEnv,
evm_env: EvmEnvFor<Self::Evm>,
tx_env: TxEnvFor<Self::Evm>,
) -> Result<
(
ResultAndState<HaltReasonFor<Self::Evm>>,
(EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>, <Self::Evm as ConfigureEvmEnv>::TxEnv),
),
(ResultAndState<HaltReasonFor<Self::Evm>>, (EvmEnvFor<Self::Evm>, TxEnvFor<Self::Evm>)),
Self::Error,
>
where
@@ -483,19 +485,16 @@ pub trait Call:
fn transact_with_inspector<DB, I>(
&self,
db: DB,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
tx_env: <Self::Evm as ConfigureEvmEnv>::TxEnv,
evm_env: EvmEnvFor<Self::Evm>,
tx_env: TxEnvFor<Self::Evm>,
inspector: I,
) -> Result<
(
ResultAndState<HaltReasonFor<Self::Evm>>,
(EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>, <Self::Evm as ConfigureEvmEnv>::TxEnv),
),
(ResultAndState<HaltReasonFor<Self::Evm>>, (EvmEnvFor<Self::Evm>, TxEnvFor<Self::Evm>)),
Self::Error,
>
where
DB: Database<Error = ProviderError>,
I: InspectorFor<DB, Self::Evm>,
I: InspectorFor<Self::Evm, DB>,
{
let mut evm = self.evm_config().evm_with_env_and_inspector(db, evm_env.clone(), inspector);
let res = evm.transact(tx_env.clone()).map_err(Self::Error::from_evm_err)?;
@@ -512,13 +511,7 @@ pub trait Call:
overrides: EvmOverrides,
) -> impl Future<
Output = Result<
(
ResultAndState<HaltReasonFor<Self::Evm>>,
(
EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
<Self::Evm as ConfigureEvmEnv>::TxEnv,
),
),
(ResultAndState<HaltReasonFor<Self::Evm>>, (EvmEnvFor<Self::Evm>, TxEnvFor<Self::Evm>)),
Self::Error,
>,
> + Send
@@ -573,8 +566,8 @@ pub trait Call:
Self: LoadPendingBlock,
F: FnOnce(
StateCacheDbRefMutWrapper<'_, '_>,
EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
<Self::Evm as ConfigureEvmEnv>::TxEnv,
EvmEnvFor<Self::Evm>,
TxEnvFor<Self::Evm>,
) -> Result<R, Self::Error>
+ Send
+ 'static,
@@ -663,14 +656,13 @@ pub trait Call:
fn replay_transactions_until<'a, DB, I>(
&self,
db: &mut DB,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
evm_env: EvmEnvFor<Self::Evm>,
transactions: I,
target_tx_hash: B256,
) -> Result<usize, Self::Error>
where
DB: Database<Error = ProviderError> + DatabaseCommit,
I: IntoIterator<Item = Recovered<&'a <Self::Evm as ConfigureEvmEnv>::Transaction>>,
<Self::Evm as ConfigureEvmEnv>::Transaction: SignedTransaction,
I: IntoIterator<Item = Recovered<&'a ProviderTx<Self::Provider>>>,
{
let mut evm = self.evm_config().evm_with_env(db, evm_env);
let mut index = 0;
@@ -696,7 +688,7 @@ pub trait Call:
evm_env: &EvmEnv<SpecFor<Self::Evm>>,
request: TransactionRequest,
db: impl Database<Error: Into<EthApiError>>,
) -> Result<<Self::Evm as ConfigureEvmEnv>::TxEnv, Self::Error>;
) -> Result<TxEnvFor<Self::Evm>, Self::Error>;
/// Prepares the [`EvmEnv`] for execution of calls.
///
@@ -714,14 +706,11 @@ pub trait Call:
#[expect(clippy::type_complexity)]
fn prepare_call_env<DB>(
&self,
mut evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
mut evm_env: EvmEnvFor<Self::Evm>,
mut request: TransactionRequest,
db: &mut CacheDB<DB>,
overrides: EvmOverrides,
) -> Result<
(EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>, <Self::Evm as ConfigureEvmEnv>::TxEnv),
Self::Error,
>
) -> Result<(EvmEnvFor<Self::Evm>, TxEnvFor<Self::Evm>), Self::Error>
where
DB: DatabaseRef,
EthApiError: From<<DB as DatabaseRef>::Error>,

View File

@@ -7,7 +7,7 @@ use alloy_rpc_types_eth::{state::StateOverride, transaction::TransactionRequest,
use futures::Future;
use reth_chainspec::MIN_TRANSACTION_GAS;
use reth_errors::ProviderError;
use reth_evm::{ConfigureEvmEnv, Database, EvmEnv, TransactionEnv};
use reth_evm::{Database, EvmEnvFor, TransactionEnv, TxEnvFor};
use reth_provider::StateProvider;
use reth_revm::{database::StateProviderDatabase, db::CacheDB};
use reth_rpc_eth_types::{
@@ -35,7 +35,7 @@ pub trait EstimateCall: Call {
/// - `nonce` is set to `None`
fn estimate_gas_with<S>(
&self,
mut evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
mut evm_env: EvmEnvFor<Self::Evm>,
mut request: TransactionRequest,
state: S,
state_override: Option<StateOverride>,
@@ -287,8 +287,8 @@ pub trait EstimateCall: Call {
fn map_out_of_gas_err<DB>(
&self,
env_gas_limit: u64,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
mut tx_env: <Self::Evm as ConfigureEvmEnv>::TxEnv,
evm_env: EvmEnvFor<Self::Evm>,
mut tx_env: TxEnvFor<Self::Evm>,
db: &mut DB,
) -> Self::Error
where

View File

@@ -10,8 +10,8 @@ use futures::Future;
use reth_chainspec::{EthChainSpec, EthereumHardforks};
use reth_errors::{BlockExecutionError, BlockValidationError, RethError};
use reth_evm::{
execute::{BlockBuilder, BlockBuilderOutcome, BlockExecutionStrategyFactory},
ConfigureEvmEnv, Evm,
execute::{BlockBuilder, BlockBuilderOutcome},
ConfigureEvm, Evm, SpecFor,
};
use reth_node_api::NodePrimitives;
use reth_primitives::{InvalidTransactionError, RecoveredBlock, SealedHeader};
@@ -45,7 +45,7 @@ pub trait LoadPendingBlock:
+ ChainSpecProvider<ChainSpec: EthChainSpec + EthereumHardforks>
+ StateProviderFactory,
Pool: TransactionPool<Transaction: PoolTransaction<Consensus = ProviderTx<Self::Provider>>>,
Evm: BlockExecutionStrategyFactory<
Evm: ConfigureEvm<
Primitives: NodePrimitives<
BlockHeader = ProviderHeader<Self::Provider>,
SignedTx = ProviderTx<Self::Provider>,
@@ -73,7 +73,7 @@ pub trait LoadPendingBlock:
PendingBlockEnv<
ProviderBlock<Self::Provider>,
ProviderReceipt<Self::Provider>,
<Self::Evm as ConfigureEvmEnv>::Spec,
SpecFor<Self::Evm>,
>,
Self::Error,
> {
@@ -114,11 +114,11 @@ pub trait LoadPendingBlock:
Ok(PendingBlockEnv::new(evm_env, PendingBlockEnvOrigin::DerivedFromLatest(latest)))
}
/// Returns [`ConfigureEvmEnv::NextBlockEnvCtx`] for building a local pending block.
/// Returns [`ConfigureEvm::NextBlockEnvCtx`] for building a local pending block.
fn next_env_attributes(
&self,
parent: &SealedHeader<ProviderHeader<Self::Provider>>,
) -> Result<<Self::Evm as ConfigureEvmEnv>::NextBlockEnvCtx, Self::Error>;
) -> Result<<Self::Evm as ConfigureEvm>::NextBlockEnvCtx, Self::Error>;
/// Returns the locally built pending block
#[expect(clippy::type_complexity)]

View File

@@ -10,7 +10,7 @@ use alloy_serde::JsonStorageKey;
use futures::Future;
use reth_chainspec::{EthChainSpec, EthereumHardforks};
use reth_errors::RethError;
use reth_evm::{ConfigureEvmEnv, EvmEnvFor};
use reth_evm::{ConfigureEvm, EvmEnvFor};
use reth_provider::{
BlockIdReader, BlockNumReader, ChainSpecProvider, StateProvider, StateProviderBox,
StateProviderFactory,

View File

@@ -9,9 +9,10 @@ use futures::Future;
use reth_chainspec::ChainSpecProvider;
use reth_errors::ProviderError;
use reth_evm::{
system_calls::SystemCaller, ConfigureEvm, ConfigureEvmEnv, Database, Evm, EvmEnv,
HaltReasonFor, InspectorFor,
system_calls::SystemCaller, ConfigureEvm, Database, Evm, EvmEnvFor, HaltReasonFor,
InspectorFor, TxEnvFor,
};
use reth_node_api::NodePrimitives;
use reth_primitives::RecoveredBlock;
use reth_primitives_traits::{BlockBody, SignedTransaction};
use reth_provider::{BlockReader, ProviderBlock, ProviderHeader, ProviderTx};
@@ -33,31 +34,30 @@ pub trait Trace:
LoadState<
Provider: BlockReader,
Evm: ConfigureEvm<
Header = ProviderHeader<Self::Provider>,
Transaction = ProviderTx<Self::Provider>,
Primitives: NodePrimitives<
BlockHeader = ProviderHeader<Self::Provider>,
SignedTx = ProviderTx<Self::Provider>,
>,
>,
Error: FromEvmError<Self::Evm>,
>
{
/// Executes the [`EvmEnv`] against the given [Database] without committing state
/// Executes the [`reth_evm::EvmEnv`] against the given [Database] without committing state
/// changes.
#[expect(clippy::type_complexity)]
fn inspect<DB, I>(
&self,
db: DB,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
tx_env: <Self::Evm as ConfigureEvmEnv>::TxEnv,
evm_env: EvmEnvFor<Self::Evm>,
tx_env: TxEnvFor<Self::Evm>,
inspector: I,
) -> Result<
(
ResultAndState<HaltReasonFor<Self::Evm>>,
(EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>, <Self::Evm as ConfigureEvmEnv>::TxEnv),
),
(ResultAndState<HaltReasonFor<Self::Evm>>, (EvmEnvFor<Self::Evm>, TxEnvFor<Self::Evm>)),
Self::Error,
>
where
DB: Database<Error = ProviderError>,
I: InspectorFor<DB, Self::Evm>,
I: InspectorFor<Self::Evm, DB>,
{
let mut evm = self.evm_config().evm_with_env_and_inspector(db, evm_env.clone(), inspector);
let res = evm.transact(tx_env.clone()).map_err(Self::Error::from_evm_err)?;
@@ -68,13 +68,13 @@ pub trait Trace:
/// config.
///
/// The callback is then called with the [`TracingInspector`] and the [`ResultAndState`] after
/// the configured [`EvmEnv`] was inspected.
/// the configured [`reth_evm::EvmEnv`] was inspected.
///
/// Caution: this is blocking
fn trace_at<F, R>(
&self,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
tx_env: <Self::Evm as ConfigureEvmEnv>::TxEnv,
evm_env: EvmEnvFor<Self::Evm>,
tx_env: TxEnvFor<Self::Evm>,
config: TracingInspectorConfig,
at: BlockId,
f: F,
@@ -100,11 +100,11 @@ pub trait Trace:
/// config.
///
/// The callback is then called with the [`TracingInspector`] and the [`ResultAndState`] after
/// the configured [`EvmEnv`] was inspected.
/// the configured [`reth_evm::EvmEnv`] was inspected.
fn spawn_trace_at_with_state<F, R>(
&self,
evm_env: EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
tx_env: <Self::Evm as ConfigureEvmEnv>::TxEnv,
evm_env: EvmEnvFor<Self::Evm>,
tx_env: TxEnvFor<Self::Evm>,
config: TracingInspectorConfig,
at: BlockId,
f: F,
@@ -185,7 +185,7 @@ pub trait Trace:
+ Send
+ 'static,
Insp:
for<'a, 'b> InspectorFor<StateCacheDbRefMutWrapper<'a, 'b>, Self::Evm> + Send + 'static,
for<'a, 'b> InspectorFor<Self::Evm, StateCacheDbRefMutWrapper<'a, 'b>> + Send + 'static,
R: Send + 'static,
{
async move {
@@ -292,7 +292,7 @@ pub trait Trace:
+ 'static,
Setup: FnMut() -> Insp + Send + 'static,
Insp:
for<'a, 'b> InspectorFor<StateCacheDbRefMutWrapper<'a, 'b>, Self::Evm> + Send + 'static,
for<'a, 'b> InspectorFor<Self::Evm, StateCacheDbRefMutWrapper<'a, 'b>> + Send + 'static,
R: Send + 'static,
{
async move {
@@ -451,7 +451,7 @@ pub trait Trace:
+ 'static,
Setup: FnMut() -> Insp + Send + 'static,
Insp:
for<'a, 'b> InspectorFor<StateCacheDbRefMutWrapper<'a, 'b>, Self::Evm> + Send + 'static,
for<'a, 'b> InspectorFor<Self::Evm, StateCacheDbRefMutWrapper<'a, 'b>> + Send + 'static,
R: Send + 'static,
{
self.trace_block_until_with_inspector(block_id, block, None, insp_setup, f)
@@ -466,7 +466,7 @@ pub trait Trace:
&self,
block: &RecoveredBlock<ProviderBlock<Self::Provider>>,
db: &mut DB,
evm_env: &EvmEnv<<Self::Evm as ConfigureEvmEnv>::Spec>,
evm_env: &EvmEnvFor<Self::Evm>,
) -> Result<(), Self::Error> {
let mut system_caller = SystemCaller::new(self.provider().chain_spec());