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

Commit b98a4cb

Browse files
committed
fix chunk first row padding logic
1 parent 031c0fc commit b98a4cb

File tree

5 files changed

+36
-46
lines changed

5 files changed

+36
-46
lines changed

zkevm-circuits/src/root_circuit.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -334,11 +334,11 @@ where
334334
(
335335
loader
336336
.scalar_chip()
337-
.assign_constant(&mut loader.ctx_mut(), M::Scalar::from(101))
337+
.assign_constant(&mut loader.ctx_mut(), M::Fr::from(101))
338338
.unwrap(),
339339
loader
340340
.scalar_chip()
341-
.assign_constant(&mut loader.ctx_mut(), M::Scalar::from(103))
341+
.assign_constant(&mut loader.ctx_mut(), M::Fr::from(103))
342342
.unwrap(),
343343
)
344344
};

zkevm-circuits/src/super_circuit/test.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,15 @@ where
207207
{
208208
let circuits_params = FixedCParams {
209209
max_txs: 1,
210+
max_withdrawals: 5,
210211
max_calldata: 32,
211212
max_rws: 256,
212213
max_copy_rows: 256,
213214
max_exp_steps: 256,
214215
max_bytecode: 512,
215216
max_evm_rows: 0,
216217
max_keccak_rows: 0,
218+
total_chunks: 1,
217219
};
218220
let rw_map = RwMap::from(&OperationContainer {
219221
..Default::default()
@@ -224,22 +226,19 @@ where
224226

225227
// synthesize to get degree
226228
let mut cs = ConstraintSystem::<<Scheme as CommitmentScheme>::Scalar>::default();
227-
let config = SuperCircuit::configure_with_params(
229+
let _config = SuperCircuit::configure_with_params(
228230
&mut cs,
229231
SuperCircuitParams {
230232
max_txs: circuits_params.max_txs,
233+
max_withdrawals: circuits_params.max_withdrawals,
231234
max_calldata: circuits_params.max_calldata,
232235
mock_randomness: TEST_MOCK_RANDOMNESS.into(),
236+
feature_config: FeatureConfig::default(),
233237
},
234238
);
235239
let degree = cs.degree();
236240

237-
let advice_commitments = get_rwtable_cols_commitment::<Scheme>(
238-
degree,
239-
&rows,
240-
circuits_params.max_rws,
241-
params,
242-
false,
243-
);
244-
println!("advice_commitments {:?}", advice_commitments[0]);
241+
let advice_commitments =
242+
get_rwtable_cols_commitment::<Scheme>(degree, &rows, circuits_params.max_rws, params);
243+
println!("advice_commitments len() {:?}", advice_commitments.len());
245244
}

zkevm-circuits/src/table/rw_table.rs

+19-20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use bus_mapping::operation::OperationContainer;
21
use halo2_proofs::{
32
self,
43
circuit::{AssignedCell, SimpleFloorPlanner},
@@ -192,13 +191,11 @@ pub fn get_rwtable_cols_commitment<'params, Scheme: CommitmentScheme>(
192191
rws: &[Rw],
193192
n_rows: usize,
194193
params_prover: &'params Scheme::ParamsProver,
195-
is_first_row_padding: bool,
196194
) -> Vec<<Scheme as CommitmentScheme>::Curve>
197195
where
198196
<Scheme as CommitmentScheme>::Scalar: WithSmallOrderMulGroup<3> + Field,
199197
{
200198
struct WitnessCollection<F: Field> {
201-
k: u32,
202199
advice: Vec<Polynomial<Assigned<F>, LagrangeCoeff>>,
203200
_marker: std::marker::PhantomData<F>,
204201
}
@@ -234,7 +231,11 @@ where
234231
// Do nothing
235232
}
236233

237-
fn query_instance(&self, column: Column<Instance>, row: usize) -> Result<Value<F>, Error> {
234+
fn query_instance(
235+
&self,
236+
_column: Column<Instance>,
237+
_row: usize,
238+
) -> Result<Value<F>, Error> {
238239
Err(Error::BoundsFailure)
239240
}
240241

@@ -301,7 +302,7 @@ where
301302
Ok(())
302303
}
303304

304-
fn get_challenge(&self, challenge: Challenge) -> Value<F> {
305+
fn get_challenge(&self, _challenge: Challenge) -> Value<F> {
305306
Value::unknown()
306307
}
307308

@@ -318,25 +319,22 @@ where
318319
}
319320
}
320321

321-
let rw_map = RwMap::from(&OperationContainer {
322-
..Default::default()
323-
});
324-
let rows = rw_map.table_assignments(false);
325-
let rwtable_circuit = RwTableCircuit::new(&rows, 1, false);
322+
let rwtable_circuit = RwTableCircuit::new(&rws, n_rows, None);
326323

327324
let domain = EvaluationDomain::<<Scheme as CommitmentScheme>::Scalar>::new(
328325
degree as u32,
329326
params_prover.k(),
330327
);
331328

332-
let mut cs = ConstraintSystem::default();
329+
let mut cs = ConstraintSystem::<<Scheme as CommitmentScheme>::Scalar>::default();
333330
let rwtable_circuit_config = RwTableCircuit::configure(&mut cs);
334-
// TODO adjust domain.empty_lagrange_assigned() visibility in halo2 library to public
335331
let mut witness = WitnessCollection {
336-
k: params_prover.k(),
337332
advice: vec![
338333
domain.empty_lagrange_assigned();
339-
rwtable_circuit_config.rw_table.advice_columns().len()
334+
<RwTable as LookupTable<<Scheme as CommitmentScheme>::Scalar>>::advice_columns(
335+
&rwtable_circuit_config.rw_table
336+
)
337+
.len()
340338
],
341339
_marker: std::marker::PhantomData,
342340
};
@@ -350,11 +348,12 @@ where
350348
)
351349
.unwrap();
352350

353-
let mut advice_values =
351+
let len = witness.advice.len();
352+
let advice_values =
354353
batch_invert_assigned::<Scheme::Scalar>(domain, witness.advice.into_iter().collect());
355354

356355
// Compute commitments to advice column polynomials
357-
let blinds = vec![Blind::default(); witness.advice.len()];
356+
let blinds = vec![Blind::default(); len];
358357
let advice_commitments_projective: Vec<_> = advice_values
359358
.iter()
360359
.zip(blinds.iter())
@@ -374,16 +373,16 @@ where
374373
struct RwTableCircuit<'a> {
375374
rws: &'a [Rw],
376375
n_rows: usize,
377-
is_first_row_padding: bool,
376+
prev_chunk_last_rw: Option<Rw>,
378377
}
379378

380379
impl<'a> RwTableCircuit<'a> {
381380
#[allow(dead_code)]
382-
pub(crate) fn new(rws: &'a [Rw], n_rows: usize, is_first_row_padding: bool) -> Self {
381+
pub(crate) fn new(rws: &'a [Rw], n_rows: usize, prev_chunk_last_rw: Option<Rw>) -> Self {
383382
Self {
384383
rws,
385384
n_rows,
386-
is_first_row_padding,
385+
prev_chunk_last_rw,
387386
}
388387
}
389388
}
@@ -424,7 +423,7 @@ impl<'a, F: Field> Circuit<F> for RwTableCircuit<'a> {
424423
&mut region,
425424
self.rws,
426425
self.n_rows,
427-
self.is_first_row_padding,
426+
self.prev_chunk_last_rw,
428427
)
429428
},
430429
)?;

zkevm-circuits/src/witness/chunk.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ pub fn chunk_convert<F: Field>(
103103
let chunk = builder.get_chunk(idx);
104104
let mut rws = RwMap::default();
105105
let prev_chunk_last_rw = builder.prev_chunk().map(|chunk| {
106-
RwMap::get_rw(&block.container, chunk.ctx.end_rwc).expect("Rw does not exist")
106+
// rws range [chunk.ctx.initial_rwc, chunk.ctx.end_rwc)
107+
RwMap::get_rw(&block.container, chunk.ctx.end_rwc - 1).expect("Rw does not exist")
107108
});
108109

109110
// FIXME(Cecilia): debug

zkevm-circuits/src/witness/rw.rs

+5-14
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,7 @@ impl RwMap {
143143
.collect();
144144
let padding_length = {
145145
let length = Self::padding_len(rows_trimmed.len(), target_len);
146-
if prev_chunk_last_rw.is_none() {
147-
length.saturating_sub(1)
148-
} else {
149-
length
150-
}
146+
length.saturating_sub(1)
151147
};
152148

153149
// option 1: need to provide padding starting rw_counter at function parameters
@@ -436,7 +432,7 @@ impl<F: Field> RwRow<Value<F>> {
436432
pub fn padding(
437433
rows: &[RwRow<Value<F>>],
438434
target_len: usize,
439-
is_first_row_padding: bool,
435+
padding_start_rwrow: Option<RwRow<Value<F>>>,
440436
) -> (Vec<RwRow<Value<F>>>, usize) {
441437
// Remove Start/Padding rows as we will add them from scratch.
442438
let rows_trimmed = rows
@@ -450,11 +446,7 @@ impl<F: Field> RwRow<Value<F>> {
450446
.collect::<Vec<RwRow<Value<F>>>>();
451447
let padding_length = {
452448
let length = RwMap::padding_len(rows_trimmed.len(), target_len);
453-
if is_first_row_padding {
454-
length.saturating_sub(1)
455-
} else {
456-
length
457-
}
449+
length.saturating_sub(1) // first row always got padding
458450
};
459451
let start_padding_rw_counter = {
460452
let start_padding_rw_counter = rows_trimmed
@@ -487,12 +479,11 @@ impl<F: Field> RwRow<Value<F>> {
487479
},
488480
);
489481
(
490-
iter::once(RwRow {
482+
iter::once(padding_start_rwrow.unwrap_or(RwRow {
491483
rw_counter: Value::known(F::ONE),
492484
tag: Value::known(F::from(Target::Start as u64)),
493485
..Default::default()
494-
})
495-
.take(if is_first_row_padding { 1 } else { 0 })
486+
}))
496487
.chain(rows_trimmed.into_iter())
497488
.chain(padding.into_iter())
498489
.collect(),

0 commit comments

Comments
 (0)