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

Commit ff650a3

Browse files
committed
feat: use StepRws in evm circuits to replace rw indices (#1586)
1 parent 3bbc757 commit ff650a3

16 files changed

+143
-86
lines changed

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

+11-14
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
},
@@ -152,9 +152,12 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
152152
step: &ExecStep,
153153
) -> Result<(), Error> {
154154
let gas_used = tx.gas() - step.gas_left;
155-
let (refund, _) = block.get_rws(step, 2).tx_refund_value_pair();
156-
let (caller_balance, caller_balance_prev) = block.get_rws(step, 3).account_balance_pair();
157-
let (coinbase_code_hash_prev, _) = block.get_rws(step, 4).account_codehash_pair();
155+
let mut rws = StepRws::new(block, step);
156+
rws.offset_add(2);
157+
158+
let (refund, _) = rws.next().tx_refund_value_pair();
159+
let (caller_balance, caller_balance_prev) = rws.next().account_balance_pair();
160+
let (coinbase_code_hash_prev, _) = rws.next().account_codehash_pair();
158161

159162
self.tx_id
160163
.assign(region, offset, Value::known(F::from(tx.id)))?;
@@ -209,16 +212,10 @@ impl<F: Field> ExecutionGadget<F> for EndTxGadget<F> {
209212
self.coinbase_code_hash_is_zero
210213
.assign_u256(region, offset, coinbase_code_hash_prev)?;
211214
if !coinbase_reward.is_zero() {
212-
let coinbase_balance_pair = block
213-
.get_rws(
214-
step,
215-
if coinbase_code_hash_prev.is_zero() {
216-
6
217-
} else {
218-
5
219-
},
220-
)
221-
.account_balance_pair();
215+
if coinbase_code_hash_prev.is_zero() {
216+
rws.next();
217+
}
218+
let coinbase_balance_pair = rws.next().account_balance_pair();
222219
self.coinbase_reward.assign(
223220
region,
224221
offset,

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

+20-14
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder},
99
math_gadget::{IsZeroGadget, LtGadget},
1010
memory_gadget::MemoryExpandedAddressGadget,
11-
or, CachedRegion, Cell,
11+
or, CachedRegion, Cell, StepRws,
1212
},
1313
},
1414
table::CallContextFieldTag,
@@ -126,26 +126,32 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGCallGadget<F> {
126126
let opcode = step.opcode().unwrap();
127127
let is_call_or_callcode =
128128
usize::from([OpcodeId::CALL, OpcodeId::CALLCODE].contains(&opcode));
129-
let [tx_id, is_static] =
130-
[0, 1].map(|index| block.get_rws(step, index).call_context_value());
131-
let [gas, callee_address] = [2, 3].map(|index| block.get_rws(step, index).stack_value());
129+
130+
let mut rws = StepRws::new(block, step);
131+
132+
let tx_id = rws.next().call_context_value();
133+
let is_static = rws.next().call_context_value();
134+
135+
let gas = rws.next().stack_value();
136+
let callee_address = rws.next().stack_value();
137+
132138
let value = if is_call_or_callcode == 1 {
133-
block.get_rws(step, 4).stack_value()
139+
rws.next().stack_value()
134140
} else {
135141
U256::zero()
136142
};
137-
let [cd_offset, cd_length, rd_offset, rd_length] =
138-
[4, 5, 6, 7].map(|i| block.get_rws(step, is_call_or_callcode + i).stack_value());
139143

140-
let callee_code_hash = block
141-
.get_rws(step, 9 + is_call_or_callcode)
142-
.account_codehash_pair()
143-
.0;
144+
let cd_offset = rws.next().stack_value();
145+
let cd_length = rws.next().stack_value();
146+
147+
let rd_offset = rws.next().stack_value();
148+
let rd_length = rws.next().stack_value();
149+
150+
let callee_code_hash = rws.next().account_codehash_pair().0;
151+
144152
let callee_exists = !callee_code_hash.is_zero();
145153

146-
let (is_warm, is_warm_prev) = block
147-
.get_rws(step, 10 + is_call_or_callcode)
148-
.tx_access_list_value_pair();
154+
let (is_warm, is_warm_prev) = rws.next().tx_access_list_value_pair();
149155

150156
let memory_expansion_gas_cost = self.call.assign(
151157
region,

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

+12-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
CommonMemoryAddressGadget, MemoryCopierGasGadget, MemoryExpandedAddressGadget,
1212
MemoryExpansionGadget,
1313
},
14-
or, select, AccountAddress, CachedRegion, Cell,
14+
or, select, AccountAddress, CachedRegion, Cell, StepRws,
1515
},
1616
witness::{Block, Call, ExecStep, Transaction},
1717
},
@@ -156,6 +156,8 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGMemoryCopyGadget<F> {
156156
let opcode = step.opcode().unwrap();
157157
let is_extcodecopy = opcode == OpcodeId::EXTCODECOPY;
158158

159+
let mut rws = StepRws::new(block, step);
160+
159161
log::debug!(
160162
"ErrorOutOfGasMemoryCopy: opcode = {}, gas_left = {}, gas_cost = {}",
161163
opcode,
@@ -165,16 +167,20 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGMemoryCopyGadget<F> {
165167

166168
let (is_warm, external_address) = if is_extcodecopy {
167169
(
168-
block.get_rws(step, 1).tx_access_list_value_pair().0,
169-
block.get_rws(step, 2).stack_value(),
170+
rws.next().tx_access_list_value_pair().0,
171+
rws.next().stack_value(),
170172
)
171173
} else {
172174
(false, U256::zero())
173175
};
174176

175-
let rw_offset = if is_extcodecopy { 3 } else { 0 };
176-
let [dst_offset, src_offset, copy_size] = [rw_offset, rw_offset + 1, rw_offset + 2]
177-
.map(|index| block.get_rws(step, index).stack_value());
177+
if is_extcodecopy {
178+
rws.next(); // Skip external address
179+
}
180+
181+
let dst_offset = rws.next().stack_value();
182+
let src_offset = rws.next().stack_value();
183+
let copy_size = rws.next().stack_value();
178184

179185
self.opcode
180186
.assign(region, offset, Value::known(F::from(opcode.as_u64())))?;

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

+10-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
},
1212
constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder},
1313
math_gadget::{LtGadget, PairSelectGadget},
14-
or, select, CachedRegion, Cell,
14+
or, select, CachedRegion, Cell, StepRws,
1515
},
1616
witness::{Block, Call, ExecStep, Transaction},
1717
},
@@ -161,12 +161,17 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGSloadSstoreGadget<F> {
161161
) -> Result<(), Error> {
162162
let opcode = step.opcode().unwrap();
163163
let is_sstore = opcode == OpcodeId::SSTORE;
164-
let key = block.get_rws(step, 3).stack_value();
165-
let (is_warm, _) = block.get_rws(step, 4).tx_access_list_value_pair();
164+
165+
let mut rws = StepRws::new(block, step);
166+
167+
rws.offset_add(3);
168+
169+
let key = rws.next().stack_value();
170+
let (is_warm, _) = rws.next().tx_access_list_value_pair();
166171

167172
let (value, value_prev, original_value, gas_cost) = if is_sstore {
168-
let value = block.get_rws(step, 5).stack_value();
169-
let (_, value_prev, _, original_value) = block.get_rws(step, 6).storage_value_aux();
173+
let value = rws.next().stack_value();
174+
let (_, value_prev, _, original_value) = rws.next().storage_value_aux();
170175
let gas_cost =
171176
cal_sstore_gas_cost_for_assignment(value, value_prev, original_value, is_warm);
172177
(value, value_prev, original_value, gas_cost)

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

+8-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder},
99
from_bytes,
1010
math_gadget::{AddWordsGadget, IsZeroGadget, LtGadget},
11-
not, or, sum, CachedRegion, Cell, U64Cell,
11+
not, or, sum, CachedRegion, Cell, StepRws, U64Cell,
1212
},
1313
witness::{Block, Call, ExecStep, Transaction},
1414
},
@@ -130,8 +130,11 @@ impl<F: Field> ExecutionGadget<F> for ErrorReturnDataOutOfBoundGadget<F> {
130130
self.opcode
131131
.assign(region, offset, Value::known(F::from(opcode.as_u64())))?;
132132

133-
let [dest_offset, data_offset, size] =
134-
[0, 1, 2].map(|index| block.get_rws(step, index).stack_value());
133+
let mut rws = StepRws::new(block, step);
134+
135+
let dest_offset = rws.next().stack_value();
136+
let data_offset = rws.next().stack_value();
137+
let size = rws.next().stack_value();
135138

136139
self.memory_offset
137140
.assign(region, offset, Some(dest_offset.as_u64().to_le_bytes()))?;
@@ -140,7 +143,8 @@ impl<F: Field> ExecutionGadget<F> for ErrorReturnDataOutOfBoundGadget<F> {
140143
self.sum
141144
.assign(region, offset, [data_offset, size], remainder_end)?;
142145

143-
let return_data_length = block.get_rws(step, 3).call_context_value();
146+
let return_data_length = rws.next().call_context_value();
147+
144148
self.return_data_length.assign(
145149
region,
146150
offset,

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
common_gadget::CommonErrorGadget,
77
constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder},
88
math_gadget::{IsEqualGadget, IsZeroWordGadget},
9-
AccountAddress, CachedRegion, Cell,
9+
AccountAddress, CachedRegion, Cell, StepRws,
1010
},
1111
witness::{Block, Call, ExecStep, Transaction},
1212
},
@@ -109,9 +109,10 @@ impl<F: Field> ExecutionGadget<F> for ErrorWriteProtectionGadget<F> {
109109
.assign(region, offset, Value::known(F::from(opcode.as_u64())))?;
110110
let [mut gas, mut code_address, mut value] = [U256::zero(), U256::zero(), U256::zero()];
111111

112+
let mut rws = StepRws::new(block, step);
113+
112114
if is_call {
113-
[gas, code_address, value] =
114-
[0, 1, 2].map(|index| block.get_rws(step, index).stack_value());
115+
[gas, code_address, value] = [0, 1, 2].map(|_| rws.next().stack_value());
115116
}
116117

117118
self.gas.assign_u256(region, offset, gas)?;

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

+8-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{
1313
CommonMemoryAddressGadget, MemoryAddressGadget, MemoryCopierGasGadget,
1414
MemoryExpansionGadget,
1515
},
16-
not, select, AccountAddress, CachedRegion, Cell,
16+
not, select, AccountAddress, CachedRegion, Cell, StepRws,
1717
},
1818
witness::{Block, Call, ExecStep, Transaction},
1919
},
@@ -182,8 +182,10 @@ impl<F: Field> ExecutionGadget<F> for ExtcodecopyGadget<F> {
182182
) -> Result<(), Error> {
183183
self.same_context.assign_exec_step(region, offset, step)?;
184184

185+
let mut rws = StepRws::new(block, step);
186+
185187
let [external_address, memory_offset, code_offset, memory_length] =
186-
[0, 1, 2, 3].map(|idx| block.get_rws(step, idx).stack_value());
188+
[0, 1, 2, 3].map(|_| rws.next().stack_value());
187189
self.external_address_word
188190
.assign_u256(region, offset, external_address)?;
189191
let memory_address =
@@ -199,11 +201,13 @@ impl<F: Field> ExecutionGadget<F> for ExtcodecopyGadget<F> {
199201
call.is_persistent,
200202
)?;
201203

202-
let (_, is_warm) = block.get_rws(step, 7).tx_access_list_value_pair();
204+
rws.offset_add(3);
205+
206+
let (_, is_warm) = rws.next().tx_access_list_value_pair();
203207
self.is_warm
204208
.assign(region, offset, Value::known(F::from(is_warm as u64)))?;
205209

206-
let code_hash = block.get_rws(step, 8).account_codehash_pair().0;
210+
let code_hash = rws.next().account_codehash_pair().0;
207211
self.code_hash.assign_u256(region, offset, code_hash)?;
208212
self.not_exists.assign_u256(region, offset, code_hash)?;
209213

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

+6-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
constraint_builder::{
99
EVMConstraintBuilder, ReversionInfo, StepStateTransition, Transition::Delta,
1010
},
11-
select, AccountAddress, CachedRegion, Cell,
11+
select, AccountAddress, CachedRegion, Cell, StepRws,
1212
},
1313
witness::{Block, Call, ExecStep, Transaction},
1414
},
@@ -106,7 +106,9 @@ impl<F: Field> ExecutionGadget<F> for ExtcodehashGadget<F> {
106106
) -> Result<(), Error> {
107107
self.same_context.assign_exec_step(region, offset, step)?;
108108

109-
let address = block.get_rws(step, 0).stack_value();
109+
let mut rws = StepRws::new(block, step);
110+
111+
let address = rws.next().stack_value();
110112
self.address_word.assign_u256(region, offset, address)?;
111113

112114
self.tx_id
@@ -118,11 +120,11 @@ impl<F: Field> ExecutionGadget<F> for ExtcodehashGadget<F> {
118120
call.is_persistent,
119121
)?;
120122

121-
let (_, is_warm) = block.get_rws(step, 4).tx_access_list_value_pair();
123+
let (_, is_warm) = rws.next().tx_access_list_value_pair();
122124
self.is_warm
123125
.assign(region, offset, Value::known(F::from(is_warm as u64)))?;
124126

125-
let code_hash = block.get_rws(step, 5).account_codehash_pair().0;
127+
let code_hash = rws.next().account_codehash_pair().0;
126128
self.code_hash.assign_u256(region, offset, code_hash)?;
127129

128130
Ok(())

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

+9-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
Transition::Delta,
1111
},
1212
math_gadget::IsZeroWordGadget,
13-
not, select, AccountAddress, CachedRegion, Cell, U64Cell,
13+
not, select, AccountAddress, CachedRegion, Cell, StepRws, U64Cell,
1414
},
1515
witness::{Block, Call, ExecStep, Transaction},
1616
},
@@ -123,7 +123,9 @@ impl<F: Field> ExecutionGadget<F> for ExtcodesizeGadget<F> {
123123
) -> Result<(), Error> {
124124
self.same_context.assign_exec_step(region, offset, step)?;
125125

126-
let address = block.get_rws(step, 0).stack_value();
126+
let mut rws = StepRws::new(block, step);
127+
128+
let address = rws.next().stack_value();
127129
self.address_word.assign_u256(region, offset, address)?;
128130

129131
self.tx_id
@@ -136,16 +138,18 @@ impl<F: Field> ExecutionGadget<F> for ExtcodesizeGadget<F> {
136138
call.is_persistent,
137139
)?;
138140

139-
let (_, is_warm) = block.get_rws(step, 4).tx_access_list_value_pair();
141+
rws.offset_add(3);
142+
143+
let (_, is_warm) = rws.next().tx_access_list_value_pair();
140144
self.is_warm
141145
.assign(region, offset, Value::known(F::from(is_warm as u64)))?;
142146

143-
let code_hash = block.get_rws(step, 5).account_codehash_pair().0;
147+
let code_hash = rws.next().account_codehash_pair().0;
144148
self.code_hash.assign_u256(region, offset, code_hash)?;
145149
self.not_exists
146150
.assign(region, offset, WordLoHi::from(code_hash))?;
147151

148-
let code_size = block.get_rws(step, 6).stack_value().as_u64();
152+
let code_size = rws.next().stack_value().as_u64();
149153
self.code_size
150154
.assign(region, offset, Some(code_size.to_le_bytes()))?;
151155

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

+6-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::{
1212
memory_gadget::{
1313
CommonMemoryAddressGadget, MemoryAddressGadget, MemoryExpansionGadget,
1414
},
15-
not, sum, CachedRegion, Cell,
15+
not, sum, CachedRegion, Cell, StepRws,
1616
},
1717
witness::{Block, Call, ExecStep, Transaction},
1818
},
@@ -201,7 +201,9 @@ impl<F: Field> ExecutionGadget<F> for LogGadget<F> {
201201
) -> Result<(), Error> {
202202
self.same_context.assign_exec_step(region, offset, step)?;
203203

204-
let [memory_start, msize] = [0, 1].map(|index| block.get_rws(step, index).stack_value());
204+
let mut rws = StepRws::new(block, step);
205+
206+
let [memory_start, msize] = [0, 1].map(|_| rws.next().stack_value());
205207
let memory_address = self
206208
.memory_address
207209
.assign(region, offset, memory_start, msize)?;
@@ -221,9 +223,8 @@ impl<F: Field> ExecutionGadget<F> for LogGadget<F> {
221223
// It takes 6 + is_persistent reads or writes to reach the topic stack write section.
222224
// Each topic takes at least 1 stack read. They take an additional tx log write if the
223225
// call is persistent.
224-
block
225-
.get_rws(step, 6 + is_persistent + topic * (1 + is_persistent))
226-
.stack_value()
226+
rws.offset_add(6 + is_persistent + topic * (1 + is_persistent));
227+
rws.next().stack_value()
227228
});
228229
for i in 0..4 {
229230
let topic = topics.next();

0 commit comments

Comments
 (0)