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

Commit 4a400a3

Browse files
move all the transfer rws handling to transfer gadget
1 parent 52024db commit 4a400a3

File tree

5 files changed

+52
-88
lines changed

5 files changed

+52
-88
lines changed

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

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -466,21 +466,13 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
466466
}
467467
let callee_exists =
468468
is_precompiled(&tx.to_or_contract_addr()) || !callee_code_hash.is_zero();
469-
let caller_balance_sub_fee_pair = rws.next().account_balance_pair();
470-
471-
let caller_balance_sub_value_pair = if !tx.value.is_zero() {
472-
rws.next().account_balance_pair()
473-
} else {
474-
(zero, zero)
475-
};
476-
if !callee_exists && (!tx.value.is_zero() || tx.is_create()) {
477-
callee_code_hash = rws.next().account_codehash_pair().1;
478-
}
479-
let callee_balance_pair = if !tx.value.is_zero() {
480-
rws.next().account_balance_pair()
481-
} else {
482-
(zero, zero)
483-
};
469+
self.transfer_with_gas_fee.assign(
470+
region,
471+
offset,
472+
&mut rws,
473+
(callee_exists, tx.value, tx.is_create()),
474+
Some(gas_fee),
475+
)?;
484476
self.begin_tx.assign(region, offset, tx)?;
485477
self.tx.assign(region, offset, tx)?;
486478

@@ -504,18 +496,6 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
504496
)?;
505497
self.sufficient_gas_left
506498
.assign(region, offset, F::from(tx.gas() - step.gas_cost))?;
507-
self.transfer_with_gas_fee.assign(
508-
region,
509-
offset,
510-
(
511-
Some(caller_balance_sub_fee_pair.0),
512-
Some(caller_balance_sub_fee_pair.1),
513-
),
514-
caller_balance_sub_value_pair,
515-
callee_balance_pair,
516-
tx.value,
517-
Some(gas_fee),
518-
)?;
519499
self.code_hash
520500
.assign_u256(region, offset, callee_code_hash)?;
521501
self.is_empty_code_hash.assign_u256(

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

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -867,20 +867,12 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
867867
depth.low_u64() < 1025 && (!(is_call || is_callcode) || caller_balance >= value);
868868

869869
// conditionally assign
870-
if is_call && is_precheck_ok && !value.is_zero() {
871-
if !callee_exists {
872-
rws.next().account_codehash_pair(); // callee hash
873-
}
874-
875-
let caller_balance_pair = rws.next().account_balance_pair();
876-
let callee_balance_pair = rws.next().account_balance_pair();
870+
if is_call && is_precheck_ok {
877871
self.transfer.assign(
878872
region,
879873
offset,
880-
(None, None),
881-
caller_balance_pair,
882-
callee_balance_pair,
883-
value,
874+
&mut rws,
875+
(callee_exists, value, false),
884876
None,
885877
)?;
886878
}

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -639,22 +639,11 @@ impl<F: Field, const IS_CREATE2: bool, const S: ExecutionState> ExecutionGadget<
639639

640640
let code_hash = if is_precheck_ok {
641641
if !is_address_collision {
642-
// transfer
643-
if callee_prev_code_hash.is_zero() {
644-
rws.next(); // codehash update
645-
}
646-
let [caller_balance_pair, callee_balance_pair] = if !value.is_zero() {
647-
[(); 2].map(|_| rws.next().account_balance_pair())
648-
} else {
649-
[(0.into(), 0.into()), (0.into(), 0.into())]
650-
};
651642
self.transfer.assign(
652643
region,
653644
offset,
654-
(None, None),
655-
caller_balance_pair,
656-
callee_balance_pair,
657-
value,
645+
&mut rws,
646+
(!callee_prev_code_hash.is_zero(), value, true),
658647
None,
659648
)?;
660649
}

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

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
MulWordByU64Gadget,
1212
},
1313
tx::EndTxHelperGadget,
14-
CachedRegion, Cell,
14+
CachedRegion, Cell, StepRws,
1515
},
1616
witness::{Block, Call, ExecStep, Transaction},
1717
},
@@ -150,9 +150,11 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
150150
step: &ExecStep,
151151
) -> Result<(), Error> {
152152
let gas_used = tx.gas() - step.gas_left;
153-
let (refund, _) = block.get_rws(step, 2).tx_refund_value_pair();
154-
let (caller_balance, caller_balance_prev) = block.get_rws(step, 3).account_balance_pair();
155-
let (coinbase_code_hash_prev, _) = block.get_rws(step, 4).account_codehash_pair();
153+
let mut rws = StepRws::new(block, step);
154+
rws.offset_add(2);
155+
let (refund, _) = rws.next().tx_refund_value_pair();
156+
let (caller_balance, caller_balance_prev) = rws.next().account_balance_pair();
157+
let (coinbase_code_hash_prev, _) = rws.next().account_codehash_pair();
156158

157159
self.tx_id
158160
.assign(region, offset, Value::known(F::from(tx.id)))?;
@@ -206,24 +208,12 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
206208
.assign_u256(region, offset, coinbase_code_hash_prev)?;
207209
self.coinbase_code_hash_is_zero
208210
.assign_u256(region, offset, coinbase_code_hash_prev)?;
209-
if !coinbase_reward.is_zero() {
210-
let coinbase_balance_pair = block
211-
.get_rws(
212-
step,
213-
if coinbase_code_hash_prev.is_zero() {
214-
6
215-
} else {
216-
5
217-
},
218-
)
219-
.account_balance_pair();
220-
self.coinbase_reward.assign(
221-
region,
222-
offset,
223-
coinbase_balance_pair,
224-
effective_tip * gas_used,
225-
)?;
226-
}
211+
self.coinbase_reward.assign(
212+
region,
213+
offset,
214+
&mut rws,
215+
(!coinbase_code_hash_prev.is_zero(), coinbase_reward, false),
216+
)?;
227217
self.is_persistent.assign(
228218
region,
229219
offset,

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

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{
33
from_bytes,
44
math_gadget::{IsEqualWordGadget, IsZeroGadget, IsZeroWordGadget, LtGadget},
55
memory_gadget::{CommonMemoryAddressGadget, MemoryExpansionGadget},
6-
AccountAddress, CachedRegion,
6+
AccountAddress, CachedRegion, StepRws,
77
};
88
use crate::{
99
evm_circuit::{
@@ -419,15 +419,24 @@ impl<F: Field> TransferToGadget<F> {
419419
&self,
420420
region: &mut CachedRegion<'_, '_, F>,
421421
offset: usize,
422-
(receiver_balance, prev_receiver_balance): (U256, U256),
423-
value: U256,
422+
rws: &mut StepRws,
423+
(receiver_exists, value, opcode_is_create): (bool, U256, bool),
424424
) -> Result<(), Error> {
425+
if !receiver_exists && (!value.is_zero() || opcode_is_create) {
426+
let _receiver_code_hash = rws.next().account_codehash_pair();
427+
}
428+
429+
let receiver_balance_pair = if !value.is_zero() {
430+
rws.next().account_balance_pair()
431+
} else {
432+
(0.into(), 0.into())
433+
};
425434
self.receiver.assign(
426435
region,
427436
offset,
428-
prev_receiver_balance,
437+
receiver_balance_pair.1,
429438
vec![value],
430-
receiver_balance,
439+
receiver_balance_pair.0,
431440
)?;
432441
self.value_is_zero
433442
.assign_value(region, offset, Value::known(WordLoHi::from(value)))?;
@@ -521,33 +530,37 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
521530
&self,
522531
region: &mut CachedRegion<'_, '_, F>,
523532
offset: usize,
524-
(sender_balance_sub_fee, prev_sender_balance_sub_fee): (Option<U256>, Option<U256>),
525-
(sender_balance_sub_value, prev_sender_balance_sub_value): (U256, U256),
526-
(receiver_balance, prev_receiver_balance): (U256, U256),
527-
value: U256,
533+
rws: &mut StepRws,
534+
(receiver_exists, value, opcode_is_create): (bool, U256, bool),
528535
gas_fee: Option<U256>,
529536
) -> Result<(), Error> {
530537
if WITH_FEE {
538+
let sender_balance_sub_fee = rws.next().account_balance_pair();
531539
self.sender_sub_fee.as_ref().expect("Exists").assign(
532540
region,
533541
offset,
534-
prev_sender_balance_sub_fee.expect("exists"),
542+
sender_balance_sub_fee.1,
535543
vec![gas_fee.expect("exists")],
536-
sender_balance_sub_fee.expect("exists"),
544+
sender_balance_sub_fee.0,
537545
)?;
538546
}
547+
let sender_balance_sub_value = if !value.is_zero() {
548+
rws.next().account_balance_pair()
549+
} else {
550+
(0.into(), 0.into())
551+
};
539552
self.sender_sub_value.assign(
540553
region,
541554
offset,
542-
prev_sender_balance_sub_value,
555+
sender_balance_sub_value.1,
543556
vec![value],
544-
sender_balance_sub_value,
557+
sender_balance_sub_value.0,
545558
)?;
546559
self.receiver.assign(
547560
region,
548561
offset,
549-
(receiver_balance, prev_receiver_balance),
550-
value,
562+
rws,
563+
(receiver_exists, value, opcode_is_create),
551564
)?;
552565
self.value_is_zero
553566
.assign_value(region, offset, Value::known(WordLoHi::from(value)))?;

0 commit comments

Comments
 (0)