@@ -35,6 +35,8 @@ const SHANGHAI_RW_DELTA: u8 = 1;
35
35
#[ cfg( not( feature = "shanghai" ) ) ]
36
36
const SHANGHAI_RW_DELTA : u8 = 0 ;
37
37
38
+ const PRECOMPILE_COUNT : usize = 9 ;
39
+
38
40
use gadgets:: util:: select;
39
41
40
42
#[ derive( Clone , Debug ) ]
@@ -224,6 +226,10 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
224
226
let gas_left = tx_gas. expr ( ) - intrinsic_gas_cost. expr ( ) ;
225
227
let sufficient_gas_left = RangeCheckGadget :: construct ( cb, gas_left. clone ( ) ) ;
226
228
229
+ for addr in 1 ..=PRECOMPILE_COUNT {
230
+ cb. account_access_list_write ( tx_id. expr ( ) , addr. expr ( ) , 1 . expr ( ) , 0 . expr ( ) , None ) ;
231
+ } // rwc_delta += PRECOMPILE_COUNT
232
+
227
233
// Prepare access list of caller and callee
228
234
cb. account_access_list_write (
229
235
tx_id. expr ( ) ,
@@ -239,7 +245,11 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
239
245
1 . expr ( ) ,
240
246
// No extra constraint being used here.
241
247
// Correctness will be enforced in build_tx_access_list_account_constraints
242
- is_caller_callee_equal. expr ( ) ,
248
+ select:: expr (
249
+ is_precompile. expr ( ) ,
250
+ 1 . expr ( ) ,
251
+ is_caller_callee_equal. expr ( ) ,
252
+ ) ,
243
253
None ,
244
254
) ; // rwc_delta += 1
245
255
@@ -406,6 +416,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
406
416
// - Write CallContext IsPersistent
407
417
// - Write CallContext IsSuccess
408
418
// - Write Account (Caller) Nonce
419
+ // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT
409
420
// - Write TxAccessListAccount (Caller)
410
421
// - Write TxAccessListAccount (Callee)
411
422
// - Write TxAccessListAccount (Coinbase) only for Shanghai
@@ -429,7 +440,8 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
429
440
22 . expr ( )
430
441
+ tx_l1_fee. rw_delta ( )
431
442
+ transfer_with_gas_fee. rw_delta ( )
432
- + SHANGHAI_RW_DELTA . expr ( ) ,
443
+ + SHANGHAI_RW_DELTA . expr ( )
444
+ + PRECOMPILE_COUNT . expr ( ) ,
433
445
) ,
434
446
call_id : To ( call_id. expr ( ) ) ,
435
447
is_root : To ( true . expr ( ) ) ,
@@ -474,6 +486,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
474
486
// - Write CallContext IsPersistent
475
487
// - Write CallContext IsSuccess
476
488
// - Write Account (Caller) Nonce
489
+ // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT
477
490
// - Write TxAccessListAccount (Caller)
478
491
// - Write TxAccessListAccount (Callee)
479
492
// - Write TxAccessListAccount (Coinbase) only for Shanghai
@@ -484,6 +497,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
484
497
+ tx_l1_fee. rw_delta ( )
485
498
+ transfer_with_gas_fee. rw_delta ( )
486
499
+ SHANGHAI_RW_DELTA . expr ( )
500
+ + PRECOMPILE_COUNT . expr ( )
487
501
// TRICKY:
488
502
// Process the reversion only for Precompile in begin TX. Since no
489
503
// associated opcodes could process reversion afterwards
@@ -524,6 +538,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
524
538
// - Write CallContext IsPersistent
525
539
// - Write CallContext IsSuccess
526
540
// - Write Account Nonce
541
+ // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT
527
542
// - Write TxAccessListAccount (Caller)
528
543
// - Write TxAccessListAccount (Callee)
529
544
// - Write TxAccessListAccount (Coinbase) only for Shanghai
@@ -534,7 +549,8 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
534
549
8 . expr ( )
535
550
+ tx_l1_fee. rw_delta ( )
536
551
+ transfer_with_gas_fee. rw_delta ( )
537
- + SHANGHAI_RW_DELTA . expr ( ) ,
552
+ + SHANGHAI_RW_DELTA . expr ( )
553
+ + PRECOMPILE_COUNT . expr ( ) ,
538
554
) ,
539
555
call_id : To ( call_id. expr ( ) ) ,
540
556
..StepStateTransition :: any ( )
@@ -582,6 +598,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
582
598
// - Write CallContext IsPersistent
583
599
// - Write CallContext IsSuccess
584
600
// - Write Account Nonce
601
+ // - Write TxAccessListAccount (Precompile) x PRECOMPILE_COUNT
585
602
// - Write TxAccessListAccount (Caller)
586
603
// - Write TxAccessListAccount (Callee)
587
604
// - Write TxAccessListAccount (Coinbase) only for Shanghai
@@ -604,7 +621,8 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
604
621
21 . expr ( )
605
622
+ tx_l1_fee. rw_delta ( )
606
623
+ transfer_with_gas_fee. rw_delta ( )
607
- + SHANGHAI_RW_DELTA . expr ( ) ,
624
+ + SHANGHAI_RW_DELTA . expr ( )
625
+ + PRECOMPILE_COUNT . expr ( ) ,
608
626
) ,
609
627
call_id : To ( call_id. expr ( ) ) ,
610
628
is_root : To ( true . expr ( ) ) ,
@@ -672,7 +690,7 @@ impl<F: Field> ExecutionGadget<F> for BeginTxGadget<F> {
672
690
let zero = eth_types:: Word :: zero ( ) ;
673
691
674
692
let mut rws = StepRws :: new ( block, step) ;
675
- rws. offset_add ( 10 ) ;
693
+ rws. offset_add ( 10 + PRECOMPILE_COUNT ) ;
676
694
677
695
#[ cfg( feature = "shanghai" ) ]
678
696
let is_coinbase_warm = rws. next ( ) . tx_access_list_value_pair ( ) . 1 ;
0 commit comments