From 080d8ff9d728ba62c0efed2e7e7a0f79309c04f5 Mon Sep 17 00:00:00 2001 From: Wodann Date: Wed, 13 Mar 2024 00:23:58 +0000 Subject: [PATCH] feat: optional nonce check --- crates/interpreter/Cargo.toml | 2 ++ crates/primitives/Cargo.toml | 2 ++ crates/primitives/src/env.rs | 35 ++++++++++++++++++++++++++--------- crates/revm/Cargo.toml | 2 ++ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/crates/interpreter/Cargo.toml b/crates/interpreter/Cargo.toml index 3e1c2409cb..e0c810d2a3 100644 --- a/crates/interpreter/Cargo.toml +++ b/crates/interpreter/Cargo.toml @@ -48,6 +48,7 @@ dev = [ "optional_gas_refund", "optional_no_base_fee", "optional_beneficiary_reward", + "optional_nonce_check", ] memory_limit = ["revm-primitives/memory_limit"] optional_balance_check = ["revm-primitives/optional_balance_check"] @@ -56,3 +57,4 @@ optional_eip3607 = ["revm-primitives/optional_eip3607"] optional_gas_refund = ["revm-primitives/optional_gas_refund"] optional_no_base_fee = ["revm-primitives/optional_no_base_fee"] optional_beneficiary_reward = ["revm-primitives/optional_beneficiary_reward"] +optional_nonce_check = ["revm-primitives/optional_nonce_check"] diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml index 4c513d908f..f8808af4b5 100644 --- a/crates/primitives/Cargo.toml +++ b/crates/primitives/Cargo.toml @@ -79,6 +79,7 @@ dev = [ "optional_gas_refund", "optional_no_base_fee", "optional_beneficiary_reward", + "optional_nonce_check", ] memory_limit = [] optional_balance_check = [] @@ -87,6 +88,7 @@ optional_eip3607 = [] optional_gas_refund = [] optional_no_base_fee = [] optional_beneficiary_reward = [] +optional_nonce_check = [] # See comments in `revm-precompile` c-kzg = ["dep:c-kzg", "dep:once_cell", "dep:derive_more"] diff --git a/crates/primitives/src/env.rs b/crates/primitives/src/env.rs index aa2f3f4cc2..bac86ae3cb 100644 --- a/crates/primitives/src/env.rs +++ b/crates/primitives/src/env.rs @@ -201,16 +201,18 @@ impl Env { } // Check that the transaction's nonce is correct - if let Some(tx) = self.tx.nonce { - let state = account.info.nonce; - match tx.cmp(&state) { - Ordering::Greater => { - return Err(InvalidTransaction::NonceTooHigh { tx, state }); - } - Ordering::Less => { - return Err(InvalidTransaction::NonceTooLow { tx, state }); + if !self.cfg.is_nonce_check_disabled() { + if let Some(tx) = self.tx.nonce { + let state = account.info.nonce; + match tx.cmp(&state) { + Ordering::Greater => { + return Err(InvalidTransaction::NonceTooHigh { tx, state }); + } + Ordering::Less => { + return Err(InvalidTransaction::NonceTooLow { tx, state }); + } + _ => {} } - _ => {} } } @@ -299,6 +301,9 @@ pub struct CfgEnv { /// By default, it is set to `false`. #[cfg(feature = "optional_beneficiary_reward")] pub disable_beneficiary_reward: bool, + /// Skip nonce checks if true. + #[cfg(feature = "optional_nonce_check")] + pub disable_nonce_check: bool, } impl CfgEnv { @@ -361,6 +366,16 @@ impl CfgEnv { pub fn is_beneficiary_reward_disabled(&self) -> bool { false } + + #[cfg(feature = "optional_nonce_check")] + pub fn is_nonce_check_disabled(&self) -> bool { + self.disable_nonce_check + } + + #[cfg(not(feature = "optional_nonce_check"))] + pub fn is_nonce_check_disabled(&self) -> bool { + false + } } impl Default for CfgEnv { @@ -385,6 +400,8 @@ impl Default for CfgEnv { disable_base_fee: false, #[cfg(feature = "optional_beneficiary_reward")] disable_beneficiary_reward: false, + #[cfg(feature = "optional_nonce_check")] + disable_nonce_check: false, } } } diff --git a/crates/revm/Cargo.toml b/crates/revm/Cargo.toml index 50900073df..d4c46813e4 100644 --- a/crates/revm/Cargo.toml +++ b/crates/revm/Cargo.toml @@ -90,6 +90,7 @@ dev = [ "optional_gas_refund", "optional_no_base_fee", "optional_beneficiary_reward", + "optional_nonce_check", ] memory_limit = ["revm-interpreter/memory_limit"] optional_balance_check = ["revm-interpreter/optional_balance_check"] @@ -98,6 +99,7 @@ optional_eip3607 = ["revm-interpreter/optional_eip3607"] optional_gas_refund = ["revm-interpreter/optional_gas_refund"] optional_no_base_fee = ["revm-interpreter/optional_no_base_fee"] optional_beneficiary_reward = ["revm-interpreter/optional_beneficiary_reward"] +optional_nonce_check = ["revm-interpreter/optional_nonce_check"] # See comments in `revm-precompile` secp256k1 = ["revm-precompile/secp256k1"]