瀏覽代碼

[zk/circuits/lead_contract] fix bug with order of hash inputs

mohab metwally 3 年之前
父節點
當前提交
61dcf7a9d3
共有 2 個文件被更改,包括 33 次插入5 次删除
  1. 12 2
      src/crypto/leadcoin.rs
  2. 21 3
      src/zk/circuit/lead_contract.rs

+ 12 - 2
src/crypto/leadcoin.rs

@@ -62,10 +62,20 @@ impl LeadCoin {
                 .hash(lottery_msg_input);
         //
         let po_y_pt: pallas::Point = pedersen_commitment_base(lottery_msg, mod_r_p(y_mu));
-        let po_y = *po_y_pt.to_affine().coordinates().unwrap().x();
+        let po_y_x = *po_y_pt.to_affine().coordinates().unwrap().x();
+        let po_y_y = *po_y_pt.to_affine().coordinates().unwrap().y();
+        let y_coord_arr = [po_y_x, po_y_y];
+        let po_y: pallas::Base =
+            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<2>, 3, 2>::init(
+            )
+            .hash(y_coord_arr);
         //
         let po_rho_pt: pallas::Point = pedersen_commitment_base(lottery_msg, mod_r_p(rho_mu));
-        let po_rho = *po_rho_pt.to_affine().coordinates().unwrap().x();
+        let po_rho_x = *po_rho_pt.to_affine().coordinates().unwrap().x();
+        let po_rho_y = *po_rho_pt.to_affine().coordinates().unwrap().y();
+        let rho_coord_arr = [po_rho_x, po_rho_y];
+        let po_rho: pallas::Base =
+            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<2>, 3, 2>::init().hash(rho_coord_arr);
 
         let cm_pos = self.idx;
         let cm_root = {

+ 21 - 3
src/zk/circuit/lead_contract.rs

@@ -573,10 +573,10 @@ impl Circuit<pallas::Base> for LeadContract {
             y_commit_r.mul(layouter.namespace(|| "coin serial number commit R"), mau_y)?
         };
         let y_commit = com.add(layouter.namespace(|| "nonce commit"), &blind)?;
-        let y_commit_base_y = y_commit.inner().x();
         let y_commit_base_x = y_commit.inner().x();
+        let y_commit_base_y = y_commit.inner().y();
         let y_commit_base: AssignedCell<Fp, Fp> = {
-            let y_coord = [y_commit_base_y, y_commit_base_x];
+            let y_coord = [y_commit_base_x, y_commit_base_y];
             let poseidon_hasher = PoseidonHash::<
                 _,
                 _,
@@ -606,8 +606,26 @@ impl Circuit<pallas::Base> for LeadContract {
             rho_commit_r.mul(layouter.namespace(|| "coin serial number commit R"), mau_rho)?
         };
         let rho_commit = com.add(layouter.namespace(|| "nonce commit"), &blind)?;
-        let rho_commit_base = rho_commit.inner().x();
+        let rho_commit_x = rho_commit.inner().x();
+        let rho_commit_y = rho_commit.inner().y();
+        let rho_commit_base: AssignedCell<Fp, Fp> = {
+            let rho_coord = [rho_commit_x, rho_commit_y];
+            let poseidon_hasher = PoseidonHash::<
+                    _,
+                _,
+                poseidon::P128Pow5T3,
+                poseidon::ConstantLength<2>,
+                3,
+                2,
+                >::init(
+                config.poseidon_chip(), layouter.namespace(|| "Poseidon init")
+            )?;
 
+            let poseidon_output =
+                poseidon_hasher.hash(layouter.namespace(|| "Poseidon hash"), rho_coord)?;
+            let poseidon_output: AssignedCell<Fp, Fp> = poseidon_output;
+            poseidon_output
+        };
         let term1 =
             ar_chip.mul(layouter.namespace(|| "calculate term1"), &sigma1, &coin_value.clone())?;