Skip to content
This repository was archived by the owner on Apr 18, 2025. It is now read-only.

Commit 6c6865f

Browse files
z2trillionMason Lianglispc
authored
Set empty keccak codehash when account comes into existence (#536)
* Set empty keccak codehash * Handle non-scroll feature flag * Fix rebase * clippy * lint * Next rws for keccak code hash --------- Co-authored-by: Mason Liang <[email protected]> Co-authored-by: Zhuo Zhang <[email protected]>
1 parent 04d4bb4 commit 6c6865f

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

bus-mapping/src/circuit_input_builder/input_state_ref.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use super::{
55
CallKind, CodeSource, CopyEvent, ExecState, ExecStep, ExpEvent, Transaction,
66
TransactionContext,
77
};
8+
#[cfg(feature = "scroll")]
9+
use crate::util::KECCAK_CODE_HASH_ZERO;
810
use crate::{
911
error::{
1012
get_step_reported_error, ContractAddressCollisionError, DepthError, ExecError,
@@ -590,6 +592,16 @@ impl<'a> CircuitInputStateRef<'a> {
590592
value_prev: Word::zero(),
591593
},
592594
)?;
595+
#[cfg(feature = "scroll")]
596+
self.push_op_reversible(
597+
step,
598+
AccountOp {
599+
address: receiver,
600+
field: AccountField::KeccakCodeHash,
601+
value: KECCAK_CODE_HASH_ZERO.to_word(),
602+
value_prev: Word::zero(),
603+
},
604+
)?;
593605
}
594606
if value.is_zero() {
595607
// Skip transfer if value == 0

zkevm-circuits/src/evm_circuit/execution/begin_tx.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,8 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
642642
let must_create = tx.is_create;
643643
if (!callee_exists && !tx.value.is_zero()) || must_create {
644644
callee_code_hash = rws.next().account_codehash_pair().1;
645+
#[cfg(feature = "scroll")]
646+
let _callee_keccak_code_hash = rws.next();
645647
}
646648
let mut caller_balance_sub_value_pair = (zero, zero);
647649
let mut callee_balance_pair = (zero, zero);

zkevm-circuits/src/evm_circuit/execution/create.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,11 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
619619
.assign_value(region, offset, code_hash_previous_rlc)?;
620620
let is_address_collision = !code_hash_previous.0.is_zero();
621621

622+
#[cfg(feature = "scroll")]
623+
{
624+
rw_offset += 1; // Write empty Keccak code hash.
625+
}
626+
622627
if is_precheck_ok == 1 && !is_address_collision {
623628
let [caller_balance_pair, callee_balance_pair] = if !value.is_zero() {
624629
let account_balance_pair = [16, 17]

zkevm-circuits/src/evm_circuit/util/common_gadget.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,14 @@ impl<F: Field> TransferWithGasFeeGadget<F> {
412412
0.expr(),
413413
Some(reversion_info),
414414
);
415+
#[cfg(feature = "scroll")]
416+
cb.account_write(
417+
receiver_address.clone(),
418+
AccountFieldTag::KeccakCodeHash,
419+
cb.empty_keccak_hash_rlc(),
420+
0.expr(),
421+
Some(reversion_info),
422+
);
415423
},
416424
);
417425
// Skip transfer if value == 0
@@ -445,10 +453,11 @@ impl<F: Field> TransferWithGasFeeGadget<F> {
445453
// +1 Write Account (sender) Balance (Not Reversible tx fee)
446454
1.expr() +
447455
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
456+
// feature = "scroll": +1 Write Account (receiver) KeccakCodeHash
448457
or::expr([
449458
not::expr(self.value_is_zero.expr()) * not::expr(self.receiver_exists.clone()),
450459
self.must_create.clone()]
451-
) * 1.expr() +
460+
) * if cfg!(feature = "scroll") {2.expr()} else {1.expr()} +
452461
// +1 Write Account (sender) Balance
453462
// +1 Write Account (receiver) Balance
454463
not::expr(self.value_is_zero.expr()) * 2.expr()
@@ -457,10 +466,11 @@ impl<F: Field> TransferWithGasFeeGadget<F> {
457466
pub(crate) fn reversible_w_delta(&self) -> Expression<F> {
458467
// NOTE: Write Account (sender) Balance (Not Reversible tx fee)
459468
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
469+
// feature = "scroll": +1 Write Account (receiver) KeccakCodeHash
460470
or::expr([
461471
not::expr(self.value_is_zero.expr()) * not::expr(self.receiver_exists.clone()),
462472
self.must_create.clone()]
463-
) * 1.expr() +
473+
) * if cfg!(feature = "scroll") {2.expr()} else {1.expr()} +
464474
// +1 Write Account (sender) Balance
465475
// +1 Write Account (receiver) Balance
466476
not::expr(self.value_is_zero.expr()) * 2.expr()
@@ -542,8 +552,14 @@ impl<F: Field> TransferGadget<F> {
542552
0.expr(),
543553
Some(reversion_info),
544554
);
545-
// TODO: also write empty keccak code hash? codesize seems not need yet. write a
546-
// test to verify this.
555+
#[cfg(feature = "scroll")]
556+
cb.account_write(
557+
receiver_address.clone(),
558+
AccountFieldTag::KeccakCodeHash,
559+
cb.empty_keccak_hash_rlc(),
560+
0.expr(),
561+
Some(reversion_info),
562+
);
547563
},
548564
);
549565
// Skip transfer if value == 0
@@ -582,21 +598,23 @@ impl<F: Field> TransferGadget<F> {
582598

583599
pub(crate) fn rw_delta(&self) -> Expression<F> {
584600
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
601+
// feature = "scroll": +1 Write Account (receiver) KeccakCodeHash
585602
or::expr([
586603
not::expr(self.value_is_zero.expr()) * not::expr(self.receiver_exists.clone()),
587604
self.must_create.clone()]
588-
) * 1.expr() +
605+
) * if cfg!(feature = "scroll") {2.expr()} else {1.expr()} +
589606
// +1 Write Account (sender) Balance
590607
// +1 Write Account (receiver) Balance
591608
not::expr(self.value_is_zero.expr()) * 2.expr()
592609
}
593610

594611
pub(crate) fn reversible_w_delta(&self) -> Expression<F> {
595612
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
613+
// if feature = "scroll": +1 Write Account (receiver) KeccakCodeHash
596614
or::expr([
597615
not::expr(self.value_is_zero.expr()) * not::expr(self.receiver_exists.clone()),
598-
self.must_create.clone()]
599-
) * 1.expr() +
616+
self.must_create.clone(),
617+
]) * if cfg!(feature = "scroll") {2.expr()} else {1.expr()} +
600618
// +1 Write Account (sender) Balance
601619
// +1 Write Account (receiver) Balance
602620
not::expr(self.value_is_zero.expr()) * 2.expr()

0 commit comments

Comments
 (0)