Просмотр исходного кода

[crypsinous:example/lead] update lessthan gadget in lead example with 254 bits

mohab metwally 4 лет назад
Родитель
Сommit
6f2cd5070d
3 измененных файлов с 24 добавлено и 42 удалено
  1. 11 12
      example/lessthan.rs
  2. 2 2
      src/crypto/leadcoin.rs
  3. 11 28
      src/zk/circuit/lead_contract.rs

+ 11 - 12
example/lessthan.rs

@@ -19,8 +19,8 @@ struct LessThanCircuit {
 }
 }
 
 
 const WINDOW_SIZE: usize = 3;
 const WINDOW_SIZE: usize = 3;
-const NUM_OF_BITS: usize = 255;
-const NUM_OF_WINDOWS: usize = 22;
+const NUM_OF_BITS: usize = 254;
+const NUM_OF_WINDOWS: usize = 85;
 
 
 
 
 impl Circuit<pallas::Base> for LessThanCircuit {
 impl Circuit<pallas::Base> for LessThanCircuit {
@@ -84,19 +84,19 @@ impl Circuit<pallas::Base> for LessThanCircuit {
 }
 }
 
 
 fn main() {
 fn main() {
-    let k = 5;
+    let k = 13;
     let valid_a_vals = vec![
     let valid_a_vals = vec![
         pallas::Base::from(3),
         pallas::Base::from(3),
-        //pallas::Base::zero(),
-        //pallas::Base::one()
+        pallas::Base::zero(),
+        pallas::Base::one()
     ];
     ];
     let valid_b_vals = vec![
     let valid_b_vals = vec![
         pallas::Base::from(5),
         pallas::Base::from(5),
-        //pallas::Base::from(u64::MAX),
-        //pallas::Base::from(rand::random::<u64>()),
+        pallas::Base::from(u64::MAX),
+        pallas::Base::from(rand::random::<u64>()),
     ];
     ];
 
 
-    /*
+
     let invalid_a_vals = vec![
     let invalid_a_vals = vec![
         pallas::Base::from(14),
         pallas::Base::from(14),
         pallas::Base::from(u64::MAX),
         pallas::Base::from(u64::MAX),
@@ -111,7 +111,6 @@ fn main() {
         pallas::Base::one(),
         pallas::Base::one(),
         pallas::Base::from(u64::MAX),
         pallas::Base::from(u64::MAX),
     ];
     ];
-    */
     use plotters::prelude::*;
     use plotters::prelude::*;
     let circuit = LessThanCircuit {
     let circuit = LessThanCircuit {
         a: Value::known(pallas::Base::zero()),
         a: Value::known(pallas::Base::zero()),
@@ -133,7 +132,7 @@ fn main() {
         prover.assert_satisfied();
         prover.assert_satisfied();
     }
     }
 
 
-    /*
+
     for i in 0..invalid_a_vals.len() {
     for i in 0..invalid_a_vals.len() {
         let a = invalid_a_vals[i];
         let a = invalid_a_vals[i];
         let b = invalid_b_vals[i];
         let b = invalid_b_vals[i];
@@ -144,6 +143,6 @@ fn main() {
 
 
         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())
-}
-    */
+    }
+
 }
 }

+ 2 - 2
src/crypto/leadcoin.rs

@@ -53,7 +53,7 @@ impl LeadCoin {
         let po_pk = self.pk.unwrap();
         let po_pk = self.pk.unwrap();
         let po_sn = self.sn.unwrap();
         let po_sn = self.sn.unwrap();
 
 
-        let po_cmp = pallas::Base::from(0);
+        let po_cmp = pallas::Base::from(1);
         let _zero = pallas::Base::from(0);
         let _zero = pallas::Base::from(0);
         // ===============
         // ===============
 
 
@@ -82,7 +82,7 @@ impl LeadCoin {
             *po_cm2.x(),
             *po_cm2.x(),
             *po_cm2.y(),
             *po_cm2.y(),
             cm_root.0,
             cm_root.0,
-            //po_cmp,
+            po_cmp,
         ];
         ];
         public_inputs
         public_inputs
     }
     }

+ 11 - 28
src/zk/circuit/lead_contract.rs

@@ -15,11 +15,9 @@ use halo2_gadgets::{
 };
 };
 use halo2_proofs::{
 use halo2_proofs::{
     circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value},
     circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value},
-    plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance as InstanceColumn},
+    plonk::{Advice, Circuit, Column, ConstraintSystem, Error, TableColumn, Instance as InstanceColumn,},
 };
 };
-
 use pasta_curves::{pallas, Fp};
 use pasta_curves::{pallas, Fp};
-
 use crate::crypto::{
 use crate::crypto::{
     constants::{
     constants::{
         sinsemilla::{OrchardCommitDomains, OrchardHashDomains},
         sinsemilla::{OrchardCommitDomains, OrchardHashDomains},
@@ -41,8 +39,8 @@ use pasta_curves::group::{ff::PrimeField, GroupEncoding};
 
 
 const WORD_BITS: u32 = 24;
 const WORD_BITS: u32 = 24;
 const WINDOW_SIZE: usize = 3;
 const WINDOW_SIZE: usize = 3;
-const NUM_OF_BITS: usize = 255;
-const NUM_OF_WINDOWS: usize = 22;
+const NUM_OF_BITS: usize = 254;
+const NUM_OF_WINDOWS: usize = 85;
 
 
 #[derive(Clone, Debug)]
 #[derive(Clone, Debug)]
 pub struct LeadConfig {
 pub struct LeadConfig {
@@ -58,7 +56,6 @@ pub struct LeadConfig {
         SinsemillaConfig<OrchardHashDomains, OrchardCommitDomains, OrchardFixedBases>,
         SinsemillaConfig<OrchardHashDomains, OrchardCommitDomains, OrchardFixedBases>,
 
 
     lessthan_config: LessThanConfig<WINDOW_SIZE,NUM_OF_BITS,NUM_OF_WINDOWS>,
     lessthan_config: LessThanConfig<WINDOW_SIZE,NUM_OF_BITS,NUM_OF_WINDOWS>,
-    //evenbits_config: EvenBitsConfig,
 
 
     arith_config: ArithConfig,
     arith_config: ArithConfig,
 }
 }
@@ -237,28 +234,16 @@ impl Circuit<pallas::Base> for LeadContract {
             (sinsemilla_config_2, merkle_config_2)
             (sinsemilla_config_2, merkle_config_2)
         };
         };
 
 
+        let k_values_table = meta.lookup_table_column();
 
 
         let lessthan_config = {
         let lessthan_config = {
-            //let w = meta.advice_column();
-            //meta.enable_equality(w);
-
-
-
             let a = meta.advice_column();
             let a = meta.advice_column();
             let b = meta.advice_column();
             let b = meta.advice_column();
             let a_offset = meta.advice_column();
             let a_offset = meta.advice_column();
 
 
-            let k_values_table = meta.lookup_table_column();
-
             let constants = meta.fixed_column();
             let constants = meta.fixed_column();
             meta.enable_constant(constants);
             meta.enable_constant(constants);
-            //TODO fix
-            /*
-            NativeRangeCheckChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::load_k_table(
-                &mut layouter,
-                k_values_table,
-            )?;
-            */
+
             LessThanChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::configure(
             LessThanChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::configure(
                 meta,
                 meta,
                 a,
                 a,
@@ -282,7 +267,6 @@ impl Circuit<pallas::Base> for LeadContract {
             sinsemilla_config_1,
             sinsemilla_config_1,
             _sinsemilla_config_2: sinsemilla_config_2,
             _sinsemilla_config_2: sinsemilla_config_2,
             lessthan_config,
             lessthan_config,
-
             //evenbits_config,
             //evenbits_config,
             arith_config,
             arith_config,
         }
         }
@@ -298,10 +282,12 @@ impl Circuit<pallas::Base> for LeadContract {
         let ar_chip = config.arith_chip();
         let ar_chip = config.arith_chip();
         let _ps_chip = config.poseidon_chip();
         let _ps_chip = config.poseidon_chip();
 
 
-        //let eb_chip = config.evenbits_chip();
-        let less_than_chip = config.lessthan_chip();
+        NativeRangeCheckChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::load_k_table(
+            &mut layouter,
+            config.lessthan_config.k_values_table,
+        )?;
 
 
-        //eb_chip.alloc_table(&mut layouter.namespace(|| "alloc table"))?;
+        let less_than_chip = config.lessthan_chip();
 
 
         // ===============
         // ===============
         // load witnesses
         // load witnesses
@@ -636,22 +622,19 @@ impl Circuit<pallas::Base> for LeadContract {
         let ord = ar_chip.mul(layouter.namespace(|| ""), &scalar, &c)?;
         let ord = ar_chip.mul(layouter.namespace(|| ""), &scalar, &c)?;
         let target = ar_chip.mul(layouter.namespace(|| "calculate target"), &ord, &coin_value.clone())?;
         let target = ar_chip.mul(layouter.namespace(|| "calculate target"), &ord, &coin_value.clone())?;
 
 
-        //eb_chip.decompose(layouter.namespace(|| "target range check"), target.clone())?;
-        //eb_chip.decompose(layouter.namespace(|| "y_commit  range check"), y_commit_base.clone())?;
 
 
         let is_lt = layouter.assign_region(|| "y<t",
         let is_lt = layouter.assign_region(|| "y<t",
                                |mut region| {
                                |mut region| {
                                    less_than_chip.less_than(
                                    less_than_chip.less_than(
                                        region,
                                        region,
+                                       //y_commit_base.clone(),
                                        //target.clone(),
                                        //target.clone(),
                                        zero.clone(),
                                        zero.clone(),
                                        one.clone(),
                                        one.clone(),
-                                       //y_commit_base.clone(),
                                        0,
                                        0,
                                    )
                                    )
                                })?;
                                })?;
 
 
-        //eb_chip.decompose(layouter.namespace(|| "helper range check"), helper.0)?;
         layouter.constrain_instance(is_lt.cell(), config.primary, LEAD_THRESHOLD_OFFSET)?;
         layouter.constrain_instance(is_lt.cell(), config.primary, LEAD_THRESHOLD_OFFSET)?;
 
 
         Ok(())
         Ok(())