mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-04-30 03:01:58 -04:00
refactor: unify EVM traits (#14920)
This commit is contained in:
@@ -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>,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user