evm: use Header AT in ConfigureEvmEnv (#10968)

This commit is contained in:
Thomas Coratger
2024-09-18 01:03:15 +02:00
committed by GitHub
parent a8078f66dd
commit 5e9f38164d
42 changed files with 220 additions and 134 deletions

View File

@ -9,7 +9,9 @@ use reth_evm::{
system_calls::{apply_beacon_root_contract_call, apply_blockhashes_contract_call},
ConfigureEvm,
};
use reth_primitives::{keccak256, Receipt, SealedBlockWithSenders, SealedHeader, B256, U256};
use reth_primitives::{
keccak256, Header, Receipt, SealedBlockWithSenders, SealedHeader, B256, U256,
};
use reth_provider::{BlockExecutionOutput, ChainSpecProvider, StateProviderFactory};
use reth_revm::{
database::StateProviderDatabase,
@ -50,7 +52,7 @@ impl<P, EvmConfig> InvalidBlockWitnessHook<P, EvmConfig> {
impl<P, EvmConfig> InvalidBlockWitnessHook<P, EvmConfig>
where
P: StateProviderFactory + ChainSpecProvider<ChainSpec = ChainSpec> + Send + Sync + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
fn on_invalid_block(
&self,
@ -236,7 +238,7 @@ where
impl<P, EvmConfig> InvalidBlockHook for InvalidBlockWitnessHook<P, EvmConfig>
where
P: StateProviderFactory + ChainSpecProvider<ChainSpec = ChainSpec> + Send + Sync + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
fn on_invalid_block(
&self,

View File

@ -105,7 +105,7 @@ where
S: Stream<Item = BeaconEngineMessage<Engine>>,
Engine: EngineTypes,
Provider: BlockReader + StateProviderFactory,
Evm: ConfigureEvm,
Evm: ConfigureEvm<Header = Header>,
{
type Item = S::Item;
@ -237,7 +237,7 @@ fn create_reorg_head<Provider, Evm>(
) -> RethResult<(ExecutionPayload, Option<CancunPayloadFields>)>
where
Provider: BlockReader + StateProviderFactory,
Evm: ConfigureEvm,
Evm: ConfigureEvm<Header = Header>,
{
let chain_spec = payload_validator.chain_spec();

View File

@ -67,7 +67,7 @@ impl<EvmConfig> EthExecutorProvider<EvmConfig> {
impl<EvmConfig> EthExecutorProvider<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
fn eth_executor<DB>(&self, db: DB) -> EthBlockExecutor<EvmConfig, DB>
where
@ -83,7 +83,7 @@ where
impl<EvmConfig> BlockExecutorProvider for EthExecutorProvider<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
type Executor<DB: Database<Error: Into<ProviderError> + Display>> =
EthBlockExecutor<EvmConfig, DB>;
@ -126,7 +126,7 @@ struct EthEvmExecutor<EvmConfig> {
impl<EvmConfig> EthEvmExecutor<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
/// Executes the transactions in the block and returns the receipts of the transactions in the
/// block, the total gas used and the list of EIP-7685 [requests](Request).
@ -267,7 +267,7 @@ impl<EvmConfig, DB> EthBlockExecutor<EvmConfig, DB> {
impl<EvmConfig, DB> EthBlockExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
/// Configures a new evm configuration and block environment for the given block.
@ -356,7 +356,7 @@ where
impl<EvmConfig, DB> Executor<DB> for EthBlockExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>;
@ -391,7 +391,7 @@ pub struct BlockAccessListExecutor<EvmConfig, DB> {
impl<EvmConfig, DB> Executor<DB> for BlockAccessListExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>;
@ -485,7 +485,7 @@ impl<EvmConfig, DB> EthBatchExecutor<EvmConfig, DB> {
impl<EvmConfig, DB> BatchExecutor<DB> for EthBatchExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>;

View File

@ -122,9 +122,29 @@ impl ConfigureEvmEnv for EthEvmConfig {
cfg_env.handler_cfg.spec_id = spec_id;
}
fn fill_block_env(&self, block_env: &mut BlockEnv, header: &Self::Header, after_merge: bool) {
block_env.number = U256::from(header.number);
block_env.coinbase = header.beneficiary;
block_env.timestamp = U256::from(header.timestamp);
if after_merge {
block_env.prevrandao = Some(header.mix_hash);
block_env.difficulty = U256::ZERO;
} else {
block_env.difficulty = header.difficulty;
block_env.prevrandao = None;
}
block_env.basefee = U256::from(header.base_fee_per_gas.unwrap_or_default());
block_env.gas_limit = U256::from(header.gas_limit);
// EIP-4844 excess blob gas of this block, introduced in Cancun
if let Some(excess_blob_gas) = header.excess_blob_gas {
block_env.set_blob_excess_gas_and_price(excess_blob_gas);
}
}
fn next_cfg_and_block_env(
&self,
parent: &Header,
parent: &Self::Header,
attributes: NextBlockEnvAttributes,
) -> (CfgEnvWithHandlerCfg, BlockEnv) {
// configure evm env based on parent block

View File

@ -28,6 +28,7 @@ reth-beacon-consensus.workspace = true
reth-rpc.workspace = true
reth-node-api.workspace = true
reth-chainspec.workspace = true
reth-primitives.workspace = true
# misc
eyre.workspace = true

View File

@ -21,6 +21,7 @@ use reth_node_builder::{
BuilderContext, Node, PayloadBuilderConfig, PayloadTypes,
};
use reth_payload_builder::{PayloadBuilderHandle, PayloadBuilderService};
use reth_primitives::Header;
use reth_provider::CanonStateSubscriptions;
use reth_rpc::EthApi;
use reth_tracing::tracing::{debug, info};
@ -217,7 +218,7 @@ impl EthereumPayloadBuilder {
where
Types: NodeTypesWithEngine<ChainSpec = ChainSpec>,
Node: FullNodeTypes<Types = Types>,
Evm: ConfigureEvm,
Evm: ConfigureEvm<Header = Header>,
Pool: TransactionPool + Unpin + 'static,
Types::Engine: PayloadTypes<
BuiltPayload = EthBuiltPayload,

View File

@ -67,7 +67,7 @@ impl<EvmConfig> EthereumPayloadBuilder<EvmConfig> {
impl<EvmConfig> EthereumPayloadBuilder<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
/// Returns the configured [`CfgEnvWithHandlerCfg`] and [`BlockEnv`] for the targeted payload
/// (that has the `parent` as its parent).
@ -88,7 +88,7 @@ where
// Default implementation of [PayloadBuilder] for unit type
impl<EvmConfig, Pool, Client> PayloadBuilder<Pool, Client> for EthereumPayloadBuilder<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
Client: StateProviderFactory,
Pool: TransactionPool,
{
@ -137,7 +137,7 @@ pub fn default_ethereum_payload<EvmConfig, Pool, Client>(
initialized_block_env: BlockEnv,
) -> Result<BuildOutcome<EthBuiltPayload>, PayloadBuilderError>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
Client: StateProviderFactory,
Pool: TransactionPool,
{

View File

@ -14,9 +14,7 @@ extern crate alloc;
use core::ops::Deref;
use crate::builder::RethEvmBuilder;
use reth_primitives::{
Address, Header, TransactionSigned, TransactionSignedEcRecovered, B256, U256,
};
use reth_primitives::{Address, TransactionSigned, TransactionSignedEcRecovered, B256, U256};
use revm::{Database, Evm, GetInspector};
use revm_primitives::{
BlockEnv, Bytes, CfgEnvWithHandlerCfg, Env, EnvWithHandlerCfg, SpecId, TxEnv,
@ -139,30 +137,12 @@ pub trait ConfigureEvmEnv: Send + Sync + Unpin + Clone + 'static {
fn fill_cfg_env(
&self,
cfg_env: &mut CfgEnvWithHandlerCfg,
header: &Header,
header: &Self::Header,
total_difficulty: U256,
);
/// Fill [`BlockEnv`] field according to the chain spec and given header
fn fill_block_env(&self, block_env: &mut BlockEnv, header: &Header, after_merge: bool) {
block_env.number = U256::from(header.number);
block_env.coinbase = header.beneficiary;
block_env.timestamp = U256::from(header.timestamp);
if after_merge {
block_env.prevrandao = Some(header.mix_hash);
block_env.difficulty = U256::ZERO;
} else {
block_env.difficulty = header.difficulty;
block_env.prevrandao = None;
}
block_env.basefee = U256::from(header.base_fee_per_gas.unwrap_or_default());
block_env.gas_limit = U256::from(header.gas_limit);
// EIP-4844 excess blob gas of this block, introduced in Cancun
if let Some(excess_blob_gas) = header.excess_blob_gas {
block_env.set_blob_excess_gas_and_price(excess_blob_gas);
}
}
fn fill_block_env(&self, block_env: &mut BlockEnv, header: &Self::Header, after_merge: bool);
/// Convenience function to call both [`fill_cfg_env`](ConfigureEvmEnv::fill_cfg_env) and
/// [`ConfigureEvmEnv::fill_block_env`].
@ -172,7 +152,7 @@ pub trait ConfigureEvmEnv: Send + Sync + Unpin + Clone + 'static {
&self,
cfg: &mut CfgEnvWithHandlerCfg,
block_env: &mut BlockEnv,
header: &Header,
header: &Self::Header,
total_difficulty: U256,
) {
self.fill_cfg_env(cfg, header, total_difficulty);
@ -187,7 +167,7 @@ pub trait ConfigureEvmEnv: Send + Sync + Unpin + Clone + 'static {
/// the CL, such as the timestamp, suggested fee recipient, and randomness value.
fn next_cfg_and_block_env(
&self,
parent: &Header,
parent: &Self::Header,
attributes: NextBlockEnvAttributes,
) -> (CfgEnvWithHandlerCfg, BlockEnv);
}

View File

@ -22,7 +22,7 @@ pub trait EvmEnvProvider: Send + Sync {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv;
EvmConfig: ConfigureEvmEnv<Header = Header>;
/// Fills the default [`CfgEnvWithHandlerCfg`] and [BlockEnv] fields with values specific to the
/// given [Header].
@ -32,7 +32,7 @@ pub trait EvmEnvProvider: Send + Sync {
evm_config: EvmConfig,
) -> ProviderResult<(CfgEnvWithHandlerCfg, BlockEnv)>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let mut cfg = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), SpecId::LATEST);
let mut block_env = BlockEnv::default();
@ -50,7 +50,7 @@ pub trait EvmEnvProvider: Send + Sync {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv;
EvmConfig: ConfigureEvmEnv<Header = Header>;
/// Fills the [`CfgEnvWithHandlerCfg`] fields with values specific to the given
/// [BlockHashOrNumber].
@ -61,7 +61,7 @@ pub trait EvmEnvProvider: Send + Sync {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv;
EvmConfig: ConfigureEvmEnv<Header = Header>;
/// Fills the [`CfgEnvWithHandlerCfg`] fields with values specific to the given [Header].
fn fill_cfg_env_with_header<EvmConfig>(
@ -71,5 +71,5 @@ pub trait EvmEnvProvider: Send + Sync {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv;
EvmConfig: ConfigureEvmEnv<Header = Header>;
}

View File

@ -7,6 +7,7 @@ use crate::ConfigureEvm;
use core::fmt::Display;
use reth_chainspec::{ChainSpec, EthereumHardforks};
use reth_execution_errors::{BlockExecutionError, BlockValidationError};
use reth_primitives::Header;
use revm::{interpreter::Host, Database, DatabaseCommit, Evm};
use revm_primitives::{BlockEnv, CfgEnvWithHandlerCfg, EnvWithHandlerCfg, ResultAndState, B256};
@ -28,7 +29,7 @@ pub fn pre_block_blockhashes_contract_call<EvmConfig, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
// Apply the pre-block EIP-2935 contract call
let mut evm_pre_block = Evm::builder()
@ -74,7 +75,7 @@ pub fn transact_blockhashes_contract_call<EvmConfig, EXT, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: core::fmt::Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
if !chain_spec.is_prague_active_at_timestamp(block_timestamp) {
return Ok(None)
@ -133,7 +134,7 @@ pub fn apply_blockhashes_contract_call<EvmConfig, EXT, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: core::fmt::Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
if let Some(res) = transact_blockhashes_contract_call(
evm_config,

View File

@ -11,7 +11,7 @@ use alloy_eips::{
};
use reth_chainspec::{ChainSpec, EthereumHardforks};
use reth_execution_errors::{BlockExecutionError, BlockValidationError};
use reth_primitives::{Buf, Request};
use reth_primitives::{Buf, Header, Request};
use revm::{interpreter::Host, Database, DatabaseCommit, Evm};
use revm_primitives::{
Address, BlockEnv, Bytes, CfgEnvWithHandlerCfg, EnvWithHandlerCfg, ExecutionResult, FixedBytes,
@ -39,7 +39,7 @@ pub fn pre_block_beacon_root_contract_call<EvmConfig, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
// apply pre-block EIP-4788 contract call
let mut evm_pre_block = Evm::builder()
@ -81,7 +81,7 @@ pub fn apply_beacon_root_contract_call<EvmConfig, EXT, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: core::fmt::Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
if !chain_spec.is_cancun_active_at_timestamp(block_timestamp) {
return Ok(())
@ -152,7 +152,7 @@ pub fn post_block_withdrawal_requests_contract_call<EvmConfig, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
// apply post-block EIP-7002 contract call
let mut evm_post_block = Evm::builder()
@ -180,7 +180,7 @@ pub fn apply_withdrawal_requests_contract_call<EvmConfig, EXT, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: core::fmt::Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
// get previous env
let previous_env = Box::new(evm.context.env().clone());
@ -282,7 +282,7 @@ pub fn post_block_consolidation_requests_contract_call<EvmConfig, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
// apply post-block EIP-7251 contract call
let mut evm_post_block = Evm::builder()
@ -310,7 +310,7 @@ pub fn apply_consolidation_requests_contract_call<EvmConfig, EXT, DB>(
where
DB: Database + DatabaseCommit,
DB::Error: core::fmt::Display,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
// get previous env
let previous_env = Box::new(evm.context.env().clone());

View File

@ -22,3 +22,4 @@ reth-tasks.workspace = true
reth-rpc-eth-api.workspace = true
reth-network-api.workspace = true
reth-node-types.workspace = true
reth-primitives.workspace = true

View File

@ -6,6 +6,7 @@ use reth_evm::execute::BlockExecutorProvider;
use reth_network_api::FullNetwork;
use reth_node_types::{NodeTypesWithDB, NodeTypesWithEngine};
use reth_payload_builder::PayloadBuilderHandle;
use reth_primitives::Header;
use reth_provider::FullProvider;
use reth_rpc_eth_api::EthApiTypes;
use reth_tasks::TaskExecutor;
@ -48,7 +49,7 @@ pub trait FullNodeComponents: FullNodeTypes + Clone + 'static {
type Pool: TransactionPool + Unpin;
/// The node's EVM configuration, defining settings for the Ethereum Virtual Machine.
type Evm: ConfigureEvm;
type Evm: ConfigureEvm<Header = Header>;
/// The type that knows how to execute blocks.
type Executor: BlockExecutorProvider;

View File

@ -4,6 +4,7 @@ use std::{future::Future, marker::PhantomData};
use reth_consensus::Consensus;
use reth_evm::execute::BlockExecutorProvider;
use reth_primitives::Header;
use reth_transaction_pool::TransactionPool;
use crate::{
@ -371,7 +372,7 @@ where
F: FnOnce(&BuilderContext<Node>) -> Fut + Send,
Fut: Future<Output = eyre::Result<Components<Node, Pool, EVM, Executor, Cons>>> + Send,
Pool: TransactionPool + Unpin + 'static,
EVM: ConfigureEvm,
EVM: ConfigureEvm<Header = Header>,
Executor: BlockExecutorProvider,
Cons: Consensus + Clone + Unpin + 'static,
{

View File

@ -2,6 +2,7 @@
use crate::{BuilderContext, FullNodeTypes};
use reth_evm::execute::BlockExecutorProvider;
use reth_node_api::ConfigureEvm;
use reth_primitives::Header;
use std::future::Future;
/// A type that knows how to build the executor types.
@ -9,7 +10,7 @@ pub trait ExecutorBuilder<Node: FullNodeTypes>: Send {
/// The EVM config to use.
///
/// This provides the node with the necessary configuration to configure an EVM.
type EVM: ConfigureEvm;
type EVM: ConfigureEvm<Header = Header>;
/// The type that knows how to execute blocks.
type Executor: BlockExecutorProvider;
@ -24,7 +25,7 @@ pub trait ExecutorBuilder<Node: FullNodeTypes>: Send {
impl<Node, F, Fut, EVM, Executor> ExecutorBuilder<Node> for F
where
Node: FullNodeTypes,
EVM: ConfigureEvm,
EVM: ConfigureEvm<Header = Header>,
Executor: BlockExecutorProvider,
F: FnOnce(&BuilderContext<Node>) -> Fut + Send,
Fut: Future<Output = eyre::Result<(EVM, Executor)>> + Send,

View File

@ -27,6 +27,7 @@ use reth_network::NetworkHandle;
use reth_network_api::FullNetwork;
use reth_node_api::NodeTypesWithEngine;
use reth_payload_builder::PayloadBuilderHandle;
use reth_primitives::Header;
use reth_transaction_pool::TransactionPool;
use crate::{ConfigureEvm, FullNodeTypes};
@ -41,7 +42,7 @@ pub trait NodeComponents<T: FullNodeTypes>: Clone + Unpin + Send + Sync + 'stati
type Pool: TransactionPool + Unpin;
/// The node's EVM configuration, defining settings for the Ethereum Virtual Machine.
type Evm: ConfigureEvm;
type Evm: ConfigureEvm<Header = Header>;
/// The type that knows how to execute blocks.
type Executor: BlockExecutorProvider;
@ -95,7 +96,7 @@ impl<Node, Pool, EVM, Executor, Cons> NodeComponents<Node>
where
Node: FullNodeTypes,
Pool: TransactionPool + Unpin + 'static,
EVM: ConfigureEvm,
EVM: ConfigureEvm<Header = Header>,
Executor: BlockExecutorProvider,
Cons: Consensus + Clone + Unpin + 'static,
{
@ -136,7 +137,7 @@ impl<Node, Pool, EVM, Executor, Cons> Clone for Components<Node, Pool, EVM, Exec
where
Node: FullNodeTypes,
Pool: TransactionPool,
EVM: ConfigureEvm,
EVM: ConfigureEvm<Header = Header>,
Executor: BlockExecutorProvider,
Cons: Consensus + Clone,
{

View File

@ -59,7 +59,7 @@ impl<EvmConfig> OpExecutorProvider<EvmConfig> {
impl<EvmConfig> OpExecutorProvider<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
fn op_executor<DB>(&self, db: DB) -> OpBlockExecutor<EvmConfig, DB>
where
@ -75,7 +75,7 @@ where
impl<EvmConfig> BlockExecutorProvider for OpExecutorProvider<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
type Executor<DB: Database<Error: Into<ProviderError> + Display>> =
OpBlockExecutor<EvmConfig, DB>;
@ -109,7 +109,7 @@ pub struct OpEvmExecutor<EvmConfig> {
impl<EvmConfig> OpEvmExecutor<EvmConfig>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
/// Executes the transactions in the block and returns the receipts.
///
@ -262,7 +262,7 @@ impl<EvmConfig, DB> OpBlockExecutor<EvmConfig, DB> {
impl<EvmConfig, DB> OpBlockExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
/// Configures a new evm configuration and block environment for the given block.
@ -335,7 +335,7 @@ where
impl<EvmConfig, DB> Executor<DB> for OpBlockExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>;
@ -376,7 +376,7 @@ pub struct OpBlockAccessListExecutor<EvmConfig, DB> {
impl<EvmConfig, DB> Executor<DB> for OpBlockAccessListExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>;
@ -472,7 +472,7 @@ impl<EvmConfig, DB> OpBatchExecutor<EvmConfig, DB> {
impl<EvmConfig, DB> BatchExecutor<DB> for OpBatchExecutor<EvmConfig, DB>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
DB: Database<Error: Into<ProviderError> + Display>,
{
type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>;

View File

@ -106,7 +106,7 @@ impl ConfigureEvmEnv for OptimismEvmConfig {
fn fill_cfg_env(
&self,
cfg_env: &mut CfgEnvWithHandlerCfg,
header: &Header,
header: &Self::Header,
total_difficulty: U256,
) {
let spec_id = revm_spec(
@ -127,9 +127,29 @@ impl ConfigureEvmEnv for OptimismEvmConfig {
cfg_env.handler_cfg.is_optimism = self.chain_spec.is_optimism();
}
fn fill_block_env(&self, block_env: &mut BlockEnv, header: &Self::Header, after_merge: bool) {
block_env.number = U256::from(header.number);
block_env.coinbase = header.beneficiary;
block_env.timestamp = U256::from(header.timestamp);
if after_merge {
block_env.prevrandao = Some(header.mix_hash);
block_env.difficulty = U256::ZERO;
} else {
block_env.difficulty = header.difficulty;
block_env.prevrandao = None;
}
block_env.basefee = U256::from(header.base_fee_per_gas.unwrap_or_default());
block_env.gas_limit = U256::from(header.gas_limit);
// EIP-4844 excess blob gas of this block, introduced in Cancun
if let Some(excess_blob_gas) = header.excess_blob_gas {
block_env.set_blob_excess_gas_and_price(excess_blob_gas);
}
}
fn next_cfg_and_block_env(
&self,
parent: &Header,
parent: &Self::Header,
attributes: NextBlockEnvAttributes,
) -> (CfgEnvWithHandlerCfg, BlockEnv) {
// configure evm env based on parent block

View File

@ -20,6 +20,7 @@ use reth_optimism_chainspec::OpChainSpec;
use reth_optimism_consensus::OptimismBeaconConsensus;
use reth_optimism_rpc::OpEthApi;
use reth_payload_builder::{PayloadBuilderHandle, PayloadBuilderService};
use reth_primitives::Header;
use reth_provider::CanonStateSubscriptions;
use reth_tracing::tracing::{debug, info};
use reth_transaction_pool::{
@ -254,7 +255,7 @@ impl OptimismPayloadBuilder {
Types: NodeTypesWithEngine<Engine = OptimismEngineTypes, ChainSpec = ChainSpec>,
>,
Pool: TransactionPool + Unpin + 'static,
Evm: ConfigureEvm,
Evm: ConfigureEvm<Header = Header>,
{
let payload_builder =
reth_optimism_payload_builder::OptimismPayloadBuilder::new(evm_config)

View File

@ -70,7 +70,7 @@ impl<EvmConfig> OptimismPayloadBuilder<EvmConfig> {
}
impl<EvmConfig> OptimismPayloadBuilder<EvmConfig>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
/// Returns the configured [`CfgEnvWithHandlerCfg`] and [`BlockEnv`] for the targeted payload
/// (that has the `parent` as its parent).
@ -93,7 +93,7 @@ impl<Pool, Client, EvmConfig> PayloadBuilder<Pool, Client> for OptimismPayloadBu
where
Client: StateProviderFactory,
Pool: TransactionPool,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
type Attributes = OptimismPayloadBuilderAttributes;
type BuiltPayload = OptimismBuiltPayload;
@ -161,7 +161,7 @@ pub(crate) fn optimism_payload<EvmConfig, Pool, Client>(
_compute_pending_block: bool,
) -> Result<BuildOutcome<OptimismBuiltPayload>, PayloadBuilderError>
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
Client: StateProviderFactory,
Pool: TransactionPool,
{

View File

@ -2,7 +2,10 @@ use alloy_primitives::{Bytes, TxKind, U256};
use reth_chainspec::ChainSpec;
use reth_evm::ConfigureEvm;
use reth_node_api::{FullNodeComponents, NodeTypes};
use reth_primitives::revm_primitives::{BlockEnv, OptimismFields, TxEnv};
use reth_primitives::{
revm_primitives::{BlockEnv, OptimismFields, TxEnv},
Header,
};
use reth_rpc_eth_api::{
helpers::{Call, EthCall, LoadState, SpawnBlocking},
FromEthApiError, IntoEthApiError,
@ -31,7 +34,7 @@ where
}
#[inline]
fn evm_config(&self) -> &impl ConfigureEvm {
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header> {
self.inner.evm_config()
}

View File

@ -18,6 +18,7 @@ use reth_evm::ConfigureEvm;
use reth_network_api::NetworkInfo;
use reth_node_api::{BuilderProvider, FullNodeComponents, FullNodeTypes, NodeTypes};
use reth_node_builder::EthApiBuilderCtx;
use reth_primitives::Header;
use reth_provider::{
BlockIdReader, BlockNumReader, BlockReaderIdExt, CanonStateSubscriptions, ChainSpecProvider,
HeaderProvider, StageCheckpointReader, StateProviderFactory,
@ -230,7 +231,7 @@ where
N: FullNodeComponents,
{
#[inline]
fn evm_config(&self) -> &impl ConfigureEvm {
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header> {
self.inner.evm_config()
}
}

View File

@ -5,7 +5,7 @@ use reth_chainspec::ChainSpec;
use reth_evm::ConfigureEvm;
use reth_node_api::{FullNodeComponents, NodeTypes};
use reth_primitives::{
revm_primitives::BlockEnv, BlockNumberOrTag, Receipt, SealedBlockWithSenders,
revm_primitives::BlockEnv, BlockNumberOrTag, Header, Receipt, SealedBlockWithSenders,
};
use reth_provider::{
BlockReader, BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, ExecutionOutcome,
@ -46,7 +46,7 @@ where
}
#[inline]
fn evm_config(&self) -> &impl ConfigureEvm {
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header> {
self.inner.evm_config()
}

View File

@ -29,6 +29,7 @@ reth-transaction-pool.workspace = true
reth-evm.workspace = true
reth-engine-primitives.workspace = true
reth-rpc-types.workspace = true
reth-primitives.workspace = true
# ethereum
alloy-network.workspace = true
@ -57,7 +58,6 @@ reth-network-peers.workspace = true
reth-evm-ethereum.workspace = true
reth-ethereum-engine-primitives.workspace = true
reth-payload-builder = { workspace = true, features = ["test-utils"] }
reth-primitives.workspace = true
reth-provider = { workspace = true, features = ["test-utils"] }
reth-rpc-api = { workspace = true, features = ["client"] }
reth-rpc-engine-api.workspace = true

View File

@ -1,4 +1,5 @@
use reth_evm::ConfigureEvm;
use reth_primitives::Header;
use reth_provider::{BlockReader, CanonStateSubscriptions, EvmEnvProvider, StateProviderFactory};
use reth_rpc::{EthFilter, EthPubSub};
use reth_rpc_eth_types::{
@ -75,7 +76,7 @@ impl<Provider, Pool, Network, Tasks, Events, EvmConfig, EthApi>
where
Provider: StateProviderFactory + BlockReader + EvmEnvProvider + Clone + Unpin + 'static,
Pool: Send + Sync + Clone + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
Network: Clone + 'static,
Tasks: TaskSpawner + Clone + 'static,
Events: CanonStateSubscriptions + Clone + 'static,

View File

@ -18,6 +18,7 @@
//! ```
//! use reth_evm::ConfigureEvm;
//! use reth_network_api::{NetworkInfo, Peers};
//! use reth_primitives::Header;
//! use reth_provider::{AccountReader, CanonStateSubscriptions, ChangeSetReader, FullRpcProvider};
//! use reth_rpc::EthApi;
//! use reth_rpc_builder::{
@ -37,7 +38,7 @@
//! Pool: TransactionPool + 'static,
//! Network: NetworkInfo + Peers + Clone + 'static,
//! Events: CanonStateSubscriptions + Clone + 'static,
//! EvmConfig: ConfigureEvm,
//! EvmConfig: ConfigureEvm<Header = Header>,
//! {
//! // configure the rpc module per transport
//! let transports = TransportRpcModuleConfig::default().with_http(vec![
@ -69,6 +70,7 @@
//! use reth_engine_primitives::EngineTypes;
//! use reth_evm::ConfigureEvm;
//! use reth_network_api::{NetworkInfo, Peers};
//! use reth_primitives::Header;
//! use reth_provider::{AccountReader, CanonStateSubscriptions, ChangeSetReader, FullRpcProvider};
//! use reth_rpc::EthApi;
//! use reth_rpc_api::EngineApiServer;
@ -94,7 +96,7 @@
//! Events: CanonStateSubscriptions + Clone + 'static,
//! EngineApi: EngineApiServer<EngineT>,
//! EngineT: EngineTypes,
//! EvmConfig: ConfigureEvm,
//! EvmConfig: ConfigureEvm<Header = Header>,
//! {
//! // configure the rpc module per transport
//! let transports = TransportRpcModuleConfig::default().with_http(vec![
@ -154,6 +156,7 @@ use reth_chainspec::ChainSpec;
use reth_engine_primitives::EngineTypes;
use reth_evm::ConfigureEvm;
use reth_network_api::{noop::NoopNetwork, NetworkInfo, Peers};
use reth_primitives::Header;
use reth_provider::{
AccountReader, BlockReader, CanonStateSubscriptions, ChainSpecProvider, ChangeSetReader,
EvmEnvProvider, FullRpcProvider, StateProviderFactory,
@ -228,7 +231,7 @@ where
Network: NetworkInfo + Peers + Clone + 'static,
Tasks: TaskSpawner + Clone + 'static,
Events: CanonStateSubscriptions + Clone + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
EthApi: FullEthApiServer<
NetworkTypes: alloy_network::Network<ReceiptResponse = AnyTransactionReceipt>,
>,
@ -416,7 +419,7 @@ where
Network: NetworkInfo + Peers + Clone + 'static,
Tasks: TaskSpawner + Clone + 'static,
Events: CanonStateSubscriptions + Clone + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
/// Configures all [`RpcModule`]s specific to the given [`TransportRpcModuleConfig`] which can
/// be used to start the transport server(s).
@ -467,13 +470,14 @@ where
/// ```no_run
/// use reth_evm::ConfigureEvm;
/// use reth_network_api::noop::NoopNetwork;
/// use reth_primitives::Header;
/// use reth_provider::test_utils::{NoopProvider, TestCanonStateSubscriptions};
/// use reth_rpc::EthApi;
/// use reth_rpc_builder::RpcModuleBuilder;
/// use reth_tasks::TokioTaskExecutor;
/// use reth_transaction_pool::noop::NoopTransactionPool;
///
/// fn init<Evm: ConfigureEvm + 'static>(evm: Evm) {
/// fn init<Evm: ConfigureEvm<Header = Header> + 'static>(evm: Evm) {
/// let mut registry = RpcModuleBuilder::default()
/// .with_provider(NoopProvider::default())
/// .with_pool(NoopTransactionPool::default())
@ -661,7 +665,7 @@ where
>,
) -> Self
where
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
let blocking_pool_guard = BlockingTaskGuard::new(config.eth.max_tracing_requests);

View File

@ -12,7 +12,7 @@ use reth_primitives::{
ResultAndState, TransactTo, TxEnv,
},
transaction::AccessListResult,
TransactionSignedEcRecovered,
Header, TransactionSignedEcRecovered,
};
use reth_provider::{ChainSpecProvider, StateProvider};
use reth_revm::{database::StateProviderDatabase, db::CacheDB, DatabaseRef};
@ -306,7 +306,7 @@ pub trait Call: LoadState + SpawnBlocking {
/// Returns a handle for reading evm config.
///
/// Data access in default (L1) trait method implementations.
fn evm_config(&self) -> &impl ConfigureEvm;
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header>;
/// Executes the closure with the state that corresponds to the given [`BlockId`].
fn with_state_at_block<F, R>(&self, at: BlockId, f: F) -> Result<R, Self::Error>

View File

@ -66,7 +66,7 @@ pub trait LoadPendingBlock: EthApiTypes {
/// Returns a handle for reading evm config.
///
/// Data access in default (L1) trait method implementations.
fn evm_config(&self) -> &impl ConfigureEvm;
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header>;
/// Configures the [`CfgEnvWithHandlerCfg`] and [`BlockEnv`] for the pending block
///

View File

@ -3,6 +3,7 @@
use alloy_primitives::B256;
use futures::Future;
use reth_evm::{ConfigureEvm, ConfigureEvmEnv};
use reth_primitives::Header;
use reth_revm::database::StateProviderDatabase;
use reth_rpc_eth_types::{
cache::db::{StateCacheDb, StateCacheDbRefMutWrapper, StateProviderTraitObjWrapper},
@ -22,7 +23,7 @@ pub trait Trace: LoadState {
/// Returns a handle for reading evm config.
///
/// Data access in default (L1) trait method implementations.
fn evm_config(&self) -> &impl ConfigureEvm;
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header>;
/// Executes the [`EnvWithHandlerCfg`] against the given [Database] without committing state
/// changes.

View File

@ -7,8 +7,8 @@ use reth_errors::{ProviderError, ProviderResult};
use reth_evm::{provider::EvmEnvProvider, ConfigureEvm};
use reth_execution_types::Chain;
use reth_primitives::{
Block, BlockHashOrNumber, BlockWithSenders, Receipt, SealedBlock, SealedBlockWithSenders,
TransactionSigned, TransactionSignedEcRecovered,
Block, BlockHashOrNumber, BlockWithSenders, Header, Receipt, SealedBlock,
SealedBlockWithSenders, TransactionSigned, TransactionSignedEcRecovered,
};
use reth_storage_api::{BlockReader, StateProviderFactory, TransactionVariant};
use reth_tasks::{TaskSpawner, TokioTaskExecutor};
@ -106,7 +106,7 @@ impl EthStateCache {
) -> Self
where
Provider: StateProviderFactory + BlockReader + EvmEnvProvider + Clone + Unpin + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
Self::spawn_with(provider, config, TokioTaskExecutor::default(), evm_config)
}
@ -124,7 +124,7 @@ impl EthStateCache {
where
Provider: StateProviderFactory + BlockReader + EvmEnvProvider + Clone + Unpin + 'static,
Tasks: TaskSpawner + Clone + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
let EthStateCacheConfig { max_blocks, max_receipts, max_envs, max_concurrent_db_requests } =
config;
@ -316,7 +316,7 @@ impl<Provider, Tasks, EvmConfig> EthStateCacheService<Provider, Tasks, EvmConfig
where
Provider: StateProviderFactory + BlockReader + EvmEnvProvider + Clone + Unpin + 'static,
Tasks: TaskSpawner + Clone + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
fn on_new_block(&mut self, block_hash: B256, res: ProviderResult<Option<BlockWithSenders>>) {
if let Some(queued) = self.full_block_cache.remove(&block_hash) {
@ -403,7 +403,7 @@ impl<Provider, Tasks, EvmConfig> Future for EthStateCacheService<Provider, Tasks
where
Provider: StateProviderFactory + BlockReader + EvmEnvProvider + Clone + Unpin + 'static,
Tasks: TaskSpawner + Clone + 'static,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
type Output = ();

View File

@ -1,6 +1,7 @@
//! Contains RPC handler implementations specific to endpoints that call/execute within evm.
use reth_evm::ConfigureEvm;
use reth_primitives::Header;
use reth_rpc_eth_api::helpers::{Call, EthCall, LoadPendingBlock, LoadState, SpawnBlocking};
use crate::EthApi;
@ -13,7 +14,7 @@ impl<Provider, Pool, Network, EvmConfig> EthCall for EthApi<Provider, Pool, Netw
impl<Provider, Pool, Network, EvmConfig> Call for EthApi<Provider, Pool, Network, EvmConfig>
where
Self: LoadState + SpawnBlocking,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
#[inline]
fn call_gas_limit(&self) -> u64 {
@ -21,7 +22,7 @@ where
}
#[inline]
fn evm_config(&self) -> &impl ConfigureEvm {
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header> {
self.inner.evm_config()
}
}

View File

@ -2,6 +2,7 @@
use reth_chainspec::ChainSpec;
use reth_evm::ConfigureEvm;
use reth_primitives::Header;
use reth_provider::{BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProviderFactory};
use reth_rpc_eth_api::helpers::{LoadPendingBlock, SpawnBlocking};
use reth_rpc_eth_types::PendingBlock;
@ -18,7 +19,7 @@ where
+ ChainSpecProvider<ChainSpec = ChainSpec>
+ StateProviderFactory,
Pool: TransactionPool,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
#[inline]
fn provider(
@ -41,7 +42,7 @@ where
}
#[inline]
fn evm_config(&self) -> &impl ConfigureEvm {
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header> {
self.inner.evm_config()
}
}

View File

@ -1,6 +1,7 @@
//! Contains RPC handler implementations specific to tracing.
use reth_evm::ConfigureEvm;
use reth_primitives::Header;
use reth_rpc_eth_api::helpers::{LoadState, Trace};
use crate::EthApi;
@ -8,10 +9,10 @@ use crate::EthApi;
impl<Provider, Pool, Network, EvmConfig> Trace for EthApi<Provider, Pool, Network, EvmConfig>
where
Self: LoadState,
EvmConfig: ConfigureEvm,
EvmConfig: ConfigureEvm<Header = Header>,
{
#[inline]
fn evm_config(&self) -> &impl ConfigureEvm {
fn evm_config(&self) -> &impl ConfigureEvm<Header = Header> {
self.inner.evm_config()
}
}

View File

@ -1000,7 +1000,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider2<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?;
let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?;
@ -1015,7 +1015,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider2<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let total_difficulty = self
.header_td_by_number(header.number)?
@ -1031,7 +1031,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider2<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?;
let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?;
@ -1045,7 +1045,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider2<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let total_difficulty = self
.header_td_by_number(header.number)?

View File

@ -550,7 +550,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for ProviderFactory<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.provider()?.fill_env_at(cfg, block_env, at, evm_config)
}
@ -563,7 +563,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for ProviderFactory<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.provider()?.fill_env_with_header(cfg, block_env, header, evm_config)
}
@ -575,7 +575,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for ProviderFactory<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.provider()?.fill_cfg_env_at(cfg, at, evm_config)
}
@ -587,7 +587,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for ProviderFactory<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.provider()?.fill_cfg_env_with_header(cfg, header, evm_config)
}

View File

@ -2362,7 +2362,7 @@ impl<TX: DbTx> EvmEnvProvider for DatabaseProvider<TX> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?;
let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?;
@ -2377,7 +2377,7 @@ impl<TX: DbTx> EvmEnvProvider for DatabaseProvider<TX> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let total_difficulty = self
.header_td_by_number(header.number)?
@ -2393,7 +2393,7 @@ impl<TX: DbTx> EvmEnvProvider for DatabaseProvider<TX> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?;
let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?;
@ -2407,7 +2407,7 @@ impl<TX: DbTx> EvmEnvProvider for DatabaseProvider<TX> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
let total_difficulty = self
.header_td_by_number(header.number)?

View File

@ -524,7 +524,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.database.provider()?.fill_env_at(cfg, block_env, at, evm_config)
}
@ -537,7 +537,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.database.provider()?.fill_env_with_header(cfg, block_env, header, evm_config)
}
@ -549,7 +549,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.database.provider()?.fill_cfg_env_at(cfg, at, evm_config)
}
@ -561,7 +561,7 @@ impl<N: ProviderNodeTypes> EvmEnvProvider for BlockchainProvider<N> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
self.database.provider()?.fill_cfg_env_with_header(cfg, header, evm_config)
}

View File

@ -680,7 +680,7 @@ impl EvmEnvProvider for MockEthProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}
@ -693,7 +693,7 @@ impl EvmEnvProvider for MockEthProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}
@ -705,7 +705,7 @@ impl EvmEnvProvider for MockEthProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}
@ -717,7 +717,7 @@ impl EvmEnvProvider for MockEthProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}

View File

@ -404,7 +404,7 @@ impl EvmEnvProvider for NoopProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}
@ -417,7 +417,7 @@ impl EvmEnvProvider for NoopProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}
@ -429,7 +429,7 @@ impl EvmEnvProvider for NoopProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}
@ -441,7 +441,7 @@ impl EvmEnvProvider for NoopProvider {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: ConfigureEvmEnv,
EvmConfig: ConfigureEvmEnv<Header = Header>,
{
Ok(())
}