diff --git a/bus-mapping/src/evm/opcodes/begin_end_tx.rs b/bus-mapping/src/evm/opcodes/begin_end_tx.rs index ef3ba90ff9..20208a1fd3 100644 --- a/bus-mapping/src/evm/opcodes/begin_end_tx.rs +++ b/bus-mapping/src/evm/opcodes/begin_end_tx.rs @@ -6,7 +6,7 @@ use crate::{ Error, }; use eth_types::{ - evm_types::{GasCost, MAX_REFUND_QUOTIENT_OF_GAS_USED}, + evm_types::{GasCost, MAX_REFUND_QUOTIENT_OF_GAS_USED, PRECOMPILE_COUNT}, evm_unimplemented, ToWord, Word, }; use ethers_core::utils::get_contract_address; @@ -60,6 +60,19 @@ fn gen_begin_tx_steps(state: &mut CircuitInputStateRef) -> Result ExecutionGadget for BeginTxGadget { let gas_left = tx_gas.expr() - intrinsic_gas_cost; let sufficient_gas_left = RangeCheckGadget::construct(cb, gas_left.clone()); + // Add precompile contract address to access list + for addr in 1..=PRECOMPILE_COUNT { + cb.account_access_list_write_unchecked( + tx_id.expr(), + Word::new([addr.expr(), 0.expr()]), + 1.expr(), + 0.expr(), + None, + ); + } // rwc_delta += PRECOMPILE_COUNT + // Prepare access list of caller and callee cb.account_access_list_write_unchecked( tx_id.expr(), @@ -320,6 +334,7 @@ impl ExecutionGadget for BeginTxGadget { // - Write CallContext IsPersistent // - Write CallContext IsSuccess // - Write Account (Caller) Nonce + // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT // - Write TxAccessListAccount (Caller) // - Write TxAccessListAccount (Callee) // - Write TxAccessListAccount (Coinbase) for EIP-3651 @@ -338,7 +353,9 @@ impl ExecutionGadget for BeginTxGadget { // - Write CallContext IsRoot // - Write CallContext IsCreate // - Write CallContext CodeHash - rw_counter: Delta(23.expr() + transfer_with_gas_fee.rw_delta()), + rw_counter: Delta( + 23.expr() + transfer_with_gas_fee.rw_delta() + PRECOMPILE_COUNT.expr(), + ), call_id: To(call_id.expr()), is_root: To(true.expr()), is_create: To(tx_is_create.expr()), @@ -377,12 +394,15 @@ impl ExecutionGadget for BeginTxGadget { // - Write CallContext IsPersistent // - Write CallContext IsSuccess // - Write Account Nonce + // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT // - Write TxAccessListAccount (Caller) // - Write TxAccessListAccount (Callee) // - Write TxAccessListAccount (Coinbase) for EIP-3651 // - Read Account CodeHash // - a TransferWithGasFeeGadget - rw_counter: Delta(9.expr() + transfer_with_gas_fee.rw_delta()), + rw_counter: Delta( + 9.expr() + transfer_with_gas_fee.rw_delta() + PRECOMPILE_COUNT.expr(), + ), call_id: To(call_id.expr()), ..StepStateTransition::any() }); @@ -437,6 +457,7 @@ impl ExecutionGadget for BeginTxGadget { // - Write CallContext IsPersistent // - Write CallContext IsSuccess // - Write Account Nonce + // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT // - Write TxAccessListAccount (Caller) // - Write TxAccessListAccount (Callee) // - Write TxAccessListAccount (Coinbase) for EIP-3651 @@ -455,7 +476,9 @@ impl ExecutionGadget for BeginTxGadget { // - Write CallContext IsRoot // - Write CallContext IsCreate // - Write CallContext CodeHash - rw_counter: Delta(22.expr() + transfer_with_gas_fee.rw_delta()), + rw_counter: Delta( + 22.expr() + transfer_with_gas_fee.rw_delta() + PRECOMPILE_COUNT.expr(), + ), call_id: To(call_id.expr()), is_root: To(true.expr()), is_create: To(tx_is_create.expr()), @@ -511,6 +534,8 @@ impl ExecutionGadget for BeginTxGadget { let mut rws = StepRws::new(block, step); rws.offset_add(7); + rws.offset_add(PRECOMPILE_COUNT as usize); + let is_coinbase_warm = rws.next().tx_access_list_value_pair().1; let mut callee_code_hash = zero; if !is_precompiled(&tx.to_or_contract_addr()) { diff --git a/zkevm-circuits/src/evm_circuit/util.rs b/zkevm-circuits/src/evm_circuit/util.rs index 94cbc890f3..cb9d3313ca 100644 --- a/zkevm-circuits/src/evm_circuit/util.rs +++ b/zkevm-circuits/src/evm_circuit/util.rs @@ -473,9 +473,9 @@ impl<'a> StepRws<'a> { offset: 0, } } - /// Increment the step rw operation offset by `offset`. - pub(crate) fn offset_add(&mut self, offset: usize) { - self.offset = offset + /// Increment the step rw operation offset by `inc`. + pub(crate) fn offset_add(&mut self, inc: usize) { + self.offset += inc } /// Return the next rw operation from the step. pub(crate) fn next(&mut self) -> Rw { diff --git a/zkevm-circuits/src/witness/block.rs b/zkevm-circuits/src/witness/block.rs index ff790740f2..b9f313b976 100644 --- a/zkevm-circuits/src/witness/block.rs +++ b/zkevm-circuits/src/witness/block.rs @@ -63,7 +63,7 @@ impl Block { println!("> Step {:?}", step.exec_state); for rw_idx in 0..step.bus_mapping_instance.len() { let rw = self.get_rws(step, rw_idx); - let rw_str = if rw.is_write() { "READ" } else { "WRIT" }; + let rw_str = if rw.is_write() { "WRIT" } else { "READ" }; println!(" {} {} {:?}", rw.rw_counter(), rw_str, rw); } }