|
@@ -114,12 +114,12 @@ impl<const WINDOW_SIZE: usize, const NUM_BITS: usize, const NUM_WINDOWS: usize>
|
|
|
.collect()
|
|
.collect()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // TODO: strict bool
|
|
|
|
|
pub fn decompose(
|
|
pub fn decompose(
|
|
|
&self,
|
|
&self,
|
|
|
region: &mut Region<'_, pallas::Base>,
|
|
region: &mut Region<'_, pallas::Base>,
|
|
|
z_0: AssignedCell<pallas::Base, pallas::Base>,
|
|
z_0: AssignedCell<pallas::Base, pallas::Base>,
|
|
|
offset: usize,
|
|
offset: usize,
|
|
|
|
|
+ strict: bool,
|
|
|
) -> Result<(), plonk::Error> {
|
|
) -> Result<(), plonk::Error> {
|
|
|
assert!(WINDOW_SIZE * NUM_WINDOWS < NUM_BITS + WINDOW_SIZE);
|
|
assert!(WINDOW_SIZE * NUM_WINDOWS < NUM_BITS + WINDOW_SIZE);
|
|
|
|
|
|
|
@@ -155,7 +155,12 @@ impl<const WINDOW_SIZE: usize, const NUM_BITS: usize, const NUM_WINDOWS: usize>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
assert!(z_values.len() == NUM_WINDOWS + 1);
|
|
assert!(z_values.len() == NUM_WINDOWS + 1);
|
|
|
- region.constrain_constant(z_values.last().unwrap().cell(), pallas::Base::zero())?;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if strict {
|
|
|
|
|
+ // Constrain the remaining bits to be zero
|
|
|
|
|
+ region.constrain_constant(z_values.last().unwrap().cell(), pallas::Base::zero())?;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Ok(())
|
|
Ok(())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -163,12 +168,13 @@ impl<const WINDOW_SIZE: usize, const NUM_BITS: usize, const NUM_WINDOWS: usize>
|
|
|
&self,
|
|
&self,
|
|
|
mut layouter: impl Layouter<pallas::Base>,
|
|
mut layouter: impl Layouter<pallas::Base>,
|
|
|
value: Value<pallas::Base>,
|
|
value: Value<pallas::Base>,
|
|
|
|
|
+ strict: bool,
|
|
|
) -> Result<(), plonk::Error> {
|
|
) -> Result<(), plonk::Error> {
|
|
|
layouter.assign_region(
|
|
layouter.assign_region(
|
|
|
|| format!("witness {}-bit native range check", NUM_BITS),
|
|
|| format!("witness {}-bit native range check", NUM_BITS),
|
|
|
|mut region: Region<'_, pallas::Base>| {
|
|
|mut region: Region<'_, pallas::Base>| {
|
|
|
let z_0 = region.assign_advice(|| "z_0", self.config.z, 0, || value)?;
|
|
let z_0 = region.assign_advice(|| "z_0", self.config.z, 0, || value)?;
|
|
|
- self.decompose(&mut region, z_0, 0)?;
|
|
|
|
|
|
|
+ self.decompose(&mut region, z_0, 0, strict)?;
|
|
|
Ok(())
|
|
Ok(())
|
|
|
},
|
|
},
|
|
|
)
|
|
)
|
|
@@ -178,12 +184,13 @@ impl<const WINDOW_SIZE: usize, const NUM_BITS: usize, const NUM_WINDOWS: usize>
|
|
|
&self,
|
|
&self,
|
|
|
mut layouter: impl Layouter<pallas::Base>,
|
|
mut layouter: impl Layouter<pallas::Base>,
|
|
|
value: AssignedCell<pallas::Base, pallas::Base>,
|
|
value: AssignedCell<pallas::Base, pallas::Base>,
|
|
|
|
|
+ strict: bool,
|
|
|
) -> Result<(), plonk::Error> {
|
|
) -> Result<(), plonk::Error> {
|
|
|
layouter.assign_region(
|
|
layouter.assign_region(
|
|
|
|| format!("copy {}-bit native range check", NUM_BITS),
|
|
|| format!("copy {}-bit native range check", NUM_BITS),
|
|
|
|mut region: Region<'_, pallas::Base>| {
|
|
|mut region: Region<'_, pallas::Base>| {
|
|
|
let z_0 = value.copy_advice(|| "z_0", &mut region, self.config.z, 0)?;
|
|
let z_0 = value.copy_advice(|| "z_0", &mut region, self.config.z, 0)?;
|
|
|
- self.decompose(&mut region, z_0, 0)?;
|
|
|
|
|
|
|
+ self.decompose(&mut region, z_0, 0, strict)?;
|
|
|
Ok(())
|
|
Ok(())
|
|
|
},
|
|
},
|
|
|
)
|
|
)
|
|
@@ -251,12 +258,16 @@ mod tests {
|
|
|
)?;
|
|
)?;
|
|
|
|
|
|
|
|
let a = assign_free_advice(layouter.namespace(|| "load a"), config.1, self.a)?;
|
|
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)?;
|
|
|
|
|
|
|
+ rangecheck_chip.copy_range_check(
|
|
|
|
|
+ layouter.namespace(|| "copy a and range check"),
|
|
|
|
|
+ a,
|
|
|
|
|
+ true,
|
|
|
|
|
+ )?;
|
|
|
|
|
|
|
|
rangecheck_chip.witness_range_check(
|
|
rangecheck_chip.witness_range_check(
|
|
|
layouter.namespace(|| "witness a and range check"),
|
|
layouter.namespace(|| "witness a and range check"),
|
|
|
self.a,
|
|
self.a,
|
|
|
|
|
+ true,
|
|
|
)?;
|
|
)?;
|
|
|
|
|
|
|
|
Ok(())
|
|
Ok(())
|