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

Commit 55754a9

Browse files
authored
Refactor: use StepRws in evm circuits to replace rw indices (#1786)
### Description Continuing the work originally started in #1616 this PR seeks to introduce `StepRws` across the evm circuits to reduce the need for tracking rw indices through code. ### Issue Link Closes #1586 ### Type of change Refactor (no updates to logic) ### Contents The change has been made to the following files - error_oog_call.rs - error_oog_memory_copy.rs - error_oog_sload_sstore.rs - error_return_data_oo_bound.rs - error_write_protection.rs - extcodecopy.rs - extcodehash.rs - extcodesize.rs - logs.rs - return_revert.rs - returndatacopy.rs - sha3.rs - sload.rs - sstore.rs
1 parent 443da4b commit 55754a9

14 files changed

+130
-79
lines changed

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

+19-15
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,
@@ -127,26 +127,30 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGCallGadget<F> {
127127
let opcode = step.opcode().unwrap();
128128
let is_call_or_callcode =
129129
usize::from([OpcodeId::CALL, OpcodeId::CALLCODE].contains(&opcode));
130-
let [tx_id, is_static] =
131-
[0, 1].map(|index| block.get_rws(step, index).call_context_value());
132-
let [gas, callee_address] = [2, 3].map(|index| block.get_rws(step, index).stack_value());
130+
131+
let mut rws = StepRws::new(block, step);
132+
133+
let tx_id = rws.next().call_context_value();
134+
let is_static = rws.next().call_context_value();
135+
let gas = rws.next().stack_value();
136+
let callee_address = rws.next().stack_value();
137+
133138
let value = if is_call_or_callcode == 1 {
134-
block.get_rws(step, 4).stack_value()
139+
rws.next().stack_value()
135140
} else {
136141
U256::zero()
137142
};
138-
let [cd_offset, cd_length, rd_offset, rd_length] =
139-
[4, 5, 6, 7].map(|i| block.get_rws(step, is_call_or_callcode + i).stack_value());
140143

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

147-
let (is_warm, is_warm_prev) = block
148-
.get_rws(step, 10 + is_call_or_callcode)
149-
.tx_access_list_value_pair();
151+
let callee_code_hash = rws.next().account_codehash_pair().0;
152+
let callee_exists = !callee_code_hash.is_zero();
153+
let (is_warm, is_warm_prev) = rws.next().tx_access_list_value_pair();
150154

151155
let memory_expansion_gas_cost = self.call.assign(
152156
region,

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

+9-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, Chunk, ExecStep, Transaction},
1717
},
@@ -157,6 +157,8 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGMemoryCopyGadget<F> {
157157
let opcode = step.opcode().unwrap();
158158
let is_extcodecopy = opcode == OpcodeId::EXTCODECOPY;
159159

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

167169
let (is_warm, external_address) = if is_extcodecopy {
170+
rws.next();
168171
(
169-
block.get_rws(step, 1).tx_access_list_value_pair().0,
170-
block.get_rws(step, 2).stack_value(),
172+
rws.next().tx_access_list_value_pair().0,
173+
rws.next().stack_value(),
171174
)
172175
} else {
173176
(false, U256::zero())
174177
};
175178

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

180183
self.opcode
181184
.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, Chunk, ExecStep, Transaction},
1717
},
@@ -162,12 +162,17 @@ impl<F: Field> ExecutionGadget<F> for ErrorOOGSloadSstoreGadget<F> {
162162
) -> Result<(), Error> {
163163
let opcode = step.opcode().unwrap();
164164
let is_sstore = opcode == OpcodeId::SSTORE;
165-
let key = block.get_rws(step, 3).stack_value();
166-
let (is_warm, _) = block.get_rws(step, 4).tx_access_list_value_pair();
165+
166+
let mut rws = StepRws::new(block, step);
167+
168+
rws.offset_add(3);
169+
170+
let key = rws.next().stack_value();
171+
let (is_warm, _) = rws.next().tx_access_list_value_pair();
167172

168173
let (value, value_prev, original_value, gas_cost) = if is_sstore {
169-
let value = block.get_rws(step, 5).stack_value();
170-
let (_, value_prev, _, original_value) = block.get_rws(step, 6).storage_value_aux();
174+
let value = rws.next().stack_value();
175+
let (_, value_prev, _, original_value) = rws.next().storage_value_aux();
171176
let gas_cost =
172177
cal_sstore_gas_cost_for_assignment(value, value_prev, original_value, is_warm);
173178
(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, Chunk, ExecStep, Transaction},
1414
},
@@ -131,8 +131,11 @@ impl<F: Field> ExecutionGadget<F> for ErrorReturnDataOutOfBoundGadget<F> {
131131
self.opcode
132132
.assign(region, offset, Value::known(F::from(opcode.as_u64())))?;
133133

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

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

144-
let return_data_length = block.get_rws(step, 3).call_context_value();
147+
let return_data_length = rws.next().call_context_value();
148+
145149
self.return_data_length.assign(
146150
region,
147151
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, Chunk, ExecStep, Transaction},
1212
},
@@ -110,9 +110,10 @@ impl<F: Field> ExecutionGadget<F> for ErrorWriteProtectionGadget<F> {
110110
.assign(region, offset, Value::known(F::from(opcode.as_u64())))?;
111111
let [mut gas, mut code_address, mut value] = [U256::zero(), U256::zero(), U256::zero()];
112112

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

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

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

+12-5
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, Chunk, ExecStep, Transaction},
1919
},
@@ -183,8 +183,13 @@ impl<F: Field> ExecutionGadget<F> for ExtcodecopyGadget<F> {
183183
) -> Result<(), Error> {
184184
self.same_context.assign_exec_step(region, offset, step)?;
185185

186-
let [external_address, memory_offset, code_offset, memory_length] =
187-
[0, 1, 2, 3].map(|idx| block.get_rws(step, idx).stack_value());
186+
let mut rws = StepRws::new(block, step);
187+
188+
let external_address = rws.next().stack_value();
189+
let memory_offset = rws.next().stack_value();
190+
let code_offset = rws.next().stack_value();
191+
let memory_length = rws.next().stack_value();
192+
188193
self.external_address_word
189194
.assign_u256(region, offset, external_address)?;
190195
let memory_address =
@@ -200,11 +205,13 @@ impl<F: Field> ExecutionGadget<F> for ExtcodecopyGadget<F> {
200205
call.is_persistent,
201206
)?;
202207

203-
let (_, is_warm) = block.get_rws(step, 7).tx_access_list_value_pair();
208+
rws.offset_add(3);
209+
210+
let (_, is_warm) = rws.next().tx_access_list_value_pair();
204211
self.is_warm
205212
.assign(region, offset, Value::known(F::from(is_warm as u64)))?;
206213

207-
let code_hash = block.get_rws(step, 8).account_codehash_pair().0;
214+
let code_hash = rws.next().account_codehash_pair().0;
208215
self.code_hash.assign_u256(region, offset, code_hash)?;
209216
self.not_exists.assign_u256(region, offset, code_hash)?;
210217

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

+8-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, Chunk, ExecStep, Transaction},
1414
},
@@ -107,7 +107,9 @@ impl<F: Field> ExecutionGadget<F> for ExtcodehashGadget<F> {
107107
) -> Result<(), Error> {
108108
self.same_context.assign_exec_step(region, offset, step)?;
109109

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

113115
self.tx_id
@@ -119,11 +121,13 @@ impl<F: Field> ExecutionGadget<F> for ExtcodehashGadget<F> {
119121
call.is_persistent,
120122
)?;
121123

122-
let (_, is_warm) = block.get_rws(step, 4).tx_access_list_value_pair();
124+
rws.offset_add(3);
125+
126+
let (_, is_warm) = rws.next().tx_access_list_value_pair();
123127
self.is_warm
124128
.assign(region, offset, Value::known(F::from(is_warm as u64)))?;
125129

126-
let code_hash = block.get_rws(step, 5).account_codehash_pair().0;
130+
let code_hash = rws.next().account_codehash_pair().0;
127131
self.code_hash.assign_u256(region, offset, code_hash)?;
128132

129133
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, Chunk, ExecStep, Transaction},
1616
},
@@ -124,7 +124,9 @@ impl<F: Field> ExecutionGadget<F> for ExtcodesizeGadget<F> {
124124
) -> Result<(), Error> {
125125
self.same_context.assign_exec_step(region, offset, step)?;
126126

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

130132
self.tx_id
@@ -137,16 +139,18 @@ impl<F: Field> ExecutionGadget<F> for ExtcodesizeGadget<F> {
137139
call.is_persistent,
138140
)?;
139141

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

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

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

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

+6-2
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, Chunk, ExecStep, Transaction},
1818
},
@@ -202,7 +202,11 @@ impl<F: Field> ExecutionGadget<F> for LogGadget<F> {
202202
) -> Result<(), Error> {
203203
self.same_context.assign_exec_step(region, offset, step)?;
204204

205-
let [memory_start, msize] = [0, 1].map(|index| block.get_rws(step, index).stack_value());
205+
let mut rws = StepRws::new(block, step);
206+
207+
let memory_start = rws.next().stack_value();
208+
let msize = rws.next().stack_value();
209+
206210
let memory_address = self
207211
.memory_address
208212
.assign(region, offset, memory_start, msize)?;

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{
1313
memory_gadget::{
1414
CommonMemoryAddressGadget, MemoryAddressGadget, MemoryExpansionGadget,
1515
},
16-
not, CachedRegion, Cell,
16+
not, CachedRegion, Cell, StepRws,
1717
},
1818
witness::{Block, Call, Chunk, ExecStep, Transaction},
1919
},
@@ -293,7 +293,11 @@ impl<F: Field> ExecutionGadget<F> for ReturnRevertGadget<F> {
293293
Value::known(F::from(step.opcode().unwrap().as_u64())),
294294
)?;
295295

296-
let [memory_offset, length] = [0, 1].map(|index| block.get_rws(step, index).stack_value());
296+
let mut rws = StepRws::new(block, step);
297+
298+
let memory_offset = rws.next().stack_value();
299+
let length = rws.next().stack_value();
300+
297301
let range = self.range.assign(region, offset, memory_offset, length)?;
298302
self.memory_expansion
299303
.assign(region, offset, step.memory_word_size(), [range])?;
@@ -349,8 +353,10 @@ impl<F: Field> ExecutionGadget<F> for ReturnRevertGadget<F> {
349353

350354
let is_contract_deployment = call.is_create() && call.is_success && !length.is_zero();
351355

356+
rws.next();
357+
352358
let init_code_first_byte = if is_contract_deployment {
353-
block.get_rws(step, 3).memory_value()
359+
rws.next().memory_value()
354360
} else {
355361
0
356362
}

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

+8-13
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
CommonMemoryAddressGadget, MemoryAddressGadget, MemoryCopierGasGadget,
1515
MemoryExpansionGadget,
1616
},
17-
CachedRegion, Cell, MemoryAddress,
17+
CachedRegion, Cell, MemoryAddress, StepRws,
1818
},
1919
witness::{Block, Call, Chunk, ExecStep, Transaction},
2020
},
@@ -177,21 +177,16 @@ impl<F: Field> ExecutionGadget<F> for ReturnDataCopyGadget<F> {
177177
) -> Result<(), Error> {
178178
self.same_context.assign_exec_step(region, offset, step)?;
179179

180-
let [dest_offset, data_offset, size] =
181-
[0, 1, 2].map(|index| block.get_rws(step, index).stack_value());
180+
let mut rws = StepRws::new(block, step);
181+
182+
let [dest_offset, data_offset, size] = [0, 1, 2].map(|_| rws.next().stack_value());
182183

183184
self.data_offset.assign_u256(region, offset, data_offset)?;
184185

185-
let [last_callee_id, return_data_offset, return_data_size] = [
186-
(3, CallContextFieldTag::LastCalleeId),
187-
(4, CallContextFieldTag::LastCalleeReturnDataOffset),
188-
(5, CallContextFieldTag::LastCalleeReturnDataLength),
189-
]
190-
.map(|(i, tag)| {
191-
let rw = block.get_rws(step, i);
192-
assert_eq!(rw.field_tag(), Some(tag as u64));
193-
rw.call_context_value()
194-
});
186+
let last_callee_id = rws.next().call_context_value();
187+
let return_data_offset = rws.next().call_context_value();
188+
let return_data_size = rws.next().call_context_value();
189+
195190
self.last_callee_id.assign(
196191
region,
197192
offset,

0 commit comments

Comments
 (0)