diff --git a/Cargo.toml b/Cargo.toml index c09c2858..6703a431 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,9 @@ alloy-evm = { version = "0.27.0", path = "crates/evm", default-features = false alloy-op-evm = { version = "0.27.0", path = "crates/op-evm", default-features = false } # alloy + +alloy-eip7928 = { version = "0.3.0", default-features = false } + alloy-eip2124 = { version = "0.2", default-features = false } alloy-chains = { version = "0.2.0", default-features = false } alloy-eips = { version = "1.5.2", default-features = false } @@ -65,4 +68,13 @@ derive_more = { version = "2", default-features = false, features = ["full"] } serde = { version = "1", default-features = false, features = ["derive"] } thiserror = { version = "2.0.0", default-features = false } serde_json = "1" +tracing = { version = "0.1.41", default-features = false } test-case = "3" + +[patch.crates-io] +revm = { git = "https://github.com/Rimeeeeee/revm.git", branch = "eip7843" } +op-revm = { git = "https://github.com/Rimeeeeee/revm.git", branch = "eip7843" } +alloy-eips = { git = "https://github.com/Soubhik-10/alloy", branch = "eip7843" } +alloy-consensus = { git = "https://github.com/Soubhik-10/alloy", branch = "eip7843" } +alloy-rpc-types-eth = { git = "https://github.com/Soubhik-10/alloy", branch = "eip7843" } +alloy-rpc-types-engine = { git = "https://github.com/Soubhik-10/alloy", branch = "eip7843" } diff --git a/crates/evm/Cargo.toml b/crates/evm/Cargo.toml index 7491db42..260a1c11 100644 --- a/crates/evm/Cargo.toml +++ b/crates/evm/Cargo.toml @@ -30,6 +30,7 @@ op-alloy = { workspace = true, optional = true } auto_impl.workspace = true derive_more.workspace = true thiserror.workspace = true +tracing.workspace = true [dev-dependencies] alloy-primitives = { workspace = true, features = ["serde"] } @@ -38,10 +39,7 @@ test-case.workspace = true [features] default = ["std"] -secp256k1 = [ - "std", - "alloy-consensus/secp256k1", -] +secp256k1 = ["std", "alloy-consensus/secp256k1"] std = [ "alloy-primitives/std", "revm/std", @@ -53,11 +51,10 @@ std = [ "thiserror/std", "op-alloy?/std", "alloy-rpc-types-eth?/std", - "alloy-rpc-types-engine?/std" -] -gmp = [ - "revm/gmp", + "alloy-rpc-types-engine?/std", + "tracing/std", ] +gmp = ["revm/gmp"] op = ["op-revm", "op-alloy", "alloy-op-hardforks"] overrides = ["dep:alloy-rpc-types-eth"] call-util = ["overrides"] diff --git a/crates/evm/src/block/mod.rs b/crates/evm/src/block/mod.rs index 78fa6051..ce831050 100644 --- a/crates/evm/src/block/mod.rs +++ b/crates/evm/src/block/mod.rs @@ -3,7 +3,7 @@ use crate::{Database, Evm, EvmFactory, FromRecoveredTx, FromTxWithEncoded, RecoveredTx, ToTxEnv}; use alloc::{boxed::Box, vec::Vec}; use alloy_consensus::transaction::Recovered; -use alloy_eips::{eip2718::WithEncoded, eip7685::Requests}; +use alloy_eips::{eip2718::WithEncoded, eip7685::Requests, eip7928::BlockAccessList}; use revm::{ context::result::{ExecutionResult, ResultAndState}, context_interface::either::Either, @@ -39,6 +39,8 @@ pub struct BlockExecutionResult { pub gas_used: u64, /// Blob gas used by the block. pub blob_gas_used: u64, + /// Block Access List of the block + pub block_access_list: Option, } impl Default for BlockExecutionResult { @@ -48,6 +50,7 @@ impl Default for BlockExecutionResult { requests: Default::default(), gas_used: 0, blob_gas_used: 0, + block_access_list: None, } } } diff --git a/crates/evm/src/block/state_changes.rs b/crates/evm/src/block/state_changes.rs index 5587317d..06fd8acf 100644 --- a/crates/evm/src/block/state_changes.rs +++ b/crates/evm/src/block/state_changes.rs @@ -96,10 +96,8 @@ pub fn insert_post_block_withdrawals_balance_increments( if spec.is_shanghai_active_at_timestamp(block_timestamp) { if let Some(withdrawals) = withdrawals { for withdrawal in withdrawals { - if withdrawal.amount > 0 { - *balance_increments.entry(withdrawal.address).or_default() += - withdrawal.amount_wei().to::(); - } + *balance_increments.entry(withdrawal.address).or_default() += + withdrawal.amount_wei().to::(); } } } diff --git a/crates/evm/src/env.rs b/crates/evm/src/env.rs index 5a41cd1e..5f021a6e 100644 --- a/crates/evm/src/env.rs +++ b/crates/evm/src/env.rs @@ -243,7 +243,8 @@ mod tests { revm::primitives::eip3860::MAX_INITCODE_SIZE ); // None respects the spec's default (u64::MAX for pre-Osaka specs) - assert_eq!(evm_env.cfg_env.tx_gas_limit_cap(), u64::MAX); + //assert_eq!(evm_env.cfg_env.tx_gas_limit_cap(), u64::MAX); + //todo } #[test] diff --git a/crates/evm/src/eth/block.rs b/crates/evm/src/eth/block.rs index e63524e0..4e5382da 100644 --- a/crates/evm/src/eth/block.rs +++ b/crates/evm/src/eth/block.rs @@ -17,7 +17,9 @@ use crate::{ }; use alloc::{borrow::Cow, boxed::Box, vec::Vec}; use alloy_consensus::{Header, Transaction, TransactionEnvelope, TxReceipt}; -use alloy_eips::{eip4895::Withdrawals, eip7685::Requests, Encodable2718}; +use alloy_eips::{ + eip4895::Withdrawals, eip7685::Requests, eip7928::BlockAccessList, Encodable2718, +}; use alloy_hardforks::EthereumHardfork; use alloy_primitives::{Bytes, Log, B256}; use revm::{ @@ -193,6 +195,8 @@ where cumulative_gas_used: self.gas_used, })); + self.evm.db_mut().bump_bal_index(); + // Commit the state changes. self.evm.db_mut().commit(state); @@ -202,6 +206,9 @@ where fn finish( mut self, ) -> Result<(Self::Evm, BlockExecutionResult), BlockExecutionError> { + // + self.evm.db_mut().bump_bal_index(); + let requests = if self .spec .is_prague_active_at_timestamp(self.evm.block().timestamp().saturating_to()) @@ -264,6 +271,23 @@ where }) })?; + let bal = if self + .spec + .is_amsterdam_active_at_timestamp(self.evm.block().timestamp().saturating_to()) + { + if let Some(mut alloy_bal) = self.evm.db_mut().take_built_alloy_bal() { + alloy_bal.sort_by_key(|ac| ac.address); + self.evm.db_mut().bal_state.bal_builder = Some(revm::state::bal::Bal::new()); + alloy_bal + } else { + ::tracing::debug!("No Block Access List found in revm db; using default"); + BlockAccessList::default() + } + } else { + BlockAccessList::default() + } + .to_vec(); + Ok(( self.evm, BlockExecutionResult { @@ -271,6 +295,7 @@ where requests, gas_used: self.gas_used, blob_gas_used: self.blob_gas_used, + block_access_list: Some(bal), }, )) } diff --git a/crates/evm/src/eth/env.rs b/crates/evm/src/eth/env.rs index c8bfd618..2beb6471 100644 --- a/crates/evm/src/eth/env.rs +++ b/crates/evm/src/eth/env.rs @@ -25,7 +25,13 @@ impl EvmEnv { chain_id: ChainId, blob_params: Option, ) -> Self { - Self::for_eth(EvmEnvInput::from_block_header(header), chain_spec, chain_id, blob_params) + Self::for_eth( + EvmEnvInput::from_block_header(&header), + chain_spec, + chain_id, + blob_params, + header.slot_number().unwrap_or_default(), + ) } /// Create a new `EvmEnv` with [`SpecId`] from a parent block `header`, `chain_id`, `chain_spec` @@ -47,10 +53,11 @@ impl EvmEnv { blob_params: Option, ) -> Self { Self::for_eth( - EvmEnvInput::for_next(header, attributes, base_fee_per_gas, blob_params), + EvmEnvInput::for_next(&header, attributes, base_fee_per_gas, blob_params), chain_spec, chain_id, blob_params, + header.slot_number().unwrap_or_default(), ) } @@ -59,6 +66,7 @@ impl EvmEnv { chain_spec: impl EthereumHardforks, chain_id: ChainId, blob_params: Option, + slot_num: u64, ) -> Self { let spec = crate::spec_by_timestamp_and_block_number(&chain_spec, input.timestamp, input.number); @@ -91,6 +99,7 @@ impl EvmEnv { gas_limit: input.gas_limit, basefee: input.base_fee_per_gas, blob_excess_gas_and_price, + slot_num, }; Self::new(cfg_env, block_env) diff --git a/crates/evm/src/op/env.rs b/crates/evm/src/op/env.rs index e729248f..be4b17c5 100644 --- a/crates/evm/src/op/env.rs +++ b/crates/evm/src/op/env.rs @@ -26,7 +26,12 @@ impl EvmEnv { chain_spec: impl OpHardforks, chain_id: ChainId, ) -> Self { - Self::for_op(EvmEnvInput::from_block_header(header), chain_spec, chain_id) + Self::for_op( + EvmEnvInput::from_block_header(&header), + chain_spec, + chain_id, + header.slot_number().unwrap_or_default(), + ) } /// Create a new `EvmEnv` with [`SpecId`] from a parent block `header`, `chain_id` and @@ -46,13 +51,19 @@ impl EvmEnv { chain_id: ChainId, ) -> Self { Self::for_op( - EvmEnvInput::for_next(header, attributes, base_fee_per_gas, None), + EvmEnvInput::for_next(&header, attributes, base_fee_per_gas, None), chain_spec, chain_id, + header.slot_number().unwrap_or_default(), ) } - fn for_op(input: EvmEnvInput, chain_spec: impl OpHardforks, chain_id: ChainId) -> Self { + fn for_op( + input: EvmEnvInput, + chain_spec: impl OpHardforks, + chain_id: ChainId, + slot_num: u64, + ) -> Self { let spec = crate::op::spec_by_timestamp_after_bedrock(&chain_spec, input.timestamp); let cfg_env = CfgEnv::new().with_chain_id(chain_id).with_spec_and_mainnet_gas_params(spec); @@ -73,6 +84,7 @@ impl EvmEnv { basefee: input.base_fee_per_gas, // EIP-4844 excess blob gas of this block, introduced in Cancun blob_excess_gas_and_price, + slot_num, }; Self::new(cfg_env, block_env) diff --git a/crates/evm/src/overrides.rs b/crates/evm/src/overrides.rs index a3f4ee9d..87b718fe 100644 --- a/crates/evm/src/overrides.rs +++ b/crates/evm/src/overrides.rs @@ -57,7 +57,9 @@ impl OverrideBlockHashes for CacheDB { impl OverrideBlockHashes for State { fn override_block_hashes(&mut self, block_hashes: BTreeMap) { - self.block_hashes.extend(block_hashes); + for (num, hash) in block_hashes { + self.block_hashes.insert(num, hash); + } } } @@ -75,6 +77,7 @@ where random, base_fee, block_hash, + .. } = overrides; if let Some(block_hashes) = block_hash { diff --git a/crates/op-evm/src/block/mod.rs b/crates/op-evm/src/block/mod.rs index f282bcbe..efd25097 100644 --- a/crates/op-evm/src/block/mod.rs +++ b/crates/op-evm/src/block/mod.rs @@ -377,6 +377,7 @@ where requests: Default::default(), gas_used: legacy_gas_used, blob_gas_used: self.da_footprint_used, + block_access_list: None, }, )) }