瀏覽代碼

zk: Optional enforcing for remaining bits in less_than and native_range_check

parazyd 4 年之前
父節點
當前提交
b55fc083d6
共有 2 個文件被更改,包括 30 次插入11 次删除
  1. 13 5
      src/zk/gadget/less_than.rs
  2. 17 6
      src/zk/gadget/native_range_check.rs

+ 13 - 5
src/zk/gadget/less_than.rs

@@ -113,6 +113,7 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
         a: Value<pallas::Base>,
         a: Value<pallas::Base>,
         b: Value<pallas::Base>,
         b: Value<pallas::Base>,
         offset: usize,
         offset: usize,
+        strict: bool,
     ) -> Result<(), Error> {
     ) -> Result<(), Error> {
         let (a, _, a_offset) = layouter.assign_region(
         let (a, _, a_offset) = layouter.assign_region(
             || "a less than b",
             || "a less than b",
@@ -124,7 +125,7 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
             },
             },
         )?;
         )?;
 
 
-        self.less_than_range_check(layouter, a, a_offset)?;
+        self.less_than_range_check(layouter, a, a_offset, strict)?;
 
 
         Ok(())
         Ok(())
     }
     }
@@ -135,6 +136,7 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
         a: AssignedCell<pallas::Base, pallas::Base>,
         a: AssignedCell<pallas::Base, pallas::Base>,
         b: AssignedCell<pallas::Base, pallas::Base>,
         b: AssignedCell<pallas::Base, pallas::Base>,
         offset: usize,
         offset: usize,
+        strict: bool,
     ) -> Result<(), Error> {
     ) -> Result<(), Error> {
         let (a, _, a_offset) = layouter.assign_region(
         let (a, _, a_offset) = layouter.assign_region(
             || "a less than b",
             || "a less than b",
@@ -146,7 +148,7 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
             },
             },
         )?;
         )?;
 
 
-        self.less_than_range_check(layouter, a, a_offset)?;
+        self.less_than_range_check(layouter, a, a_offset, strict)?;
 
 
         Ok(())
         Ok(())
     }
     }
@@ -156,6 +158,7 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
         mut layouter: impl Layouter<pallas::Base>,
         mut layouter: impl Layouter<pallas::Base>,
         a: AssignedCell<pallas::Base, pallas::Base>,
         a: AssignedCell<pallas::Base, pallas::Base>,
         a_offset: AssignedCell<pallas::Base, pallas::Base>,
         a_offset: AssignedCell<pallas::Base, pallas::Base>,
+        strict: bool,
     ) -> Result<(), Error> {
     ) -> Result<(), Error> {
         let range_a_chip =
         let range_a_chip =
             NativeRangeCheckChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::construct(
             NativeRangeCheckChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::construct(
@@ -166,9 +169,13 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
                 self.config.range_a_offset_config.clone(),
                 self.config.range_a_offset_config.clone(),
             );
             );
 
 
-        range_a_chip.copy_range_check(layouter.namespace(|| "a copy_range_check"), a)?;
-        range_a_offset_chip
-            .copy_range_check(layouter.namespace(|| "a_offset copy_range_check"), a_offset)?;
+        range_a_chip.copy_range_check(layouter.namespace(|| "a copy_range_check"), a, strict)?;
+
+        range_a_offset_chip.copy_range_check(
+            layouter.namespace(|| "a_offset copy_range_check"),
+            a_offset,
+            strict,
+        )?;
 
 
         Ok(())
         Ok(())
     }
     }
@@ -265,6 +272,7 @@ mod tests {
                         self.a,
                         self.a,
                         self.b,
                         self.b,
                         0,
                         0,
+                        true,
                     )?;
                     )?;
 
 
                     Ok(())
                     Ok(())

+ 17 - 6
src/zk/gadget/native_range_check.rs

@@ -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(())