Bläddra i källkod

zk/gadget: Allow more refined configuration of advice columns.

parazyd 3 år sedan
förälder
incheckning
bbf6635abd

+ 1 - 6
src/consensus/utils.rs

@@ -67,13 +67,8 @@ pub fn fbig2base(f: Float10) -> pallas::Base {
 #[cfg(test)]
 mod tests {
     use dashu::integer::IBig;
-    use pasta_curves::pallas;
 
-    use crate::consensus::{
-        types::Float10,
-        utils::{fbig2base, fbig2ibig},
-        RADIX_BITS,
-    };
+    use crate::consensus::{types::Float10, utils::fbig2ibig, RADIX_BITS};
 
     #[test]
     fn dashu_fbig2ibig() {

+ 7 - 5
src/zk/circuit/lead_contract.rs

@@ -44,9 +44,9 @@ use halo2_gadgets::{
 };
 use halo2_proofs::{
     circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value},
+    pasta::{group::Curve, pallas, Fp},
     plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance as InstanceColumn},
 };
-use pasta_curves::{pallas, Fp};
 
 use crate::zk::gadget::{
     arithmetic::{ArithChip, ArithConfig, ArithInstruction},
@@ -54,8 +54,6 @@ use crate::zk::gadget::{
     native_range_check::NativeRangeCheckChip,
 };
 
-use pasta_curves::group::Curve;
-
 const WINDOW_SIZE: usize = 3;
 const NUM_OF_BITS: usize = 254;
 const NUM_OF_WINDOWS: usize = 85;
@@ -75,7 +73,6 @@ pub struct LeadConfig {
         SinsemillaConfig<OrchardHashDomains, OrchardCommitDomains, OrchardFixedBases>,
 
     lessthan_config: LessThanConfig<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>,
-
     arith_config: ArithConfig,
 }
 
@@ -261,6 +258,9 @@ impl Circuit<pallas::Base> for LeadContract {
             let b = meta.advice_column();
             let a_offset = meta.advice_column();
 
+            let z1 = meta.advice_column();
+            let z2 = meta.advice_column();
+
             let constants = meta.fixed_column();
             meta.enable_constant(constants);
 
@@ -269,6 +269,8 @@ impl Circuit<pallas::Base> for LeadContract {
                 a,
                 b,
                 a_offset,
+                z1,
+                z2,
                 k_values_table,
             )
         };
@@ -692,7 +694,7 @@ impl Circuit<pallas::Base> for LeadContract {
                 region.constrain_equal(sn_commit.cell(), coin1_sn.cell())?;
                 region.constrain_equal(coin_cm_root.cell(), root_cm.cell())
             },
-        );
+        )?;
 
         Ok(())
     }

+ 2 - 0
src/zk/circuit/mod.rs

@@ -25,5 +25,7 @@ pub use mint_contract::MintContract;
 pub mod lead_contract;
 pub use lead_contract::LeadContract;
 
+pub mod lead_contract_opti;
+
 pub mod tx_contract;
 pub use tx_contract::TxContract;

+ 9 - 3
src/zk/circuit/tx_contract.rs

@@ -257,11 +257,17 @@ impl Circuit<pallas::Base> for TxContract {
             let constants = meta.fixed_column();
             meta.enable_constant(constants);
 
+            // TODO: FIXME: Configure these better, this is just a stop-gap
+            let z1 = meta.advice_column();
+            let z2 = meta.advice_column();
+
             LessThanChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::configure(
                 meta,
                 a,
                 b,
                 a_offset,
+                z1,
+                z2,
                 k_values_table,
             )
         };
@@ -582,7 +588,7 @@ impl Circuit<pallas::Base> for TxContract {
             coin_commit_r.mul(layouter.namespace(|| "coin serial number commit R"), coin3_blind)?
         };
         let coin3_commit = com2.add(layouter.namespace(|| "nonce commit"), &blind)?;
-        coin3_commit.constrain_equal(layouter.namespace(|| ""), &ref_coin3_cm);
+        coin3_commit.constrain_equal(layouter.namespace(|| ""), &ref_coin3_cm)?;
 
         // ========
         // coin4 cm
@@ -623,7 +629,7 @@ impl Circuit<pallas::Base> for TxContract {
             coin_commit_r.mul(layouter.namespace(|| "coin serial number commit R"), coin4_blind)?
         };
         let coin4_commit = com2.add(layouter.namespace(|| " commit"), &blind)?;
-        coin4_commit.constrain_equal(layouter.namespace(|| ""), &ref_coin4_cm);
+        coin4_commit.constrain_equal(layouter.namespace(|| ""), &ref_coin4_cm)?;
 
         let v1pv2: AssignedCell<Fp, Fp> =
             ar_chip.add(layouter.namespace(|| ""), &coin1_value, &coin2_value)?;
@@ -780,7 +786,7 @@ impl Circuit<pallas::Base> for TxContract {
                 region.constrain_equal(coin1_sn_commit.cell(), coin1_sn.cell())?;
                 region.constrain_equal(coin2_sn_commit.cell(), coin2_sn.cell())
             },
-        );
+        )?;
         Ok(())
     }
 }

+ 11 - 4
src/zk/gadget/less_than.rs

@@ -77,6 +77,8 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
         a: Column<Advice>,
         b: Column<Advice>,
         a_offset: Column<Advice>,
+        z1: Column<Advice>,
+        z2: Column<Advice>,
         k_values_table: TableColumn,
     ) -> LessThanConfig<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS> {
         let s_lt = meta.selector();
@@ -84,20 +86,21 @@ impl<const WINDOW_SIZE: usize, const NUM_OF_BITS: usize, const NUM_OF_WINDOWS: u
         meta.enable_equality(a);
         meta.enable_equality(b);
         meta.enable_equality(a_offset);
+        meta.enable_equality(z1);
+        meta.enable_equality(z2);
 
         // configure range check for `a` and `offset`
-        let z = meta.advice_column();
         let range_a_config =
             NativeRangeCheckChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::configure(
                 meta,
-                z,
+                z1,
                 k_values_table,
             );
-        let z = meta.advice_column();
+
         let range_a_offset_config =
             NativeRangeCheckChip::<WINDOW_SIZE, NUM_OF_BITS, NUM_OF_WINDOWS>::configure(
                 meta,
-                z,
+                z2,
                 k_values_table,
             );
 
@@ -277,6 +280,8 @@ mod tests {
                     let a = meta.advice_column();
                     let b = meta.advice_column();
                     let a_offset = meta.advice_column();
+                    let z1 = meta.advice_column();
+                    let z2 = meta.advice_column();
 
                     let k_values_table = meta.lookup_table_column();
 
@@ -289,6 +294,8 @@ mod tests {
                             a,
                             b,
                             a_offset,
+                            z1,
+                            z2,
                             k_values_table,
                         ),
                         w,

+ 7 - 0
src/zk/vm.rs

@@ -243,11 +243,18 @@ impl Circuit<pallas::Base> for ZkCircuit {
         let k_values_table_253 = meta.lookup_table_column();
         let native_253_range_check_config =
             NativeRangeCheckChip::<3, 253, 85>::configure(meta, advices[8], k_values_table_253);
+
+        // TODO: FIXME: Configure these better, this is just a stop-gap
+        let z1 = meta.advice_column();
+        let z2 = meta.advice_column();
+
         let lessthan_config = LessThanChip::<3, 253, 85>::configure(
             meta,
             advices[6],
             advices[7],
             advices[8],
+            z1,
+            z2,
             k_values_table_253,
         );