From ff85880a6dedaf3b94b690d7be5339a3a757745d Mon Sep 17 00:00:00 2001 From: parazyd Date: Sat, 16 Jul 2022 17:21:07 +0200 Subject: [PATCH] zk/gadget/native_range_check: Fix copy constraint. --- src/zk/gadget/native_range_check.rs | 58 +++++++++++------------------ 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/src/zk/gadget/native_range_check.rs b/src/zk/gadget/native_range_check.rs index 9552a6539..3c0f2ec32 100644 --- a/src/zk/gadget/native_range_check.rs +++ b/src/zk/gadget/native_range_check.rs @@ -54,6 +54,9 @@ impl z: Column, k_values_table: TableColumn, ) -> NativeRangeCheckConfig { + // Enable permutation on z column + meta.enable_equality(z); + let s_rc = meta.complex_selector(); meta.lookup(|meta| { @@ -114,7 +117,7 @@ impl pub fn decompose( &self, - mut region: Region<'_, pallas::Base>, + region: &mut Region<'_, pallas::Base>, z_0: AssignedCell, offset: usize, ) -> Result<(), plonk::Error> { @@ -122,7 +125,7 @@ impl // Enable selectors for index in 0..NUM_WINDOWS { - self.config.s_rc.enable(&mut region, index + offset)?; + self.config.s_rc.enable(region, index + offset)?; } let mut z_values: Vec> = vec![z_0.clone()]; @@ -143,7 +146,7 @@ impl region.assign_advice( || format!("z_{}", i + offset + 1), self.config.z, - i + offset, + i + offset + 1, || z_next, )? }; @@ -158,14 +161,14 @@ impl pub fn witness_range_check( &self, - layouter: &mut impl Layouter, + mut layouter: impl Layouter, value: Value, ) -> Result<(), plonk::Error> { layouter.assign_region( || format!("witness {}-bit native range check", NUM_BITS), |mut region: Region<'_, pallas::Base>| { let z_0 = region.assign_advice(|| "z_0", self.config.z, 0, || value)?; - self.decompose(region, z_0, 0)?; + self.decompose(&mut region, z_0, 0)?; Ok(()) }, ) @@ -173,14 +176,14 @@ impl pub fn copy_range_check( &self, - layouter: &mut impl Layouter, + mut layouter: impl Layouter, value: AssignedCell, ) -> Result<(), plonk::Error> { layouter.assign_region( || format!("copy {}-bit native range check", NUM_BITS), |mut region: Region<'_, pallas::Base>| { let z_0 = value.copy_advice(|| "z_0", &mut region, self.config.z, 0)?; - self.decompose(region, z_0, 0)?; + self.decompose(&mut region, z_0, 0)?; Ok(()) }, ) @@ -199,25 +202,13 @@ mod tests { }; use pasta_curves::arithmetic::FieldExt; - #[derive(Clone)] - struct Range64CircuitConfig { - w: Column, - rangecheck_config: NativeRangeCheckConfig<3, 64, 22>, - } - - impl Range64CircuitConfig { - fn rangecheck_chip(&self) -> NativeRangeCheckChip<3, 64, 22> { - NativeRangeCheckChip::<3, 64, 22>::construct(self.rangecheck_config.clone()) - } - } - #[derive(Default)] struct Range64Circuit { a: Value, } impl Circuit for Range64Circuit { - type Config = Range64CircuitConfig; + type Config = (NativeRangeCheckConfig<3, 64, 22>, Column); type FloorPlanner = floor_planner::V1; fn without_witnesses(&self) -> Self { @@ -225,21 +216,14 @@ mod tests { } fn configure(meta: &mut ConstraintSystem) -> Self::Config { + let w = meta.advice_column(); + meta.enable_equality(w); + let z = meta.advice_column(); let table_column = meta.lookup_table_column(); - let constants = meta.fixed_column(); meta.enable_constant(constants); - let w = meta.advice_column(); - meta.enable_equality(w); - - let z = meta.advice_column(); - meta.enable_equality(z); - - let rangecheck_config = - NativeRangeCheckChip::<3, 64, 22>::configure(meta, z, table_column); - - Range64CircuitConfig { w, rangecheck_config } + (NativeRangeCheckChip::<3, 64, 22>::configure(meta, z, table_column), w) } fn synthesize( @@ -247,14 +231,14 @@ mod tests { config: Self::Config, mut layouter: impl Layouter, ) -> Result<(), plonk::Error> { - let rangecheck_chip = config.rangecheck_chip(); + let rangecheck_chip = NativeRangeCheckChip::<3, 64, 22>::construct(config.0.clone()); + rangecheck_chip.load_k_table(&mut layouter, config.0.k_values_table)?; - rangecheck_chip.load_k_table(&mut layouter, config.rangecheck_config.k_values_table)?; + let a = assign_free_advice(layouter.namespace(|| "load a"), config.1, self.a)?; + rangecheck_chip.copy_range_check(layouter.namespace(|| "copy a and range check"), a)?; - let a = assign_free_advice(layouter.namespace(|| "load a"), config.w, self.a)?; - - rangecheck_chip.witness_range_check(&mut layouter, self.a)?; - rangecheck_chip.copy_range_check(&mut layouter, a)?; + rangecheck_chip + .witness_range_check(layouter.namespace(|| "witness a and range check"), self.a)?; Ok(()) }