chore: simplify revm specId mapping (#13553)

This commit is contained in:
Matthias Seitz
2024-12-27 12:14:10 +01:00
committed by GitHub
parent 6049b6eb0a
commit d644900a80
6 changed files with 148 additions and 162 deletions

View File

@ -1,7 +1,13 @@
use reth_ethereum_forks::{EthereumHardfork, Head};
use alloy_consensus::Header;
use reth_optimism_chainspec::OpChainSpec;
use reth_optimism_forks::OpHardfork;
/// Map the latest active hardfork at the given header to a revm
/// [`SpecId`](revm_primitives::SpecId).
pub fn revm_spec(chain_spec: &OpChainSpec, header: &Header) -> revm_primitives::SpecId {
revm_spec_by_timestamp_after_bedrock(chain_spec, header.timestamp)
}
/// Returns the revm [`SpecId`](revm_primitives::SpecId) at the given timestamp.
///
/// # Note
@ -31,58 +37,6 @@ pub fn revm_spec_by_timestamp_after_bedrock(
}
}
/// Map the latest active hardfork at the given block to a revm [`SpecId`](revm_primitives::SpecId).
pub fn revm_spec(chain_spec: &OpChainSpec, block: &Head) -> revm_primitives::SpecId {
if chain_spec.fork(OpHardfork::Isthmus).active_at_head(block) {
todo!()
} else if chain_spec.fork(OpHardfork::Holocene).active_at_head(block) {
revm_primitives::HOLOCENE
} else if chain_spec.fork(OpHardfork::Granite).active_at_head(block) {
revm_primitives::GRANITE
} else if chain_spec.fork(OpHardfork::Fjord).active_at_head(block) {
revm_primitives::FJORD
} else if chain_spec.fork(OpHardfork::Ecotone).active_at_head(block) {
revm_primitives::ECOTONE
} else if chain_spec.fork(OpHardfork::Canyon).active_at_head(block) {
revm_primitives::CANYON
} else if chain_spec.fork(OpHardfork::Regolith).active_at_head(block) {
revm_primitives::REGOLITH
} else if chain_spec.fork(OpHardfork::Bedrock).active_at_head(block) {
revm_primitives::BEDROCK
} else if chain_spec.fork(EthereumHardfork::Prague).active_at_head(block) {
revm_primitives::PRAGUE
} else if chain_spec.fork(EthereumHardfork::Cancun).active_at_head(block) {
revm_primitives::CANCUN
} else if chain_spec.fork(EthereumHardfork::Shanghai).active_at_head(block) {
revm_primitives::SHANGHAI
} else if chain_spec.fork(EthereumHardfork::Paris).active_at_head(block) {
revm_primitives::MERGE
} else if chain_spec.fork(EthereumHardfork::London).active_at_head(block) {
revm_primitives::LONDON
} else if chain_spec.fork(EthereumHardfork::Berlin).active_at_head(block) {
revm_primitives::BERLIN
} else if chain_spec.fork(EthereumHardfork::Istanbul).active_at_head(block) {
revm_primitives::ISTANBUL
} else if chain_spec.fork(EthereumHardfork::Petersburg).active_at_head(block) {
revm_primitives::PETERSBURG
} else if chain_spec.fork(EthereumHardfork::Byzantium).active_at_head(block) {
revm_primitives::BYZANTIUM
} else if chain_spec.fork(EthereumHardfork::SpuriousDragon).active_at_head(block) {
revm_primitives::SPURIOUS_DRAGON
} else if chain_spec.fork(EthereumHardfork::Tangerine).active_at_head(block) {
revm_primitives::TANGERINE
} else if chain_spec.fork(EthereumHardfork::Homestead).active_at_head(block) {
revm_primitives::HOMESTEAD
} else if chain_spec.fork(EthereumHardfork::Frontier).active_at_head(block) {
revm_primitives::FRONTIER
} else {
panic!(
"invalid hardfork chainspec: expected at least one hardfork, got {:?}",
chain_spec.hardforks
)
}
}
#[cfg(test)]
mod tests {
use super::*;
@ -134,31 +88,31 @@ mod tests {
f(cs).build()
}
assert_eq!(
revm_spec(&op_cs(|cs| cs.holocene_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.holocene_activated()), &Default::default()),
revm_primitives::HOLOCENE
);
assert_eq!(
revm_spec(&op_cs(|cs| cs.granite_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.granite_activated()), &Default::default()),
revm_primitives::GRANITE
);
assert_eq!(
revm_spec(&op_cs(|cs| cs.fjord_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.fjord_activated()), &Default::default()),
revm_primitives::FJORD
);
assert_eq!(
revm_spec(&op_cs(|cs| cs.ecotone_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.ecotone_activated()), &Default::default()),
revm_primitives::ECOTONE
);
assert_eq!(
revm_spec(&op_cs(|cs| cs.canyon_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.canyon_activated()), &Default::default()),
revm_primitives::CANYON
);
assert_eq!(
revm_spec(&op_cs(|cs| cs.bedrock_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.bedrock_activated()), &Default::default()),
revm_primitives::BEDROCK
);
assert_eq!(
revm_spec(&op_cs(|cs| cs.regolith_activated()), &Head::default()),
revm_spec(&op_cs(|cs| cs.regolith_activated()), &Default::default()),
revm_primitives::REGOLITH
);
}

View File

@ -18,7 +18,7 @@ use alloy_primitives::{Address, U256};
use op_alloy_consensus::EIP1559ParamError;
use reth_evm::{env::EvmEnv, ConfigureEvm, ConfigureEvmEnv, NextBlockEnvAttributes};
use reth_optimism_chainspec::OpChainSpec;
use reth_primitives::{transaction::FillTxEnv, Head, TransactionSigned};
use reth_primitives::{transaction::FillTxEnv, TransactionSigned};
use reth_revm::{
inspector_handle_register,
primitives::{AnalysisKind, CfgEnvWithHandlerCfg, TxEnv},
@ -111,18 +111,7 @@ impl ConfigureEvmEnv for OpEvmConfig {
}
fn fill_cfg_env(&self, cfg_env: &mut CfgEnvWithHandlerCfg, header: &Self::Header) {
let spec_id = revm_spec(
self.chain_spec(),
&Head {
number: header.number,
timestamp: header.timestamp,
difficulty: header.difficulty,
// NOTE: this does not matter within revm_spec as it uses paris hardfork block
// activation
total_difficulty: U256::MIN,
hash: Default::default(),
},
);
let spec_id = revm_spec(self.chain_spec(), header);
cfg_env.chain_id = self.chain_spec.chain().id();
cfg_env.perf_analyse_created_bytecodes = AnalysisKind::Analyse;