Skip to content

Commit

Permalink
fix tx_accesslist_account_write for warm addresses in BeginTx (scroll…
Browse files Browse the repository at this point in the history
…-tech#1270)

### Description

Fixes state.tx_accesslist_account_write for warm addresses.

### Issue Link

Fixes:
privacy-scaling-explorations#1233

### Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] This change requires a documentation update

### How Has This Been Tested?

`cargo test -p zkevm-circuits --features test prover_error --
--nocapture --ignored`
with zkevm-chain fixtures
  • Loading branch information
pinkiebell authored Mar 2, 2023
1 parent 54fa68a commit d4b790e
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 12 deletions.
4 changes: 2 additions & 2 deletions bus-mapping/src/evm/opcodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -382,13 +382,13 @@ pub fn gen_begin_tx_ops(state: &mut CircuitInputStateRef) -> Result<ExecStep, Er

// Add caller and callee into access list
for address in [call.caller_address, call.address] {
state.sdb.add_account_to_access_list(address);
let is_warm_prev = !state.sdb.add_account_to_access_list(address);
state.tx_accesslist_account_write(
&mut exec_step,
state.tx_ctx.id(),
address,
true,
false,
is_warm_prev,
)?;
}

Expand Down
27 changes: 17 additions & 10 deletions zkevm-circuits/src/evm_circuit/execution/begin_tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ pub(crate) struct BeginTxGadget<F> {
is_empty_code_hash: IsEqualGadget<F>,
caller_nonce_hash_bytes: [Cell<F>; N_BYTES_WORD],
create: ContractCreateGadget<F, false>,
is_caller_callee_equal: Cell<F>,
}

impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
Expand Down Expand Up @@ -145,11 +146,14 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
0.expr(),
None,
);
let is_caller_callee_equal = cb.query_bool();
cb.account_access_list_write(
tx_id.expr(),
tx_callee_address.expr(),
1.expr(),
0.expr(),
// No extra constraint being used here.
// Correctness will be enforced in build_tx_access_list_account_constraints
is_caller_callee_equal.expr(),
None,
);

Expand Down Expand Up @@ -407,6 +411,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
is_empty_code_hash,
caller_nonce_hash_bytes,
create,
is_caller_callee_equal,
}
}

Expand Down Expand Up @@ -443,19 +448,16 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
.caller_address
.to_scalar()
.expect("unexpected Address -> Scalar conversion failure");
let callee_address = tx
.callee_address
.to_scalar()
.expect("unexpected Address -> Scalar conversion failure");
self.tx_caller_address
.assign(region, offset, Value::known(caller_address))?;
self.tx_caller_address_is_zero
.assign(region, offset, caller_address)?;
self.tx_callee_address.assign(
region,
offset,
Value::known(
tx.callee_address
.to_scalar()
.expect("unexpected Address -> Scalar conversion failure"),
),
)?;
self.tx_callee_address
.assign(region, offset, Value::known(callee_address))?;
self.call_callee_address.assign(
region,
offset,
Expand All @@ -469,6 +471,11 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
.expect("unexpected Address -> Scalar conversion failure"),
),
)?;
self.is_caller_callee_equal.assign(
region,
offset,
Value::known(F::from(caller_address == callee_address)),
)?;
self.tx_is_create
.assign(region, offset, Value::known(F::from(tx.is_create as u64)))?;
self.tx_call_data_length.assign(
Expand Down

0 comments on commit d4b790e

Please sign in to comment.