From 8c231e147d5f56a002a2139457e1b1cf9730aa85 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Wed, 21 Feb 2024 21:38:00 +0300 Subject: [PATCH 01/12] fix(begin_tx): add todo --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index 80de4c1973..2d4be49cd5 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -209,6 +209,8 @@ impl ExecutionGadget for BeginTxGadget { create.caller_nonce(), ); + // TODO: add missing constraints: + // 1. Handle contract creation transaction. cb.condition(tx.is_create.expr(), |cb| { cb.keccak_table_lookup( From 4390f88862f3400db7850c9bb661401bfb16a848 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Thu, 22 Feb 2024 10:30:51 +0300 Subject: [PATCH 02/12] fix(zkevm-circuits/begin_tx): add comments --- .../src/evm_circuit/execution/begin_tx.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index 2d4be49cd5..ed9f7ba96a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -113,7 +113,7 @@ impl ExecutionGadget for BeginTxGadget { tx_id.expr(), WordLoHi::new([addr.expr(), 0.expr()]), 1.expr(), - 0.expr(), + 0.expr(), // Here value_prev is 0 None, ); } // rwc_delta += PRECOMPILE_COUNT @@ -123,17 +123,17 @@ impl ExecutionGadget for BeginTxGadget { tx_id.expr(), tx.caller_address.to_word(), 1.expr(), - 0.expr(), + 0.expr(), // Here too None, ); // rwc_delta += 1 - let is_caller_callee_equal = cb.query_bool(); + let is_caller_callee_equal = cb.query_bool(); // What does this variable mean? cb.account_access_list_write_unchecked( tx_id.expr(), tx.callee_address.to_word(), 1.expr(), // No extra constraint being used here. // Correctness will be enforced in build_tx_access_list_account_constraints - is_caller_callee_equal.expr(), + is_caller_callee_equal.expr(), // And value_prev = is_caller_callee_equal None, ); // rwc_delta += 1 @@ -149,7 +149,7 @@ impl ExecutionGadget for BeginTxGadget { tx_id.expr(), coinbase.to_word(), 1.expr(), - is_coinbase_warm.expr(), + is_coinbase_warm.expr(), // Why value_prev is = is_coinbase_warm? None, ); // rwc_delta += 1 @@ -160,6 +160,7 @@ impl ExecutionGadget for BeginTxGadget { // no_callee_code is true when the account exists and has empty // code hash, or when the account doesn't exist (which we encode with // code_hash = 0). + // Why do we have summation here if any of the terms is enough? let no_callee_code = is_empty_code_hash.expr() + callee_not_exists.expr(); // TODO: And not precompile @@ -183,7 +184,7 @@ impl ExecutionGadget for BeginTxGadget { &mut reversion_info, ); - let caller_nonce_hash_bytes = cb.query_word32(); + let caller_nonce_hash_bytes = cb.query_word32(); // What's this variable for? let create = ContractCreateGadget::construct(cb); cb.require_equal_word( "tx caller address equivalence", @@ -209,8 +210,6 @@ impl ExecutionGadget for BeginTxGadget { create.caller_nonce(), ); - // TODO: add missing constraints: - // 1. Handle contract creation transaction. cb.condition(tx.is_create.expr(), |cb| { cb.keccak_table_lookup( From 4f77fa23dcceacd1bd9d76e33a89adb6c1868f31 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Fri, 23 Feb 2024 13:06:10 +0300 Subject: [PATCH 03/12] fix(zkevm-circuits/begin_tx): remove unnecessary comments --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index ed9f7ba96a..ee6386ef06 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -113,7 +113,7 @@ impl ExecutionGadget for BeginTxGadget { tx_id.expr(), WordLoHi::new([addr.expr(), 0.expr()]), 1.expr(), - 0.expr(), // Here value_prev is 0 + 0.expr(), None, ); } // rwc_delta += PRECOMPILE_COUNT @@ -123,10 +123,10 @@ impl ExecutionGadget for BeginTxGadget { tx_id.expr(), tx.caller_address.to_word(), 1.expr(), - 0.expr(), // Here too + 0.expr(), None, ); // rwc_delta += 1 - let is_caller_callee_equal = cb.query_bool(); // What does this variable mean? + let is_caller_callee_equal = cb.query_bool(); cb.account_access_list_write_unchecked( tx_id.expr(), tx.callee_address.to_word(), @@ -149,7 +149,7 @@ impl ExecutionGadget for BeginTxGadget { tx_id.expr(), coinbase.to_word(), 1.expr(), - is_coinbase_warm.expr(), // Why value_prev is = is_coinbase_warm? + is_coinbase_warm.expr(), None, ); // rwc_delta += 1 @@ -184,7 +184,7 @@ impl ExecutionGadget for BeginTxGadget { &mut reversion_info, ); - let caller_nonce_hash_bytes = cb.query_word32(); // What's this variable for? + let caller_nonce_hash_bytes = cb.query_word32(); let create = ContractCreateGadget::construct(cb); cb.require_equal_word( "tx caller address equivalence", From 1ab9f991cd9f5ce035dca1de148d72171faa49d1 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Fri, 23 Feb 2024 13:08:06 +0300 Subject: [PATCH 04/12] fix(zkevm-circuits/begin_tx): remove unnecessary comments --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index ee6386ef06..d28ea33944 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -160,7 +160,6 @@ impl ExecutionGadget for BeginTxGadget { // no_callee_code is true when the account exists and has empty // code hash, or when the account doesn't exist (which we encode with // code_hash = 0). - // Why do we have summation here if any of the terms is enough? let no_callee_code = is_empty_code_hash.expr() + callee_not_exists.expr(); // TODO: And not precompile From 8996f371c0446ed2462e55df5718391cf2d1ed85 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Mon, 4 Mar 2024 13:28:30 +0300 Subject: [PATCH 05/12] fix(zkevm-circuits/begin_tx): minor refactor & todo comment --- .../src/evm_circuit/execution/begin_tx.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index d28ea33944..37e5146172 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -190,6 +190,14 @@ impl ExecutionGadget for BeginTxGadget { tx.caller_address.to_word(), create.caller_address(), ); + + cb.require_equal( + "tx nonce equivalence", + tx.nonce.expr(), + create.caller_nonce(), + ); + + // 1. Handle contract creation transaction. cb.condition(tx.is_create.expr(), |cb| { cb.require_equal_word( "call callee address equivalence", @@ -202,21 +210,14 @@ impl ExecutionGadget for BeginTxGadget { ) .to_word(), ); - }); - cb.require_equal( - "tx nonce equivalence", - tx.nonce.expr(), - create.caller_nonce(), - ); - - // 1. Handle contract creation transaction. - cb.condition(tx.is_create.expr(), |cb| { cb.keccak_table_lookup( create.input_rlc(cb), create.input_length(), caller_nonce_hash_bytes.to_word(), ); + // cb.keccak_table_lookup(input_rlc, input_len, output); + cb.account_write( call_callee_address.to_word(), AccountFieldTag::Nonce, From 13d9cba818db917556a9e2b741b290251a56d585 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Mon, 4 Mar 2024 13:32:31 +0300 Subject: [PATCH 06/12] fix(zkevm-circuits/begin_tx): remove unnecessary comment --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index 37e5146172..59e513468c 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -133,7 +133,7 @@ impl ExecutionGadget for BeginTxGadget { 1.expr(), // No extra constraint being used here. // Correctness will be enforced in build_tx_access_list_account_constraints - is_caller_callee_equal.expr(), // And value_prev = is_caller_callee_equal + is_caller_callee_equal.expr(), None, ); // rwc_delta += 1 From c40d3da4bf1f4b14ac3b9f607949eb342ed0dfe3 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Mon, 4 Mar 2024 15:38:38 +0300 Subject: [PATCH 07/12] fix(zkevm-circuits/begin_tx): add constraints --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index 59e513468c..9980c80abb 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -216,7 +216,16 @@ impl ExecutionGadget for BeginTxGadget { caller_nonce_hash_bytes.to_word(), ); - // cb.keccak_table_lookup(input_rlc, input_len, output); + cb.keccak_table_lookup( + create.code_hash_keccak_rlc(cb), + 32.expr(), + cb.curr.state.code_hash.to_word(), + ); + cb.require_equal_word( + "code hash equivalence", + code_hash.to_word(), + create.code_hash().to_word(), + ); cb.account_write( call_callee_address.to_word(), From bc6715a23a893b8c09a8a20897451795a8cad960 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Mon, 4 Mar 2024 23:36:53 +0300 Subject: [PATCH 08/12] fix(zkevm-circuits/begin_tx): fix added constraints --- .../src/evm_circuit/execution/begin_tx.rs | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index 9980c80abb..fffcc0d624 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -20,13 +20,13 @@ use crate::{ }, witness::{Block, Call, ExecStep, Transaction}, }, - table::{AccountFieldTag, BlockContextFieldTag, CallContextFieldTag}, + table::{AccountFieldTag, BlockContextFieldTag, CallContextFieldTag, TxContextFieldTag}, util::{ word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; -use bus_mapping::state_db::CodeDB; +use bus_mapping::{circuit_input_builder::CopyDataType, state_db::CodeDB}; use eth_types::{evm_types::PRECOMPILE_COUNT, keccak256, Field, OpsIdentity, ToWord, U256}; use halo2_proofs::{ circuit::Value, @@ -216,16 +216,26 @@ impl ExecutionGadget for BeginTxGadget { caller_nonce_hash_bytes.to_word(), ); + let length = cb.tx_context(tx_id.expr(), TxContextFieldTag::CallDataLength, None); + let copy_rwc_inc = cb.query_cell(); + let rlc_acc = cb.query_cell_phase2(); + cb.copy_table_lookup( + WordLoHi::from_lo_unchecked(tx_id.expr()), + CopyDataType::TxCalldata.expr(), + WordLoHi::zero(), + CopyDataType::RlcAcc.expr(), + 0.expr(), + length.expr(), + 0.expr(), + length.expr(), + rlc_acc.expr(), + copy_rwc_inc.expr(), + ); cb.keccak_table_lookup( - create.code_hash_keccak_rlc(cb), - 32.expr(), + rlc_acc.expr(), + length.expr(), cb.curr.state.code_hash.to_word(), ); - cb.require_equal_word( - "code hash equivalence", - code_hash.to_word(), - create.code_hash().to_word(), - ); cb.account_write( call_callee_address.to_word(), From 757dbf174971a7a32f5f39c23a392032d26600e5 Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Tue, 5 Mar 2024 15:16:01 +0300 Subject: [PATCH 09/12] fix(zkevm-circuits/begin_tx): fix the constraint --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index fffcc0d624..dc1ae145e4 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -217,7 +217,6 @@ impl ExecutionGadget for BeginTxGadget { ); let length = cb.tx_context(tx_id.expr(), TxContextFieldTag::CallDataLength, None); - let copy_rwc_inc = cb.query_cell(); let rlc_acc = cb.query_cell_phase2(); cb.copy_table_lookup( WordLoHi::from_lo_unchecked(tx_id.expr()), @@ -229,7 +228,7 @@ impl ExecutionGadget for BeginTxGadget { 0.expr(), length.expr(), rlc_acc.expr(), - copy_rwc_inc.expr(), + 0.expr(), ); cb.keccak_table_lookup( rlc_acc.expr(), From 2291146244cb98d486bf5321eb65b42aa38bb9b1 Mon Sep 17 00:00:00 2001 From: Eduard S Date: Wed, 6 Mar 2024 11:09:07 +0000 Subject: [PATCH 10/12] fix: add missing copy event, keccak input, cell assignments, calldata.len=0 case --- .../src/circuit_input_builder/block.rs | 3 +- bus-mapping/src/evm/opcodes/begin_end_tx.rs | 27 +++++++- .../src/evm_circuit/execution/begin_tx.rs | 69 ++++++++++++++----- 3 files changed, 80 insertions(+), 19 deletions(-) diff --git a/bus-mapping/src/circuit_input_builder/block.rs b/bus-mapping/src/circuit_input_builder/block.rs index fa0abc6f41..219a844ce4 100644 --- a/bus-mapping/src/circuit_input_builder/block.rs +++ b/bus-mapping/src/circuit_input_builder/block.rs @@ -84,7 +84,8 @@ pub struct Block { pub block_steps: BlockSteps, /// Copy events in this block. pub copy_events: Vec, - /// Inputs to the SHA3 opcode + /// Inputs to the SHA3 opcode as well as data hashed during the EVM execution like init code + /// and address creation inputs. pub sha3_inputs: Vec>, /// Exponentiation events in the block. pub exp_events: Vec, diff --git a/bus-mapping/src/evm/opcodes/begin_end_tx.rs b/bus-mapping/src/evm/opcodes/begin_end_tx.rs index 1b6c79a5c8..a760b1850f 100644 --- a/bus-mapping/src/evm/opcodes/begin_end_tx.rs +++ b/bus-mapping/src/evm/opcodes/begin_end_tx.rs @@ -1,6 +1,8 @@ use super::TxExecSteps; use crate::{ - circuit_input_builder::{Call, CircuitInputStateRef, ExecState, ExecStep}, + circuit_input_builder::{ + Call, CircuitInputStateRef, CopyDataType, CopyEvent, ExecState, ExecStep, NumberOrHash, + }, operation::{AccountField, AccountOp, CallContextField, TxReceiptField, TxRefundOp, RW}, state_db::CodeDB, Error, @@ -148,6 +150,29 @@ fn gen_begin_tx_steps(state: &mut CircuitInputStateRef) -> Result 0 { + state.push_copy( + &mut exec_step, + CopyEvent { + src_addr: 0, + src_addr_end: state.tx.call_data.len() as u64, + src_type: CopyDataType::TxCalldata, + src_id: NumberOrHash::Number(state.tx.id as usize), + dst_addr: 0, + dst_type: CopyDataType::RlcAcc, + dst_id: NumberOrHash::Number(0), + log_id: None, + rw_counter_start: state.block_ctx.rwc, + bytes: state.tx.call_data.iter().map(|b| (*b, false)).collect(), + }, + ); + } + dbg!((state.tx.id, state.tx.call_data.len(), &state.tx.call_data)); } // There are 4 branches from here. diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index dc1ae145e4..5f19ad7bbe 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -12,9 +12,10 @@ use crate::{ }, is_precompiled, math_gadget::{ - ContractCreateGadget, IsEqualWordGadget, IsZeroWordGadget, RangeCheckGadget, + ContractCreateGadget, IsEqualWordGadget, IsZeroGadget, IsZeroWordGadget, + RangeCheckGadget, }, - not, or, + not, or, rlc, tx::{BeginTxHelperGadget, TxDataGadget}, AccountAddress, CachedRegion, Cell, StepRws, }, @@ -45,6 +46,9 @@ pub(crate) struct BeginTxGadget { code_hash: WordLoHiCell, is_empty_code_hash: IsEqualWordGadget>, WordLoHi>>, caller_nonce_hash_bytes: Word32Cell, + calldata_length: Cell, + calldata_length_is_zero: IsZeroGadget, + calldata_rlc: Cell, create: ContractCreateGadget, callee_not_exists: IsZeroWordGadget>, is_caller_callee_equal: Cell, @@ -184,6 +188,9 @@ impl ExecutionGadget for BeginTxGadget { ); let caller_nonce_hash_bytes = cb.query_word32(); + let calldata_length = cb.query_cell(); + let calldata_length_is_zero = cb.is_zero(calldata_length.expr()); + let calldata_rlc = cb.query_cell_phase2(); let create = ContractCreateGadget::construct(cb); cb.require_equal_word( "tx caller address equivalence", @@ -216,23 +223,36 @@ impl ExecutionGadget for BeginTxGadget { caller_nonce_hash_bytes.to_word(), ); - let length = cb.tx_context(tx_id.expr(), TxContextFieldTag::CallDataLength, None); - let rlc_acc = cb.query_cell_phase2(); - cb.copy_table_lookup( - WordLoHi::from_lo_unchecked(tx_id.expr()), - CopyDataType::TxCalldata.expr(), - WordLoHi::zero(), - CopyDataType::RlcAcc.expr(), - 0.expr(), - length.expr(), - 0.expr(), - length.expr(), - rlc_acc.expr(), - 0.expr(), + cb.tx_context_lookup( + tx_id.expr(), + TxContextFieldTag::CallDataLength, + None, + WordLoHi::from_lo_unchecked(calldata_length.expr()), ); + // If calldata_length > 0 we use the copy circuit to calculate the calldata_rlc for the + // keccack input. + cb.condition(not::expr(calldata_length_is_zero.expr()), |cb| { + cb.copy_table_lookup( + WordLoHi::from_lo_unchecked(tx_id.expr()), + CopyDataType::TxCalldata.expr(), + WordLoHi::zero(), + CopyDataType::RlcAcc.expr(), + 0.expr(), + calldata_length.expr(), + 0.expr(), + calldata_length.expr(), + calldata_rlc.expr(), + 0.expr(), + ) + }); + // If calldata_length == 0, the copy circuit will not contain any entry, so we skip the + // lookup and instead force calldata_rlc to be 0 for the keccack input. + cb.condition(calldata_length_is_zero.expr(), |cb| { + cb.require_equal("calldata_rlc = 0", calldata_rlc.expr(), 0.expr()); + }); cb.keccak_table_lookup( - rlc_acc.expr(), - length.expr(), + calldata_rlc.expr(), + calldata_length.expr(), cb.curr.state.code_hash.to_word(), ); @@ -454,6 +474,9 @@ impl ExecutionGadget for BeginTxGadget { code_hash, is_empty_code_hash, caller_nonce_hash_bytes, + calldata_length, + calldata_length_is_zero, + calldata_rlc, create, callee_not_exists, is_caller_callee_equal, @@ -554,6 +577,18 @@ impl ExecutionGadget for BeginTxGadget { offset, U256::from_big_endian(&untrimmed_contract_addr), )?; + self.calldata_length.assign( + region, + offset, + Value::known(F::from(tx.call_data.len() as u64)), + )?; + self.calldata_length_is_zero + .assign(region, offset, F::from(tx.call_data.len() as u64))?; + let calldata_rlc = region + .challenges() + .keccak_input() + .map(|randomness| rlc::value(tx.call_data.iter().rev(), randomness)); + self.calldata_rlc.assign(region, offset, calldata_rlc)?; self.create.assign( region, offset, From f69053ee88984f668e8720a1206ba8af56a661ef Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Wed, 6 Mar 2024 21:00:11 +0300 Subject: [PATCH 11/12] fix(zkevm-circuits/begin_tx): remove unnecessary import --- zkevm-circuits/src/evm_circuit/execution/begin_tx.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index 73bc957384..307d2198f0 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -15,7 +15,7 @@ use crate::{ ContractCreateGadget, IsEqualWordGadget, IsZeroGadget, IsZeroWordGadget, RangeCheckGadget, }, - not, or, rlc, + not, rlc, tx::{BeginTxHelperGadget, TxDataGadget}, AccountAddress, CachedRegion, Cell, StepRws, }, From b6494f1f9696f9f20aeba1e068ee93ad1927d4be Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Fri, 8 Mar 2024 15:51:03 +0300 Subject: [PATCH 12/12] fix(bus_mapping/begin_end_tx): remove dbg --- bus-mapping/src/evm/opcodes/begin_end_tx.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/bus-mapping/src/evm/opcodes/begin_end_tx.rs b/bus-mapping/src/evm/opcodes/begin_end_tx.rs index 537b1ec576..69ad7432f0 100644 --- a/bus-mapping/src/evm/opcodes/begin_end_tx.rs +++ b/bus-mapping/src/evm/opcodes/begin_end_tx.rs @@ -172,7 +172,6 @@ fn gen_begin_tx_steps(state: &mut CircuitInputStateRef) -> Result