Skip to content
This repository was archived by the owner on Jul 5, 2024. It is now read-only.

Commit 45a7ba3

Browse files
WIP
1 parent 8d4d596 commit 45a7ba3

File tree

5 files changed

+20
-17
lines changed

5 files changed

+20
-17
lines changed

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,13 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
170170
AccountFieldTag::CodeHash,
171171
code_hash.to_word(),
172172
);
173-
cb.require_equal(
174-
"is create: callee_not_exists",
175-
tx.is_create.expr(),
176-
callee_not_exists.expr(),
177-
);
178173
// Transfer value from caller to callee, creating account if necessary.
179174
let transfer_with_gas_fee = TransferGadget::construct(
180175
cb,
181176
tx.caller_address.to_word(),
182177
tx.callee_address.to_word(),
183178
not::expr(callee_not_exists.expr()),
179+
tx.is_create.expr(),
184180
tx.value.clone(),
185181
&mut reversion_info,
186182
Some(tx.mul_gas_fee_by_gas.product().clone()),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
242242
caller_address.to_word(),
243243
callee_address.to_word(),
244244
not::expr(call_gadget.callee_not_exists.expr()),
245+
false.expr(),
245246
call_gadget.value.clone(),
246247
&mut callee_reversion_info,
247248
None,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
334334
create.caller_address(),
335335
contract_addr.to_word(),
336336
0.expr(),
337+
true.expr(),
337338
value.clone(),
338339
&mut callee_reversion_info,
339340
None,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
107107
cb,
108108
coinbase.to_word(),
109109
1.expr() - coinbase_code_hash_is_zero.expr(),
110+
false.expr(),
110111
mul_effective_tip_by_gas_used.product().clone(),
111112
None,
112113
);

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use bus_mapping::state_db::CodeDB;
3131
use eth_types::{
3232
evm_types::GasCost, Field, OpsIdentity, ToAddress, ToLittleEndian, ToScalar, ToWord, U256,
3333
};
34-
use gadgets::util::{select, sum};
34+
use gadgets::util::{or, select, sum};
3535
use halo2_proofs::{
3636
circuit::Value,
3737
plonk::{Error, Expression},
@@ -370,6 +370,7 @@ impl<F: Field, const N_ADDENDS: usize, const INCREASE: bool>
370370
pub(crate) struct TransferToGadget<F> {
371371
receiver: UpdateBalanceGadget<F, 2, true>,
372372
receiver_exists: Expression<F>,
373+
opcode_is_create: Expression<F>,
373374
value_is_zero: IsZeroWordGadget<F, Word32Cell<F>>,
374375
}
375376

@@ -379,6 +380,7 @@ impl<F: Field> TransferToGadget<F> {
379380
cb: &mut EVMConstraintBuilder<F>,
380381
receiver_address: WordLoHi<Expression<F>>,
381382
receiver_exists: Expression<F>,
383+
opcode_is_create: Expression<F>,
382384
value: Word32Cell<F>,
383385
mut reversion_info: Option<&mut ReversionInfo<F>>,
384386
) -> Self {
@@ -388,7 +390,7 @@ impl<F: Field> TransferToGadget<F> {
388390
cb.condition(
389391
and::expr([
390392
not::expr(receiver_exists.expr()),
391-
not::expr(value_is_zero.expr()),
393+
or::expr([not::expr(value_is_zero.expr()), opcode_is_create.expr()]),
392394
]),
393395
|cb| {
394396
cb.account_write(
@@ -408,6 +410,7 @@ impl<F: Field> TransferToGadget<F> {
408410
Self {
409411
receiver,
410412
receiver_exists,
413+
opcode_is_create,
411414
value_is_zero,
412415
}
413416
}
@@ -434,8 +437,9 @@ impl<F: Field> TransferToGadget<F> {
434437
pub(crate) fn rw_delta(&self) -> Expression<F> {
435438
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
436439
and::expr([
437-
not::expr(self.receiver_exists.expr()),not::expr(self.value_is_zero.expr())
438-
]) +
440+
not::expr(self.receiver_exists.expr()),
441+
or::expr([not::expr(self.value_is_zero.expr()), self.opcode_is_create.expr()])
442+
])+
439443
// +1 Write Account (receiver) Balance
440444
not::expr(self.value_is_zero.expr())
441445
}
@@ -463,6 +467,7 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
463467
sender_address: WordLoHi<Expression<F>>,
464468
receiver_address: WordLoHi<Expression<F>>,
465469
receiver_exists: Expression<F>,
470+
opcode_is_create: Expression<F>,
466471
value: Word32Cell<F>,
467472
reversion_info: &mut ReversionInfo<F>,
468473
gas_fee: Option<Word32Cell<F>>,
@@ -481,6 +486,7 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
481486
cb,
482487
receiver_address,
483488
receiver_exists,
489+
opcode_is_create,
484490
value,
485491
Some(reversion_info),
486492
);
@@ -496,20 +502,18 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
496502
pub(crate) fn rw_delta(&self) -> Expression<F> {
497503
// +1 Write Account (sender) Balance (Not Reversible tx fee)
498504
WITH_FEE.expr() +
499-
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
500-
self.receiver.rw_delta()+
501505
// +1 Write Account (sender) Balance
502-
// +1 Write Account (receiver) Balance
503-
not::expr(self.value_is_zero.expr()) * 2.expr()
506+
not::expr(self.value_is_zero.expr()) +
507+
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
508+
self.receiver.rw_delta()
504509
}
505510

506511
pub(crate) fn reversible_w_delta(&self) -> Expression<F> {
507512
// NOTE: Write Account (sender) Balance (Not Reversible tx fee)
508-
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
509-
self.receiver.rw_delta()+
510513
// +1 Write Account (sender) Balance
511-
// +1 Write Account (receiver) Balance
512-
not::expr(self.value_is_zero.expr()) * 2.expr()
514+
not::expr(self.value_is_zero.expr()) +
515+
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
516+
self.receiver.rw_delta()
513517
}
514518

515519
#[allow(clippy::too_many_arguments)]

0 commit comments

Comments
 (0)