From 93b231ecb3d0a92b98ba96e6f1de11eb56737cae Mon Sep 17 00:00:00 2001 From: pecornilleau Date: Mon, 12 Jun 2023 19:09:33 +0200 Subject: [PATCH] EVM: Kernel: simulation mode doesn't require gas --- src/bin_evm_proxy/lib/simulation.ml | 4 +-- src/kernel_evm/kernel/src/simulation.rs | 33 ++++++++++++++++++++++++- tezt/tests/evm_rollup.ml | 2 -- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/bin_evm_proxy/lib/simulation.ml b/src/bin_evm_proxy/lib/simulation.ml index a1c024b186e7..cf30843756c5 100644 --- a/src/bin_evm_proxy/lib/simulation.ml +++ b/src/bin_evm_proxy/lib/simulation.ml @@ -45,9 +45,7 @@ let rlp_encode call = [ of_opt of_addr call.from; of_opt of_addr call.to_; - (* TODO: https://gitlab.com/tezos/tezos/-/issues/5863 - evm_execution will fail a simulation without gas *) - of_qty (Option.value ~default:(Qty (Z.of_int 11111)) call.gas); + of_opt of_qty call.gas; of_opt of_qty call.gasPrice; of_opt of_qty call.value; of_opt of_hash call.data; diff --git a/src/kernel_evm/kernel/src/simulation.rs b/src/kernel_evm/kernel/src/simulation.rs index bc1eba6d1eb3..6e81a3bc2572 100644 --- a/src/kernel_evm/kernel/src/simulation.rs +++ b/src/kernel_evm/kernel/src/simulation.rs @@ -23,6 +23,9 @@ pub const SIMULATION_SIMPLE_TAG: u8 = 1; pub const SIMULATION_CREATE_TAG: u8 = 2; // SIMULATION/CHUNK/NUM 2B/CHUNK pub const SIMULATION_CHUNK_TAG: u8 = 3; +/// Maximum gas used by the simulation. Bounded to limit DOS on the rollup node +/// Is used as default value if no gas is set. +pub const MAX_SIMULATION_GAS: u64 = 1_000_000_000u64; /// Container for eth_call data, used in messages sent by the rollup node /// simulation. @@ -85,7 +88,9 @@ impl Simulation { self.to, self.from.unwrap_or(default_caller), self.data.clone(), - self.gas, + self.gas + .map(|gas| u64::max(gas, MAX_SIMULATION_GAS)) + .or(Some(MAX_SIMULATION_GAS)), // gas could be omitted self.value, ) .map_err(Error::Simulation)?; @@ -394,6 +399,32 @@ mod tests { ); } + #[test] + fn simulation_result_no_gas() { + // setup + let mut host = MockHost::default(); + let new_address = create_contract(&mut host); + + // run simulation num + let simulation = Simulation { + from: None, + gas_price: None, + to: Some(new_address), + data: hex::decode(STORAGE_CONTRACT_CALL_NUM).unwrap(), + gas: None, + value: None, + }; + let outcome = simulation.run(&mut host); + + assert!(outcome.is_ok(), "simulation should have succeeded"); + let outcome = outcome.unwrap(); + assert_eq!( + Some(vec![0u8; 32]), + outcome.result, + "simulation result should be 0" + ); + } + #[test] fn parse_simulation() { let to = address_of_str("3535353535353535353535353535353535353535"); diff --git a/tezt/tests/evm_rollup.ml b/tezt/tests/evm_rollup.ml index bd103ff2861f..da28514cbacc 100644 --- a/tezt/tests/evm_rollup.ml +++ b/tezt/tests/evm_rollup.ml @@ -1082,7 +1082,6 @@ let test_eth_call_large = [ ("to", Ezjsonm.encode_string sender.address); ("data", Ezjsonm.encode_string ("0x" ^ String.make 12_000 'a')); - ("gas", `String "111111"); ] in @@ -1132,7 +1131,6 @@ let test_eth_call_storage_contract_rollup_node = [ ("to", Ezjsonm.encode_string address); ("data", Ezjsonm.encode_string data); - ("gas", `String "111111"); ] in -- GitLab