Răsfoiți Sursa

[zk/circuits/lead_contract] replace constrain instance for coin2 commit, and serial number with constrain equal

mohab metwally 3 ani în urmă
părinte
comite
149aaaf465
3 a modificat fișierele cu 52 adăugiri și 31 ștergeri
  1. 7 7
      example/lead.rs
  2. 3 6
      src/crypto/leadcoin.rs
  3. 42 18
      src/zk/circuit/lead_contract.rs

+ 7 - 7
example/lead.rs

@@ -5,7 +5,7 @@ use url::Url;
 
 use darkfi::{
     consensus::ouroboros::{Epoch, EpochConsensus, Stakeholder},
-    crypto::leadcoin::{LeadCoin, LEAD_PUBLIC_INPUT_LEN},
+    crypto::{lead_proof, leadcoin::{LeadCoin, LEAD_PUBLIC_INPUT_LEN}},
     net::Settings,
 };
 
@@ -15,7 +15,7 @@ fn main() {
     let k: u32 = 13;
     //
 
-    //
+
     let _value = 33223; //static stake value
 
     //
@@ -50,13 +50,13 @@ fn main() {
 
     let public_inputs: [pallas::Base; LEAD_PUBLIC_INPUT_LEN] = coin.public_inputs_as_array();
 
-    //let lead_pk = stakeholder.get_provkingkey();
-    //let lead_vk = stakeholder.get_verifyingkey();
+    let lead_pk = stakeholder.get_leadprovkingkey();
+    let lead_vk = stakeholder.get_leadverifyingkey();
 
-    //let proof = lead_proof::create_lead_proof(&lead_pk.clone(), coin.clone()).unwrap();
-    //lead_proof::verify_lead_proof(&lead_vk, &proof, &public_inputs);
+    let proof = lead_proof::create_lead_proof(&lead_pk.clone(), coin.clone()).unwrap();
+    lead_proof::verify_lead_proof(&lead_vk, &proof, &public_inputs);
 
     let prover = MockProver::run(k, &contract, vec![public_inputs.to_vec()]).unwrap();
     prover.assert_satisfied();
-    //assert_eq!(prover.verify(), Ok(()));
+    assert_eq!(prover.verify(), Ok(()));
 }

+ 3 - 6
src/crypto/leadcoin.rs

@@ -12,7 +12,7 @@ use crate::{
     zk::circuit::lead_contract::LeadContract,
 };
 
-pub const LEAD_PUBLIC_INPUT_LEN: usize = 11;
+pub const LEAD_PUBLIC_INPUT_LEN: usize = 8;
 
 #[derive(Debug, Default, Clone, Copy)]
 pub struct LeadCoin {
@@ -48,9 +48,7 @@ impl LeadCoin {
             .unwrap();
 
         let po_cm = self.cm.unwrap().to_affine().coordinates().unwrap();
-        let po_cm2 = self.cm2.unwrap().to_affine().coordinates().unwrap();
         let po_pk = self.keypair.unwrap().public.0.to_affine().coordinates().unwrap();
-        let po_sn = self.sn.unwrap();
 
         let y_mu = self.y_mu.unwrap();
         let rho_mu = self.rho_mu.unwrap();
@@ -96,13 +94,10 @@ impl LeadCoin {
         let public_inputs: [pallas::Base; LEAD_PUBLIC_INPUT_LEN] = [
             *po_cm.x(),
             *po_cm.y(),
-            *po_cm2.x(),
-            *po_cm2.y(),
             po_nonce,
             cm_root.inner(),
             *po_pk.x(),
             *po_pk.y(),
-            po_sn,
             po_y,
             po_rho,
         ];
@@ -122,8 +117,10 @@ impl LeadCoin {
             coin_timestamp: Value::known(self.tau.unwrap()), //
             coin_nonce: Value::known(self.nonce.unwrap()),
             coin1_blind: Value::known(self.c1_blind.unwrap()),
+            coin1_sn: Value::known(self.sn.unwrap()),
             value: Value::known(pallas::Base::from(self.value.unwrap())),
             coin2_blind: Value::known(self.c2_blind.unwrap()),
+            coin2_commit: Value::known(self.cm2.unwrap()),
             cm_pos: Value::known(self.idx),
             //sn_c1: Value::known(self.sn.unwrap()),
             slot: Value::known(self.sl.unwrap()),

+ 42 - 18
src/zk/circuit/lead_contract.rs

@@ -9,7 +9,7 @@ use darkfi_sdk::crypto::{
 use halo2_gadgets::{
     ecc::{
         chip::{EccChip, EccConfig},
-        FixedPoint, FixedPointBaseField, ScalarFixed,
+        FixedPoint, FixedPointBaseField, ScalarFixed,NonIdentityPoint,
     },
     poseidon::{
         primitives as poseidon, Hash as PoseidonHash, Pow5Chip as PoseidonChip,
@@ -37,6 +37,8 @@ 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;
@@ -93,16 +95,14 @@ impl LeadConfig {
 
 const LEAD_COIN_COMMIT_X_OFFSET: usize = 0;
 const LEAD_COIN_COMMIT_Y_OFFSET: usize = 1;
-const LEAD_COIN_COMMIT2_X_OFFSET: usize = 2;
-const LEAD_COIN_COMMIT2_Y_OFFSET: usize = 3;
-const LEAD_COIN_NONCE2_OFFSET: usize = 4;
-const LEAD_COIN_COMMIT_PATH_OFFSET: usize = 5;
-const LEAD_COIN_PK_X_OFFSET: usize = 6;
-const LEAD_COIN_PK_Y_OFFSET: usize = 7;
-const LEAD_COIN_SERIAL_NUMBER_OFFSET: usize = 8;
-const LEAD_Y_COMMIT_BASE_OFFSET: usize = 9;
-const LEAD_RHO_COMMIT_BASE_OFFSET: usize = 10;
-
+//const LEAD_COIN_COMMIT2_X_OFFSET: usize = 2;
+//const LEAD_COIN_COMMIT2_Y_OFFSET: usize = 3;
+const LEAD_COIN_NONCE2_OFFSET: usize = 2;
+const LEAD_COIN_COMMIT_PATH_OFFSET: usize = 3;
+const LEAD_COIN_PK_X_OFFSET: usize = 4;
+const LEAD_COIN_PK_Y_OFFSET: usize = 5;
+const LEAD_Y_COMMIT_BASE_OFFSET: usize = 6;
+const LEAD_RHO_COMMIT_BASE_OFFSET: usize = 7;
 
 #[derive(Default, Debug)]
 pub struct LeadContract {
@@ -114,8 +114,10 @@ pub struct LeadContract {
     pub coin_timestamp: Value<pallas::Base>,
     pub coin_nonce: Value<pallas::Base>,
     pub coin1_blind: Value<pallas::Scalar>,
+    pub coin1_sn: Value<pallas::Base>,
     pub value: Value<pallas::Base>,
     pub coin2_blind: Value<pallas::Scalar>,
+    pub coin2_commit: Value<pallas::Point>,
     // public advices
     pub cm_pos: Value<u32>,
     //
@@ -295,6 +297,12 @@ impl Circuit<pallas::Base> for LeadContract {
             self.coin_nonce,
         )?;
 
+        let coin1_sn: AssignedCell<Fp, Fp> = self.load_private(
+            layouter.namespace(|| "load coin1 sn"),
+            config.advices[0],
+            self.coin1_sn,
+        )?;
+
         // staking coin value
         let coin_value = self.load_private(
             layouter.namespace(|| "load coin value"),
@@ -602,7 +610,7 @@ impl Circuit<pallas::Base> for LeadContract {
                 self.mau_rho,
             )?;
             let rho_commit_r =
-                FixedPoint::from_inner(ecc_chip, OrchardFixedBasesFull::ValueCommitR);
+                FixedPoint::from_inner(ecc_chip.clone(), OrchardFixedBasesFull::ValueCommitR);
             rho_commit_r.mul(layouter.namespace(|| "coin serial number commit R"), mau_rho)?
         };
         let rho_commit = com.add(layouter.namespace(|| "nonce commit"), &blind)?;
@@ -664,6 +672,21 @@ impl Circuit<pallas::Base> for LeadContract {
             LEAD_COIN_COMMIT_Y_OFFSET,
         )?;
 
+
+        let ref_coin2_cm = NonIdentityPoint::new(
+            ecc_chip.clone(),
+            layouter.namespace(|| "witness coin2 cm"),
+            self.coin2_commit.map(|x| x.to_affine()),
+        )?;
+
+
+        coin2_commit.constrain_equal(
+            layouter.namespace(||""),
+            &ref_coin2_cm
+        )?;
+
+
+        /*
         layouter.constrain_instance(
             coin2_commit_x.cell(),
             config.primary,
@@ -675,6 +698,7 @@ impl Circuit<pallas::Base> for LeadContract {
             config.primary,
             LEAD_COIN_COMMIT2_Y_OFFSET,
         )?;
+         */
 
         layouter.constrain_instance(coin2_nonce.cell(), config.primary, LEAD_COIN_NONCE2_OFFSET)?;
 
@@ -687,12 +711,12 @@ impl Circuit<pallas::Base> for LeadContract {
         layouter.constrain_instance(coin_pk_x.cell(), config.primary, LEAD_COIN_PK_X_OFFSET)?;
         layouter.constrain_instance(coin_pk_y.cell(), config.primary, LEAD_COIN_PK_Y_OFFSET)?;
 
-        // constrain coin's pub key x value
-        layouter.constrain_instance(
-            sn_commit.cell(),
-            config.primary,
-            LEAD_COIN_SERIAL_NUMBER_OFFSET,
-        )?;
+        layouter.assign_region(||"",
+                               |mut region| {
+                                   region.constrain_equal(sn_commit.cell(),
+                                                          coin1_sn.cell())
+                               }
+        );
 
         layouter.constrain_instance(
             y_commit_base.cell(),