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

dao::vote(): add proposal_bulla to the nullifiers

zero 2 лет назад
Родитель
Сommit
d30a0f312c

+ 16 - 14
src/contract/dao/proof/dao-vote-burn.zk

@@ -19,25 +19,15 @@ witness "DaoVoteInput" {
     Uint32 leaf_pos,
     MerklePath path,
     Base signature_secret,
+
+    Base proposal_bulla,
 }
 
 circuit "DaoVoteInput" {
-    nullifier = poseidon_hash(secret, serial);
-    constrain_instance(nullifier);
-
-    vcv = ec_mul_short(value, VALUE_COMMIT_VALUE);
-    vcr = ec_mul(value_blind, VALUE_COMMIT_RANDOM);
-    value_commit = ec_add(vcv, vcr);
-    constrain_instance(ec_get_x(value_commit));
-    constrain_instance(ec_get_y(value_commit));
-
-    token_commit = poseidon_hash(gov_token_id, gov_token_blind);
-    constrain_instance(token_commit);
-
     pub = ec_mul_base(secret, NULLIFIER_K);
     pub_x = ec_get_x(pub);
     pub_y = ec_get_y(pub);
-    C = poseidon_hash(
+    coin = poseidon_hash(
         pub_x,
         pub_y,
         value,
@@ -46,9 +36,21 @@ circuit "DaoVoteInput" {
         spend_hook,
         user_data,
     );
+    nullifier = poseidon_hash(secret, coin, proposal_bulla);
+    constrain_instance(proposal_bulla);
+    constrain_instance(nullifier);
+
+    vcv = ec_mul_short(value, VALUE_COMMIT_VALUE);
+    vcr = ec_mul(value_blind, VALUE_COMMIT_RANDOM);
+    value_commit = ec_add(vcv, vcr);
+    constrain_instance(ec_get_x(value_commit));
+    constrain_instance(ec_get_y(value_commit));
+
+    token_commit = poseidon_hash(gov_token_id, gov_token_blind);
+    constrain_instance(token_commit);
 
     # Merkle root
-    root = merkle_root(leaf_pos, path, C);
+    root = merkle_root(leaf_pos, path, coin);
     constrain_instance(root);
 
     signature_public = ec_mul_base(signature_secret, NULLIFIER_K);

+ 7 - 4
src/contract/dao/src/client/vote.rs

@@ -77,6 +77,9 @@ impl DaoVoteCall {
         debug!(target: "dao", "build()");
         let mut proofs = vec![];
 
+        assert_eq!(self.dao.to_bulla(), self.proposal.dao_bulla);
+        let proposal_bulla = self.proposal.to_bulla();
+
         let gov_token_blind = pallas::Base::random(&mut OsRng);
 
         let mut inputs = vec![];
@@ -107,6 +110,7 @@ impl DaoVoteCall {
                 Witness::Uint32(Value::known(leaf_pos.try_into().unwrap())),
                 Witness::MerklePath(Value::known(input.merkle_path.clone().try_into().unwrap())),
                 Witness::Base(Value::known(input.signature_secret.inner())),
+                Witness::Base(Value::known(proposal_bulla.inner())),
             ];
 
             let public_key = PublicKey::from_secret(input.secret);
@@ -137,7 +141,8 @@ impl DaoVoteCall {
             let token_commit = poseidon_hash([note.token_id.inner(), gov_token_blind]);
             assert_eq!(self.dao.gov_token_id, note.token_id);
 
-            let nullifier = poseidon_hash([input.secret.inner(), note.serial]);
+            let nullifier =
+                poseidon_hash([input.secret.inner(), coin.inner(), proposal_bulla.inner()]);
 
             let vote_commit = pedersen_commitment_u64(note.value, all_vote_blind);
             let vote_commit_coords = vote_commit.to_affine().coordinates().unwrap();
@@ -145,6 +150,7 @@ impl DaoVoteCall {
             let (sig_x, sig_y) = signature_public.xy();
 
             let public_inputs = vec![
+                proposal_bulla.inner(),
                 nullifier,
                 *vote_commit_coords.x(),
                 *vote_commit_coords.y(),
@@ -177,9 +183,6 @@ impl DaoVoteCall {
         let dao_approval_ratio_base = pallas::Base::from(self.dao.approval_ratio_base);
         let (dao_pub_x, dao_pub_y) = self.dao.public_key.xy();
 
-        assert_eq!(self.dao.to_bulla(), self.proposal.dao_bulla);
-        let proposal_bulla = self.proposal.to_bulla();
-
         let vote_option = self.vote_option as u64;
         assert!(vote_option == 0 || vote_option == 1);
 

+ 1 - 0
src/contract/dao/src/entrypoint/vote.rs

@@ -74,6 +74,7 @@ pub(crate) fn dao_vote_get_metadata(
         zk_public_inputs.push((
             DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS.to_string(),
             vec![
+                params.proposal_bulla.inner(),
                 input.nullifier.inner(),
                 *value_coords.x(),
                 *value_coords.y(),

+ 2 - 2
src/contract/test-harness/src/vks.rs

@@ -50,8 +50,8 @@ use darkfi_serial::{deserialize, serialize};
 use log::debug;
 
 /// Update this if any circuits are changed
-const VKS_HASH: &str = "0df16c8bdfec0f71e5ffca305385ce7ab6f4b9fd7388c04118d9de160712ed18";
-const PKS_HASH: &str = "57a3b7537ce19ea61a27fb10d78768198c95f4453001aae334fceb1626db9046";
+const VKS_HASH: &str = "ad161e5655f3a6abd7c40e0f41fe6d24bba461f30a0144ebb069cd2cb9498245";
+const PKS_HASH: &str = "8c493dec0106cf73f61d55f470731778cc7ff5ae106ebbc927d87f6b7dc8838d";
 
 fn pks_path(typ: &str) -> Result<PathBuf> {
     let output = Command::new("git").arg("rev-parse").arg("--show-toplevel").output()?.stdout;