mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-02-19 03:04:27 -05:00
Co-authored-by: Georgios Konstantopoulos <me@gakonst.com> Co-authored-by: Oliver Nordbjerg <onbjerg@users.noreply.github.com> Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
97 lines
2.8 KiB
Rust
97 lines
2.8 KiB
Rust
//! EVM config for vanilla ethereum.
|
|
|
|
#![doc(
|
|
html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
|
|
html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
|
|
issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
|
|
)]
|
|
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
|
|
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
|
|
|
|
use reth_evm::{ConfigureEvm, ConfigureEvmEnv};
|
|
use reth_primitives::{
|
|
revm::{config::revm_spec, env::fill_tx_env},
|
|
revm_primitives::{AnalysisKind, CfgEnvWithHandlerCfg, TxEnv},
|
|
Address, ChainSpec, Head, Header, TransactionSigned, U256,
|
|
};
|
|
use reth_revm::{Database, EvmBuilder};
|
|
|
|
pub mod execute;
|
|
|
|
/// Ethereum DAO hardfork state change data.
|
|
pub mod dao_fork;
|
|
|
|
/// [EIP-6110](https://eips.ethereum.org/EIPS/eip-6110) handling.
|
|
pub mod eip6110;
|
|
|
|
/// Ethereum-related EVM configuration.
|
|
#[derive(Debug, Clone, Copy, Default)]
|
|
#[non_exhaustive]
|
|
pub struct EthEvmConfig;
|
|
|
|
impl ConfigureEvmEnv for EthEvmConfig {
|
|
fn fill_tx_env(tx_env: &mut TxEnv, transaction: &TransactionSigned, sender: Address) {
|
|
fill_tx_env(tx_env, transaction, sender)
|
|
}
|
|
|
|
fn fill_cfg_env(
|
|
cfg_env: &mut CfgEnvWithHandlerCfg,
|
|
chain_spec: &ChainSpec,
|
|
header: &Header,
|
|
total_difficulty: U256,
|
|
) {
|
|
let spec_id = revm_spec(
|
|
chain_spec,
|
|
Head {
|
|
number: header.number,
|
|
timestamp: header.timestamp,
|
|
difficulty: header.difficulty,
|
|
total_difficulty,
|
|
hash: Default::default(),
|
|
},
|
|
);
|
|
|
|
cfg_env.chain_id = chain_spec.chain().id();
|
|
cfg_env.perf_analyse_created_bytecodes = AnalysisKind::Analyse;
|
|
|
|
cfg_env.handler_cfg.spec_id = spec_id;
|
|
}
|
|
}
|
|
|
|
impl ConfigureEvm for EthEvmConfig {
|
|
type DefaultExternalContext<'a> = ();
|
|
|
|
fn evm<'a, DB: Database + 'a>(
|
|
&self,
|
|
db: DB,
|
|
) -> reth_revm::Evm<'a, Self::DefaultExternalContext<'a>, DB> {
|
|
EvmBuilder::default().with_db(db).build()
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use reth_primitives::revm_primitives::{BlockEnv, CfgEnv, SpecId};
|
|
|
|
#[test]
|
|
#[ignore]
|
|
fn test_fill_cfg_and_block_env() {
|
|
let mut cfg_env = CfgEnvWithHandlerCfg::new_with_spec_id(CfgEnv::default(), SpecId::LATEST);
|
|
let mut block_env = BlockEnv::default();
|
|
let header = Header::default();
|
|
let chain_spec = ChainSpec::default();
|
|
let total_difficulty = U256::ZERO;
|
|
|
|
EthEvmConfig::fill_cfg_and_block_env(
|
|
&mut cfg_env,
|
|
&mut block_env,
|
|
&chain_spec,
|
|
&header,
|
|
total_difficulty,
|
|
);
|
|
|
|
assert_eq!(cfg_env.chain_id, chain_spec.chain().id());
|
|
}
|
|
}
|