Browse Source

zk/gadget/range_check: Test 64 bits, 128 bits, and 253 bits.

parazyd 4 years ago
parent
commit
32ece50229
1 changed files with 90 additions and 7 deletions
  1. 90 7
      src/zk/gadget/range_check.rs

+ 90 - 7
src/zk/gadget/range_check.rs

@@ -239,15 +239,15 @@ mod tests {
     }
     }
 
 
     #[test]
     #[test]
-    fn range_check_test() {
-        let valid_64bit = vec![
+    fn range_check_64bit() {
+        let valid = vec![
             pallas::Base::zero(),
             pallas::Base::zero(),
             pallas::Base::one(),
             pallas::Base::one(),
             pallas::Base::from(u64::MAX),
             pallas::Base::from(u64::MAX),
             pallas::Base::from(rand::random::<u64>()),
             pallas::Base::from(rand::random::<u64>()),
         ];
         ];
 
 
-        let invalid_64bit = vec![
+        let invalid = vec![
             -pallas::Base::one(),
             -pallas::Base::one(),
             pallas::Base::from_u128(u64::MAX as u128 + 1),
             pallas::Base::from_u128(u64::MAX as u128 + 1),
             -pallas::Base::from(u64::MAX),
             -pallas::Base::from(u64::MAX),
@@ -259,24 +259,107 @@ mod tests {
         let circuit = RangeCheckCircuit::<pallas::Base, 3, 64, 22> {
         let circuit = RangeCheckCircuit::<pallas::Base, 3, 64, 22> {
             value: Value::known(pallas::Base::one()),
             value: Value::known(pallas::Base::one()),
         };
         };
-        let root = BitMapBackend::new("target/rangecheck_circuit_layout.png", (3840, 2160))
+        let root = BitMapBackend::new("target/rangecheck64_circuit_layout.png", (3840, 2160))
             .into_drawing_area();
             .into_drawing_area();
         root.fill(&WHITE).unwrap();
         root.fill(&WHITE).unwrap();
-        let root = root.titled("Range Check Circuit Layout", ("sans-serif", 60)).unwrap();
+        let root = root.titled("Range Check (64-bit) Circuit Layout", ("sans-serif", 60)).unwrap();
         CircuitLayout::default().render(k, &circuit, &root).unwrap();
         CircuitLayout::default().render(k, &circuit, &root).unwrap();
 
 
-        for val in valid_64bit {
+        for val in valid {
             println!("64-bit range check for {:?}", val);
             println!("64-bit range check for {:?}", val);
             let circuit = RangeCheckCircuit::<pallas::Base, 3, 64, 22> { value: Value::known(val) };
             let circuit = RangeCheckCircuit::<pallas::Base, 3, 64, 22> { value: Value::known(val) };
             let prover = MockProver::run(k, &circuit, vec![]).unwrap();
             let prover = MockProver::run(k, &circuit, vec![]).unwrap();
             prover.assert_satisfied();
             prover.assert_satisfied();
         }
         }
 
 
-        for val in invalid_64bit {
+        for val in invalid {
             println!("64-bit range check for {:?}", val);
             println!("64-bit range check for {:?}", val);
             let circuit = RangeCheckCircuit::<pallas::Base, 3, 64, 22> { value: Value::known(val) };
             let circuit = RangeCheckCircuit::<pallas::Base, 3, 64, 22> { value: Value::known(val) };
             let prover = MockProver::run(k, &circuit, vec![]).unwrap();
             let prover = MockProver::run(k, &circuit, vec![]).unwrap();
             assert!(prover.verify().is_err());
             assert!(prover.verify().is_err());
         }
         }
     }
     }
+
+    #[test]
+    fn range_check_128bit() {
+        let valid = vec![
+            pallas::Base::zero(),
+            pallas::Base::one(),
+            pallas::Base::from_u128(u128::MAX),
+            pallas::Base::from_u128(rand::random::<u128>()),
+        ];
+
+        let invalid = vec![
+            pallas::Base::from_u128(u128::MAX) + pallas::Base::one(),
+            -pallas::Base::from_u128(u128::MAX),
+        ];
+
+        let k = 6;
+
+        use plotters::prelude::*;
+        let circuit = RangeCheckCircuit::<pallas::Base, 3, 128, 43> {
+            value: Value::known(pallas::Base::one()),
+        };
+        let root = BitMapBackend::new("target/rangecheck128_circuit_layout.png", (3840, 2160))
+            .into_drawing_area();
+        root.fill(&WHITE).unwrap();
+        let root = root.titled("Range Check (128-bit) Circuit Layout", ("sans-serif", 60)).unwrap();
+        CircuitLayout::default().render(k, &circuit, &root).unwrap();
+
+        for val in valid {
+            println!("128-bit range check for {:?}", val);
+            let circuit =
+                RangeCheckCircuit::<pallas::Base, 3, 128, 43> { value: Value::known(val) };
+            let prover = MockProver::run(k, &circuit, vec![]).unwrap();
+            prover.assert_satisfied();
+        }
+
+        for val in invalid {
+            println!("128-bit range check for {:?}", val);
+            let circuit =
+                RangeCheckCircuit::<pallas::Base, 3, 128, 43> { value: Value::known(val) };
+            let prover = MockProver::run(k, &circuit, vec![]).unwrap();
+            assert!(prover.verify().is_err());
+        }
+    }
+
+    #[test]
+    fn range_check_253bit() {
+        use group::ff::PrimeField;
+
+        let valid = vec![
+            pallas::Base::zero(),
+            pallas::Base::one(),
+            // 2^253 - 1
+            pallas::Base::from_str_vartime(
+                "14474011154664524427946373126085988481658748083205070504932198000989141204991",
+            )
+            .unwrap(),
+            // 2^253 / 2
+            pallas::Base::from_str_vartime(
+                "7237005577332262213973186563042994240829374041602535252466099000494570602496",
+            )
+            .unwrap(),
+        ];
+
+        let k = 7;
+
+        use plotters::prelude::*;
+        let circuit = RangeCheckCircuit::<pallas::Base, 3, 253, 85> {
+            value: Value::known(pallas::Base::one()),
+        };
+        let root = BitMapBackend::new("target/rangecheck253_circuit_layout.png", (3840, 2160))
+            .into_drawing_area();
+        root.fill(&WHITE).unwrap();
+        let root = root.titled("Range Check (253-bit) Circuit Layout", ("sans-serif", 60)).unwrap();
+        CircuitLayout::default().render(k, &circuit, &root).unwrap();
+
+        for val in valid {
+            println!("253-bit range check for {:?}", val);
+            let circuit =
+                RangeCheckCircuit::<pallas::Base, 3, 253, 85> { value: Value::known(val) };
+            let prover = MockProver::run(k, &circuit, vec![]).unwrap();
+            prover.assert_satisfied();
+        }
+    }
 }
 }