@@ -69,7 +69,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
69
69
let tx_id = cb. call_context ( None , CallContextFieldTag :: TxId ) ;
70
70
let is_persistent = cb. call_context ( None , CallContextFieldTag :: IsPersistent ) ;
71
71
let tx_l1_fee = cb. call_context ( None , CallContextFieldTag :: L1Fee ) ;
72
-
72
+ // rwc_delta = 3
73
73
let [ tx_gas, tx_caller_address, tx_type, tx_data_gas_cost] = [
74
74
TxContextFieldTag :: Gas ,
75
75
TxContextFieldTag :: CallerAddress ,
@@ -91,6 +91,8 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
91
91
) ;
92
92
let refund = cb. query_cell ( ) ;
93
93
cb. tx_refund_read ( tx_id. expr ( ) , refund. expr ( ) ) ;
94
+ // rwc_delta = 4
95
+
94
96
let effective_refund = MinMaxGadget :: construct ( cb, max_refund. quotient ( ) , refund. expr ( ) ) ;
95
97
96
98
// Add effective_refund * tx_gas_price back to caller's balance
@@ -107,6 +109,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
107
109
None ,
108
110
)
109
111
} ) ;
112
+ // rwc_delta = 4 + !tx_is_l1msg
110
113
111
114
// Add gas_used * effective_tip to coinbase's balance
112
115
let coinbase = cb. query_cell ( ) ;
@@ -155,6 +158,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
155
158
AccountFieldTag :: CodeHash ,
156
159
coinbase_codehash. expr ( ) ,
157
160
) ;
161
+ // rwc_delta = 5 + !tx_is_l1msg
158
162
#[ cfg( feature = "scroll" ) ]
159
163
let coinbase_keccak_codehash = cb. query_cell_phase2 ( ) ;
160
164
@@ -177,6 +181,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
177
181
None ,
178
182
)
179
183
} ) ;
184
+ // rwc_delta = 5 + !tx_is_l1msg + !tx_is_l1msg * coinbase_transfer.rw_delta
180
185
181
186
// constrain tx receipt fields
182
187
cb. tx_receipt_lookup (
@@ -191,6 +196,7 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
191
196
TxReceiptFieldTag :: LogLength ,
192
197
cb. curr . state . log_id . expr ( ) ,
193
198
) ;
199
+ // rwc_delta = 7 + !tx_is_l1msg * (coinbase_transfer.rw_delta + 1)
194
200
195
201
let is_first_tx = IsEqualGadget :: construct ( cb, tx_id. expr ( ) , 1 . expr ( ) ) ;
196
202
@@ -202,50 +208,54 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
202
208
) ;
203
209
} ) ;
204
210
205
- cb. condition ( 1 . expr ( ) - is_first_tx. expr ( ) , |cb| {
211
+ cb. condition ( not :: expr ( is_first_tx. expr ( ) ) , |cb| {
206
212
cb. tx_receipt_lookup (
207
213
0 . expr ( ) ,
208
214
tx_id. expr ( ) - 1 . expr ( ) ,
209
215
TxReceiptFieldTag :: CumulativeGasUsed ,
210
216
current_cumulative_gas_used. expr ( ) ,
211
217
) ;
212
218
} ) ;
219
+ // rwc_delta = 8 - is_first_tx + !tx_is_l1msg * (coinbase_transfer.rw_delta + 1)
213
220
214
221
cb. tx_receipt_lookup (
215
222
1 . expr ( ) ,
216
223
tx_id. expr ( ) ,
217
224
TxReceiptFieldTag :: CumulativeGasUsed ,
218
225
gas_used + current_cumulative_gas_used. expr ( ) ,
219
226
) ;
227
+ // rwc_delta = 9 - is_first_tx + !tx_is_l1msg * (coinbase_transfer.rw_delta + 1)
228
+
229
+ // The next state of `end_tx` can only be 'begin_tx' or 'end_inner_block'
220
230
231
+ let rw_counter_offset = 9 . expr ( ) - is_first_tx. expr ( )
232
+ + not:: expr ( tx_is_l1msg. expr ( ) ) * ( coinbase_transfer. rw_delta ( ) + 1 . expr ( ) ) ;
221
233
cb. condition (
222
234
cb. next . execution_state_selector ( [ ExecutionState :: BeginTx ] ) ,
223
235
|cb| {
224
- cb. call_context_lookup (
225
- true . expr ( ) ,
226
- Some ( cb. next . state . rw_counter . expr ( ) ) ,
236
+ let next_step_rwc = cb. next . state . rw_counter . expr ( ) ;
237
+ // lookup use next step initial rwc, thus lead to same record on rw table
238
+ cb. call_context_lookup_write_with_counter (
239
+ next_step_rwc. clone ( ) ,
240
+ Some ( next_step_rwc) ,
227
241
CallContextFieldTag :: TxId ,
242
+ // tx_id has been lookup and range_check above
228
243
tx_id. expr ( ) + 1 . expr ( ) ,
229
244
) ;
230
245
231
246
cb. require_step_state_transition ( StepStateTransition {
232
- rw_counter : Delta (
233
- 10 . expr ( ) - is_first_tx. expr ( )
234
- + not:: expr ( tx_is_l1msg. expr ( ) )
235
- * ( coinbase_transfer. rw_delta ( ) + 1 . expr ( ) ) ,
236
- ) ,
247
+ rw_counter : Delta ( rw_counter_offset. clone ( ) ) ,
237
248
..StepStateTransition :: any ( )
238
249
} ) ;
239
250
} ,
240
251
) ;
241
252
242
- let rw_counter_delta = 9 . expr ( ) - is_first_tx. expr ( )
243
- + not:: expr ( tx_is_l1msg. expr ( ) ) * ( coinbase_transfer. rw_delta ( ) + 1 . expr ( ) ) ;
244
253
cb. condition (
245
- cb. next . execution_state_selector ( [ ExecutionState :: EndBlock ] ) ,
254
+ cb. next
255
+ . execution_state_selector ( [ ExecutionState :: EndInnerBlock ] ) ,
246
256
|cb| {
247
257
cb. require_step_state_transition ( StepStateTransition {
248
- rw_counter : Delta ( rw_counter_delta ) ,
258
+ rw_counter : Delta ( rw_counter_offset ) ,
249
259
// We propagate call_id so that EndBlock can get the last tx_id
250
260
// in order to count processed txs.
251
261
call_id : Same ,
0 commit comments