From 0c67c97bef3b33e64e6ecb65fb33e55892564ef7 Mon Sep 17 00:00:00 2001 From: Rodi-Can Bozman Date: Wed, 21 Aug 2024 16:06:17 +0200 Subject: [PATCH 1/2] EVM/Tezt: test that deposits can be traced --- etherlink/tezt/tests/evm_sequencer.ml | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/etherlink/tezt/tests/evm_sequencer.ml b/etherlink/tezt/tests/evm_sequencer.ml index 9919a8e6520f..7d47b6d3cb6b 100644 --- a/etherlink/tezt/tests/evm_sequencer.ml +++ b/etherlink/tezt/tests/evm_sequencer.ml @@ -5912,6 +5912,76 @@ let test_trace_transaction_calltracer_precompiles = call_list ; unit +let test_trace_transaction_calltracer_deposit = + register_all + ~kernels:[Latest] + ~time_between_blocks:Nothing + ~da_fee:arb_da_fee_for_delayed_inbox + ~tags:["evm"; "rpc"; "trace"; "call_trace"; "deposit"] + ~title:"debug_traceTransaction with calltracer can trace deposits" + @@ fun { + client; + l1_contracts; + sc_rollup_address; + sc_rollup_node; + sequencer; + proxy; + _; + } + _protocol -> + let endpoint = Evm_node.endpoint sequencer in + let amount = Tez.of_int 16 in + let depositor = Constant.bootstrap5 in + let receiver = + Eth_account. + { + address = "0x1074Fd1EC02cbeaa5A90450505cF3B48D834f3EB"; + private_key = + "0xb7c548b5442f5b28236f0dcd619f65aaaafd952240908adcf9642d8e616587ee"; + } + in + let* receiver_balance_prev = + Eth_cli.balance ~account:receiver.address ~endpoint + in + let* () = + send_deposit_to_delayed_inbox + ~amount + ~l1_contracts + ~depositor + ~receiver:receiver.address + ~sc_rollup_node + ~sc_rollup_address + client + in + let* () = + wait_for_delayed_inbox_add_tx_and_injected + ~sequencer + ~sc_rollup_node + ~client + in + let*@ block = Rpc.get_block_by_number ~block:"latest" sequencer in + let transaction_hash = + match block.transactions with + | Hash txs -> List.hd txs + | Full _ | Empty -> + failwith "Block should contain at least one simple transaction" + in + let* () = bake_until_sync ~sc_rollup_node ~proxy ~sequencer ~client () in + let* receiver_balance_next = + Eth_cli.balance ~account:receiver.address ~endpoint + in + Check.((receiver_balance_next > receiver_balance_prev) Wei.typ) + ~error_msg:"Expected a bigger balance" ; + (* The following tracing should succeed. *) + let*@ _ = + Rpc.trace_transaction + ~tracer:"callTracer" + ~transaction_hash + ~tracer_config:[("withLog", `Bool false); ("onlyTopCall", `Bool false)] + sequencer + in + unit + let test_miner = let sequencer_pool_address = String.lowercase_ascii "0x8aaD6553Cf769Aa7b89174bE824ED0e53768ed70" @@ -6666,6 +6736,7 @@ let () = test_trace_transaction_calltracer_multiple_txs protocols ; test_trace_transaction_calltracer_on_simple_transfer protocols ; test_trace_transaction_calltracer_precompiles protocols ; + test_trace_transaction_calltracer_deposit protocols ; test_debug_print_store_schemas () ; test_man () ; test_describe_config () ; -- GitLab From 8569b89f374868857f2308f63d7d5a57f34aeab5 Mon Sep 17 00:00:00 2001 From: Rodi-Can Bozman Date: Wed, 21 Aug 2024 16:53:33 +0200 Subject: [PATCH 2/2] EVM/Kernel: trace deposits --- .../evm_execution/src/fa_bridge/mod.rs | 4 +- .../evm_execution/src/fa_bridge/test_utils.rs | 1 + etherlink/kernel_evm/kernel/src/apply.rs | 77 ++++++++++++++++++- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/etherlink/kernel_evm/evm_execution/src/fa_bridge/mod.rs b/etherlink/kernel_evm/evm_execution/src/fa_bridge/mod.rs index 6c0c732ce8bd..cab05b268535 100644 --- a/etherlink/kernel_evm/evm_execution/src/fa_bridge/mod.rs +++ b/etherlink/kernel_evm/evm_execution/src/fa_bridge/mod.rs @@ -46,6 +46,7 @@ use crate::{ account_storage::EthereumAccountStorage, handler::{CreateOutcome, EvmHandler, ExecutionOutcome}, precompiles::{PrecompileBTreeMap, PrecompileOutcome, SYSTEM_ACCOUNT_ADDRESS}, + trace::TracerInput, transaction::TransactionContext, withdrawal_counter::WithdrawalCounter, EthereumError, @@ -124,6 +125,7 @@ pub fn execute_fa_deposit<'a, Host: Runtime>( caller: H160, deposit: &FaDeposit, allocated_ticks: u64, + tracer_input: Option, ) -> Result { log!(host, Info, "Going to execute a {}", deposit.display()); @@ -138,7 +140,7 @@ pub fn execute_fa_deposit<'a, Host: Runtime>( block.base_fee_per_gas(), // Warm-cold access only used for evaluation (for checking EVM compatibility), but not in production false, - None, + tracer_input, ); handler.begin_initial_transaction(false, Some(FA_DEPOSIT_PROXY_GAS_LIMIT))?; diff --git a/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs b/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs index edaeb0a52ce3..174ecafeb3eb 100644 --- a/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs +++ b/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs @@ -110,6 +110,7 @@ pub fn run_fa_deposit( *caller, deposit, 1_000_000_000, + None, ) .expect("Failed to execute deposit") } diff --git a/etherlink/kernel_evm/kernel/src/apply.rs b/etherlink/kernel_evm/kernel/src/apply.rs index 14bca0689753..4350e3690e8f 100644 --- a/etherlink/kernel_evm/kernel/src/apply.rs +++ b/etherlink/kernel_evm/kernel/src/apply.rs @@ -6,13 +6,18 @@ // // SPDX-License-Identifier: MIT +use ethereum::Log; use evm_execution::account_storage::{EthereumAccount, EthereumAccountStorage}; use evm_execution::fa_bridge::deposit::FaDeposit; use evm_execution::fa_bridge::execute_fa_deposit; use evm_execution::handler::{ExecutionOutcome, ExtendedExitReason, RouterInterface}; use evm_execution::precompiles::PrecompileBTreeMap; use evm_execution::run_transaction; -use evm_execution::trace::{get_tracer_configuration, TracerInput}; +use evm_execution::storage::tracer; +use evm_execution::trace::TracerInput::CallTracer; +use evm_execution::trace::{ + get_tracer_configuration, CallTrace, CallTracerConfig, CallTracerInput, TracerInput, +}; use primitive_types::{H160, H256, U256}; use tezos_ethereum::block::BlockConstants; use tezos_ethereum::transaction::{TransactionHash, TransactionType}; @@ -40,7 +45,9 @@ impl Transaction { fn to(&self) -> Option { match &self.content { TransactionContent::Deposit(Deposit { receiver, .. }) => Some(*receiver), - TransactionContent::FaDeposit(_) => Some(H160::zero()), + TransactionContent::FaDeposit(FaDeposit { + receiver, proxy, .. + }) => Some(proxy.unwrap_or(*receiver)), TransactionContent::Ethereum(transaction) | TransactionContent::EthereumDelayed(transaction) => transaction.to, } @@ -412,14 +419,57 @@ fn apply_ethereum_transaction_common( } } +fn trace_deposit( + host: &mut Host, + amount: U256, + receiver: Option, + gas_used: u64, + logs: &[Log], + tracer_input: Option, +) { + if let Some(CallTracer(CallTracerInput { + transaction_hash, + config: CallTracerConfig { with_logs, .. }, + })) = tracer_input + { + let mut call_trace = CallTrace::new_minimal_trace( + "CALL".into(), + H160::zero(), + amount, + gas_used, + vec![], + 0, + ); + + call_trace.add_to(receiver); + + if with_logs { + call_trace.add_logs(Some(logs.to_owned())) + } + + let _ = tracer::store_call_trace(host, call_trace, &transaction_hash); + } +} + fn apply_deposit( host: &mut Host, evm_account_storage: &mut EthereumAccountStorage, deposit: &Deposit, + transaction: &Transaction, + tracer_input: Option, ) -> Result, Error> { let execution_outcome = execute_deposit(host, evm_account_storage, deposit, CONFIG) .map_err(Error::InvalidRunTransaction)?; + trace_deposit( + host, + transaction.value(), + transaction.to(), + execution_outcome.gas_used, + &execution_outcome.logs, + tracer_input, + ); + Ok(ExecutionResult::Valid(TransactionResult { caller: H160::zero(), gas_used: execution_outcome.gas_used.into(), @@ -428,6 +478,7 @@ fn apply_deposit( })) } +#[allow(clippy::too_many_arguments)] fn apply_fa_deposit( host: &mut Host, evm_account_storage: &mut EthereumAccountStorage, @@ -435,6 +486,8 @@ fn apply_fa_deposit( block_constants: &BlockConstants, precompiles: &PrecompileBTreeMap, allocated_ticks: u64, + transaction: &Transaction, + tracer_input: Option, ) -> Result, Error> { let caller = H160::zero(); let outcome = execute_fa_deposit( @@ -446,6 +499,7 @@ fn apply_fa_deposit( caller, fa_deposit, allocated_ticks, + tracer_input, ) .map_err(Error::InvalidRunTransaction)?; @@ -456,6 +510,15 @@ fn apply_fa_deposit( outcome.is_success() ); + trace_deposit( + host, + transaction.value(), + transaction.to(), + outcome.gas_used, + &outcome.logs, + tracer_input, + ); + Ok(ExecutionResult::Valid(TransactionResult { caller, gas_used: outcome.gas_used.into(), @@ -594,7 +657,13 @@ pub fn apply_transaction( )?, TransactionContent::Deposit(deposit) => { log!(host, Benchmarking, "Transaction type: DEPOSIT"); - apply_deposit(host, evm_account_storage, deposit)? + apply_deposit( + host, + evm_account_storage, + deposit, + transaction, + tracer_input, + )? } TransactionContent::FaDeposit(fa_deposit) => { log!(host, Benchmarking, "Transaction type: FA_DEPOSIT"); @@ -605,6 +674,8 @@ pub fn apply_transaction( block_constants, precompiles, allocated_ticks, + transaction, + tracer_input, )? } }; -- GitLab