From e07292a3318ce56a0b3ed0e1343efc2c6e2c2d81 Mon Sep 17 00:00:00 2001 From: rakita Date: Fri, 12 Jul 2024 18:20:25 +0200 Subject: [PATCH 1/3] fix(eof): Use cfg code size limit for eofcreate --- crates/revm/src/context/inner_evm_context.rs | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/revm/src/context/inner_evm_context.rs b/crates/revm/src/context/inner_evm_context.rs index b2314cbb35..8aa60ca905 100644 --- a/crates/revm/src/context/inner_evm_context.rs +++ b/crates/revm/src/context/inner_evm_context.rs @@ -6,8 +6,8 @@ use crate::{ }, journaled_state::JournaledState, primitives::{ - AccessListItem, Account, Address, AnalysisKind, Bytecode, Bytes, EVMError, Env, Eof, - HashSet, Spec, + AccessListItem, Account, Address, AnalysisKind, Bytecode, Bytes, CfgEnv, EVMError, Env, + Eof, HashSet, Spec, SpecId::{self, *}, B256, EOF_MAGIC_BYTES, EOF_MAGIC_HASH, U256, }, @@ -125,6 +125,11 @@ impl InnerEvmContext { &mut self.env } + /// Returns referecne to [`CfgEnv`]. + pub fn cfg(&self) -> &CfgEnv { + &self.env.cfg + } + /// Returns the error by replacing it with `Ok(())`, if any. #[inline] pub fn take_error(&mut self) -> Result<(), EVMError> { @@ -271,7 +276,8 @@ impl InnerEvmContext { return; } - if interpreter_result.output.len() > MAX_CODE_SIZE { + let max_code_size = self.cfg().limit_contract_code_size.unwrap_or(MAX_CODE_SIZE); + if interpreter_result.output.len() > max_code_size { self.journaled_state.checkpoint_revert(journal_checkpoint); interpreter_result.result = InstructionResult::CreateContractSizeLimit; return; @@ -340,14 +346,8 @@ impl InnerEvmContext { // EIP-170: Contract code size limit // By default limit is 0x6000 (~25kb) - if SPEC::enabled(SPURIOUS_DRAGON) - && interpreter_result.output.len() - > self - .env - .cfg - .limit_contract_code_size - .unwrap_or(MAX_CODE_SIZE) - { + let max_code_size = self.cfg().limit_contract_code_size.unwrap_or(MAX_CODE_SIZE); + if SPEC::enabled(SPURIOUS_DRAGON) && interpreter_result.output.len() > max_code_size { self.journaled_state.checkpoint_revert(journal_checkpoint); interpreter_result.result = InstructionResult::CreateContractSizeLimit; return; From ffccfeef80649d0ee1beab4729f40acb853f2c27 Mon Sep 17 00:00:00 2001 From: rakita Date: Fri, 12 Jul 2024 19:01:30 +0200 Subject: [PATCH 2/3] Update crates/revm/src/context/inner_evm_context.rs --- crates/revm/src/context/inner_evm_context.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/revm/src/context/inner_evm_context.rs b/crates/revm/src/context/inner_evm_context.rs index 8aa60ca905..727045f981 100644 --- a/crates/revm/src/context/inner_evm_context.rs +++ b/crates/revm/src/context/inner_evm_context.rs @@ -125,7 +125,7 @@ impl InnerEvmContext { &mut self.env } - /// Returns referecne to [`CfgEnv`]. + /// Returns reference to [`CfgEnv`]. pub fn cfg(&self) -> &CfgEnv { &self.env.cfg } From 63d5b997b0bb2ee6ae51b0eac199f4a66b851211 Mon Sep 17 00:00:00 2001 From: rakita Date: Fri, 12 Jul 2024 19:06:03 +0200 Subject: [PATCH 3/3] simplify --- crates/primitives/src/env.rs | 10 ++++++++-- crates/revm/src/context/inner_evm_context.rs | 15 ++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/crates/primitives/src/env.rs b/crates/primitives/src/env.rs index 3e7b45f372..c465b1aee3 100644 --- a/crates/primitives/src/env.rs +++ b/crates/primitives/src/env.rs @@ -6,8 +6,8 @@ pub use handler_cfg::{CfgEnvWithHandlerCfg, EnvWithHandlerCfg, HandlerCfg}; use crate::{ calc_blob_gasprice, AccessListItem, Account, Address, Bytes, InvalidHeader, InvalidTransaction, - Spec, SpecId, B256, GAS_PER_BLOB, KECCAK_EMPTY, MAX_BLOB_NUMBER_PER_BLOCK, MAX_INITCODE_SIZE, - U256, VERSIONED_HASH_VERSION_KZG, + Spec, SpecId, B256, GAS_PER_BLOB, KECCAK_EMPTY, MAX_BLOB_NUMBER_PER_BLOCK, MAX_CODE_SIZE, + MAX_INITCODE_SIZE, U256, VERSIONED_HASH_VERSION_KZG, }; use alloy_primitives::TxKind; use core::cmp::{min, Ordering}; @@ -323,6 +323,12 @@ pub struct CfgEnv { } impl CfgEnv { + /// Returns max code size from [`Self::limit_contract_code_size`] if set + /// or default [`MAX_CODE_SIZE`] value. + pub fn max_code_size(&self) -> usize { + self.limit_contract_code_size.unwrap_or(MAX_CODE_SIZE) + } + pub fn with_chain_id(mut self, chain_id: u64) -> Self { self.chain_id = chain_id; self diff --git a/crates/revm/src/context/inner_evm_context.rs b/crates/revm/src/context/inner_evm_context.rs index 8aa60ca905..27842a217e 100644 --- a/crates/revm/src/context/inner_evm_context.rs +++ b/crates/revm/src/context/inner_evm_context.rs @@ -2,7 +2,7 @@ use crate::{ db::Database, interpreter::{ analysis::to_analysed, gas, return_ok, InstructionResult, InterpreterResult, - LoadAccountResult, SStoreResult, SelfDestructResult, MAX_CODE_SIZE, + LoadAccountResult, SStoreResult, SelfDestructResult, }, journaled_state::JournaledState, primitives::{ @@ -276,8 +276,7 @@ impl InnerEvmContext { return; } - let max_code_size = self.cfg().limit_contract_code_size.unwrap_or(MAX_CODE_SIZE); - if interpreter_result.output.len() > max_code_size { + if interpreter_result.output.len() > self.cfg().max_code_size() { self.journaled_state.checkpoint_revert(journal_checkpoint); interpreter_result.result = InstructionResult::CreateContractSizeLimit; return; @@ -335,10 +334,7 @@ impl InnerEvmContext { // if ok, check contract creation limit and calculate gas deduction on output len. // // EIP-3541: Reject new contract code starting with the 0xEF byte - if SPEC::enabled(LONDON) - && !interpreter_result.output.is_empty() - && interpreter_result.output.first() == Some(&0xEF) - { + if SPEC::enabled(LONDON) && interpreter_result.output.first() == Some(&0xEF) { self.journaled_state.checkpoint_revert(journal_checkpoint); interpreter_result.result = InstructionResult::CreateContractStartingWithEF; return; @@ -346,8 +342,9 @@ impl InnerEvmContext { // EIP-170: Contract code size limit // By default limit is 0x6000 (~25kb) - let max_code_size = self.cfg().limit_contract_code_size.unwrap_or(MAX_CODE_SIZE); - if SPEC::enabled(SPURIOUS_DRAGON) && interpreter_result.output.len() > max_code_size { + if SPEC::enabled(SPURIOUS_DRAGON) + && interpreter_result.output.len() > self.cfg().max_code_size() + { self.journaled_state.checkpoint_revert(journal_checkpoint); interpreter_result.result = InstructionResult::CreateContractSizeLimit; return;