feat: make EthEvmConfig generic over chainSpec (#16758)

Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
This commit is contained in:
Luis_
2025-06-11 19:07:02 -05:00
committed by GitHub
parent af912c41f3
commit 1e40b36afc
4 changed files with 36 additions and 28 deletions

View File

@@ -1,19 +1,25 @@
use alloy_consensus::Header;
use reth_chainspec::{ChainSpec, EthereumHardforks};
use reth_ethereum_forks::EthereumHardfork;
use reth_chainspec::{EthChainSpec, EthereumHardforks};
use reth_ethereum_forks::{EthereumHardfork, Hardforks};
use revm::primitives::hardfork::SpecId;
/// Map the latest active hardfork at the given header to a revm [`SpecId`].
pub fn revm_spec(chain_spec: &ChainSpec, header: &Header) -> SpecId {
pub fn revm_spec<C>(chain_spec: &C, header: &Header) -> SpecId
where
C: EthereumHardforks + EthChainSpec + Hardforks,
{
revm_spec_by_timestamp_and_block_number(chain_spec, header.timestamp, header.number)
}
/// Map the latest active hardfork at the given timestamp or block number to a revm [`SpecId`].
pub fn revm_spec_by_timestamp_and_block_number(
chain_spec: &ChainSpec,
pub fn revm_spec_by_timestamp_and_block_number<C>(
chain_spec: &C,
timestamp: u64,
block_number: u64,
) -> SpecId {
) -> SpecId
where
C: EthereumHardforks + EthChainSpec + Hardforks,
{
if chain_spec
.fork(EthereumHardfork::Osaka)
.active_at_timestamp_or_number(timestamp, block_number)
@@ -83,8 +89,8 @@ pub fn revm_spec_by_timestamp_and_block_number(
SpecId::FRONTIER
} else {
panic!(
"invalid hardfork chainspec: expected at least one hardfork, got {:?}",
chain_spec.hardforks
"invalid hardfork chainspec: expected at least one hardfork, got {}",
chain_spec.display_hardforks()
)
}
}
@@ -199,55 +205,55 @@ mod tests {
#[test]
fn test_eth_spec() {
assert_eq!(
revm_spec(&MAINNET, &Header { timestamp: 1710338135, ..Default::default() }),
revm_spec(&*MAINNET, &Header { timestamp: 1710338135, ..Default::default() }),
SpecId::CANCUN
);
assert_eq!(
revm_spec(&MAINNET, &Header { timestamp: 1681338455, ..Default::default() }),
revm_spec(&*MAINNET, &Header { timestamp: 1681338455, ..Default::default() }),
SpecId::SHANGHAI
);
assert_eq!(
revm_spec(
&MAINNET,
&*MAINNET,
&Header { difficulty: U256::from(10_u128), number: 15537394, ..Default::default() }
),
SpecId::MERGE
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 15537394 - 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 15537394 - 10, ..Default::default() }),
SpecId::LONDON
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 12244000 + 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 12244000 + 10, ..Default::default() }),
SpecId::BERLIN
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 12244000 - 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 12244000 - 10, ..Default::default() }),
SpecId::ISTANBUL
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 7280000 + 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 7280000 + 10, ..Default::default() }),
SpecId::PETERSBURG
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 7280000 - 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 7280000 - 10, ..Default::default() }),
SpecId::BYZANTIUM
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 2675000 + 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 2675000 + 10, ..Default::default() }),
SpecId::SPURIOUS_DRAGON
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 2675000 - 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 2675000 - 10, ..Default::default() }),
SpecId::TANGERINE
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 1150000 + 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 1150000 + 10, ..Default::default() }),
SpecId::HOMESTEAD
);
assert_eq!(
revm_spec(&MAINNET, &Header { number: 1150000 - 10, ..Default::default() }),
revm_spec(&*MAINNET, &Header { number: 1150000 - 10, ..Default::default() }),
SpecId::FRONTIER
);
}

View File

@@ -41,8 +41,9 @@ use revm::{
mod config;
use alloy_eips::{eip1559::INITIAL_BASE_FEE, eip7840::BlobParams};
use alloy_evm::eth::spec::EthExecutorSpec;
pub use config::{revm_spec, revm_spec_by_timestamp_and_block_number};
use reth_ethereum_forks::EthereumHardfork;
use reth_ethereum_forks::{EthereumHardfork, Hardforks};
/// Helper type with backwards compatible methods to obtain Ethereum executor
/// providers.
@@ -67,11 +68,11 @@ pub use test_utils::*;
/// Ethereum-related EVM configuration.
#[derive(Debug, Clone)]
pub struct EthEvmConfig<EvmFactory = EthEvmFactory> {
pub struct EthEvmConfig<C = ChainSpec, EvmFactory = EthEvmFactory> {
/// Inner [`EthBlockExecutorFactory`].
pub executor_factory: EthBlockExecutorFactory<RethReceiptBuilder, Arc<ChainSpec>, EvmFactory>,
pub executor_factory: EthBlockExecutorFactory<RethReceiptBuilder, Arc<C>, EvmFactory>,
/// Ethereum block assembler.
pub block_assembler: EthBlockAssembler<ChainSpec>,
pub block_assembler: EthBlockAssembler<C>,
}
impl EthEvmConfig {
@@ -91,7 +92,7 @@ impl EthEvmConfig {
}
}
impl<EvmFactory> EthEvmConfig<EvmFactory> {
impl<ChainSpec, EvmFactory> EthEvmConfig<ChainSpec, EvmFactory> {
/// Creates a new Ethereum EVM configuration with the given chain spec and EVM factory.
pub fn new_with_evm_factory(chain_spec: Arc<ChainSpec>, evm_factory: EvmFactory) -> Self {
Self {
@@ -116,8 +117,9 @@ impl<EvmFactory> EthEvmConfig<EvmFactory> {
}
}
impl<EvmF> ConfigureEvm for EthEvmConfig<EvmF>
impl<ChainSpec, EvmF> ConfigureEvm for EthEvmConfig<ChainSpec, EvmF>
where
ChainSpec: EthExecutorSpec + EthChainSpec + Hardforks + 'static,
EvmF: EvmFactory<
Tx: TransactionEnv
+ FromRecoveredTx<TransactionSigned>

View File

@@ -84,7 +84,7 @@ impl<Node> ExecutorBuilder<Node> for MyExecutorBuilder
where
Node: FullNodeTypes<Types: NodeTypes<ChainSpec = ChainSpec, Primitives = EthPrimitives>>,
{
type EVM = EthEvmConfig<MyEvmFactory>;
type EVM = EthEvmConfig<ChainSpec, MyEvmFactory>;
async fn build_evm(self, ctx: &BuilderContext<Node>) -> eyre::Result<Self::EVM> {
let evm_config =

View File

@@ -166,7 +166,7 @@ impl<Node> ExecutorBuilder<Node> for MyExecutorBuilder
where
Node: FullNodeTypes<Types: NodeTypes<ChainSpec = ChainSpec, Primitives = EthPrimitives>>,
{
type EVM = EthEvmConfig<MyEvmFactory>;
type EVM = EthEvmConfig<ChainSpec, MyEvmFactory>;
async fn build_evm(self, ctx: &BuilderContext<Node>) -> eyre::Result<Self::EVM> {
let evm_config = EthEvmConfig::new_with_evm_factory(