From 974ca9c685efeb93471c0e3952306af5a91e7218 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 24 May 2024 11:47:08 +0100 Subject: [PATCH 1/5] feat(revm): revert EIP-2935 BLOCKHASH opcode changes --- crates/revm/src/context.rs | 36 ++++-------------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/crates/revm/src/context.rs b/crates/revm/src/context.rs index aa2ae4be9c..9ba533e939 100644 --- a/crates/revm/src/context.rs +++ b/crates/revm/src/context.rs @@ -110,38 +110,10 @@ impl Host for Context { } fn block_hash(&mut self, number: U256) -> Option { - let block_number = as_usize_saturated!(self.env().block.number); - let requested_number = as_usize_saturated!(number); - - let Some(diff) = block_number.checked_sub(requested_number) else { - return Some(B256::ZERO); - }; - - // blockhash should push zero if number is same as current block number. - if diff == 0 { - return Some(B256::ZERO); - } - - if diff <= BLOCK_HASH_HISTORY { - return self - .evm - .block_hash(number) - .map_err(|e| self.evm.error = Err(e)) - .ok(); - } - - if self.evm.journaled_state.spec.is_enabled_in(PRAGUE) && diff <= BLOCKHASH_SERVE_WINDOW { - let index = number.wrapping_rem(U256::from(BLOCKHASH_SERVE_WINDOW)); - return self - .evm - .db - .storage(BLOCKHASH_STORAGE_ADDRESS, index) - .map_err(|e| self.evm.error = Err(EVMError::Database(e))) - .ok() - .map(|v| v.into()); - } - - Some(B256::ZERO) + self.evm + .block_hash(number) + .map_err(|e| self.evm.error = Err(e)) + .ok() } fn load_account(&mut self, address: Address) -> Option { From b093364fc2e8c3f07a36d2785d69a986cc2fc675 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 24 May 2024 11:52:10 +0100 Subject: [PATCH 2/5] fix lint --- crates/revm/src/context.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/revm/src/context.rs b/crates/revm/src/context.rs index 9ba533e939..343dfcf985 100644 --- a/crates/revm/src/context.rs +++ b/crates/revm/src/context.rs @@ -8,15 +8,11 @@ pub use context_precompiles::{ }; pub use evm_context::EvmContext; pub use inner_evm_context::InnerEvmContext; -use revm_interpreter::as_usize_saturated; use crate::{ db::{Database, EmptyDB}, interpreter::{Host, LoadAccountResult, SStoreResult, SelfDestructResult}, - primitives::{ - Address, Bytecode, EVMError, Env, HandlerCfg, Log, B256, BLOCKHASH_SERVE_WINDOW, - BLOCKHASH_STORAGE_ADDRESS, BLOCK_HASH_HISTORY, PRAGUE, U256, - }, + primitives::{Address, Bytecode, Env, HandlerCfg, Log, B256, U256}, }; use std::boxed::Box; From ec6c8fcd79818c2aab84154a1514f761c79e1b7a Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 24 May 2024 12:04:18 +0100 Subject: [PATCH 3/5] bump time --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e6914d008c..45813d27a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3791,9 +3791,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -3812,9 +3812,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", From c77223085bd85e61c717c2ff7008ea6628b32c18 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 24 May 2024 12:10:54 +0100 Subject: [PATCH 4/5] return previous impl mod prague branch --- crates/revm/src/context.rs | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/crates/revm/src/context.rs b/crates/revm/src/context.rs index 343dfcf985..de1947aaae 100644 --- a/crates/revm/src/context.rs +++ b/crates/revm/src/context.rs @@ -8,11 +8,15 @@ pub use context_precompiles::{ }; pub use evm_context::EvmContext; pub use inner_evm_context::InnerEvmContext; +use revm_interpreter::as_usize_saturated; use crate::{ db::{Database, EmptyDB}, interpreter::{Host, LoadAccountResult, SStoreResult, SelfDestructResult}, - primitives::{Address, Bytecode, Env, HandlerCfg, Log, B256, U256}, + primitives::{ + Address, Bytecode, EVMError, Env, HandlerCfg, Log, B256, BLOCKHASH_SERVE_WINDOW, + BLOCKHASH_STORAGE_ADDRESS, BLOCK_HASH_HISTORY, PRAGUE, U256, + }, }; use std::boxed::Box; @@ -106,10 +110,27 @@ impl Host for Context { } fn block_hash(&mut self, number: U256) -> Option { - self.evm - .block_hash(number) - .map_err(|e| self.evm.error = Err(e)) - .ok() + let block_number = as_usize_saturated!(self.env().block.number); + let requested_number = as_usize_saturated!(number); + + let Some(diff) = block_number.checked_sub(requested_number) else { + return Some(B256::ZERO); + }; + + // blockhash should push zero if number is same as current block number. + if diff == 0 { + return Some(B256::ZERO); + } + + if diff <= BLOCK_HASH_HISTORY { + return self + .evm + .block_hash(number) + .map_err(|e| self.evm.error = Err(e)) + .ok(); + } + + Some(B256::ZERO) } fn load_account(&mut self, address: Address) -> Option { From e9f8b656b39162aae5a337879c999f53e34f44b1 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 24 May 2024 17:15:53 +0100 Subject: [PATCH 5/5] remove unused imports --- crates/revm/src/context.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/revm/src/context.rs b/crates/revm/src/context.rs index de1947aaae..6cdbdfe6fa 100644 --- a/crates/revm/src/context.rs +++ b/crates/revm/src/context.rs @@ -13,10 +13,7 @@ use revm_interpreter::as_usize_saturated; use crate::{ db::{Database, EmptyDB}, interpreter::{Host, LoadAccountResult, SStoreResult, SelfDestructResult}, - primitives::{ - Address, Bytecode, EVMError, Env, HandlerCfg, Log, B256, BLOCKHASH_SERVE_WINDOW, - BLOCKHASH_STORAGE_ADDRESS, BLOCK_HASH_HISTORY, PRAGUE, U256, - }, + primitives::{Address, Bytecode, Env, HandlerCfg, Log, B256, BLOCK_HASH_HISTORY, U256}, }; use std::boxed::Box;