Răsfoiți Sursa

move daod::util::poseidon_hash() to darkfi::crypto::util + update usage in src/crypto

lunar-mining 3 ani în urmă
părinte
comite
b5cba9cb99

+ 4 - 2
bin/daod/src/dao_contract/exec/wallet.rs

@@ -5,7 +5,10 @@ use halo2_proofs::circuit::Value;
 use pasta_curves::{arithmetic::CurveAffine, group::Curve, pallas};
 
 use darkfi::{
-    crypto::{util::pedersen_commitment_u64, Proof},
+    crypto::{
+        util::{pedersen_commitment_u64, poseidon_hash},
+        Proof,
+    },
     zk::vm::{Witness, ZkCircuit},
 };
 
@@ -15,7 +18,6 @@ use crate::{
         propose::wallet::{DaoParams, Proposal},
     },
     demo::{FuncCall, ZkContractInfo, ZkContractTable},
-    util::poseidon_hash,
 };
 
 pub struct Builder {

+ 1 - 2
bin/daod/src/dao_contract/mint/wallet.rs

@@ -1,7 +1,7 @@
 use crate::dao_contract::state::DaoBulla;
 
 use darkfi::{
-    crypto::{keypair::PublicKey, Proof},
+    crypto::{keypair::PublicKey, util::poseidon_hash, Proof},
     zk::vm::{Witness, ZkCircuit},
 };
 use halo2_proofs::circuit::Value;
@@ -11,7 +11,6 @@ use rand::rngs::OsRng;
 use crate::{
     dao_contract::mint::validate::CallData,
     demo::{FuncCall, ZkContractInfo, ZkContractTable},
-    util::poseidon_hash,
 };
 
 pub struct Builder {

+ 1 - 2
bin/daod/src/dao_contract/propose/wallet.rs

@@ -12,7 +12,7 @@ use darkfi::{
         keypair::{PublicKey, SecretKey},
         merkle_node::MerkleNode,
         schnorr::SchnorrSecret,
-        util::pedersen_commitment_u64,
+        util::{pedersen_commitment_u64, poseidon_hash},
         Proof,
     },
     util::serial::{Encodable, SerialDecodable, SerialEncodable},
@@ -23,7 +23,6 @@ use crate::{
     dao_contract::propose::validate::{CallData, Header, Input},
     demo::{FuncCall, ZkContractInfo, ZkContractTable},
     money_contract, note,
-    util::poseidon_hash,
 };
 
 use log::debug;

+ 1 - 2
bin/daod/src/dao_contract/vote/wallet.rs

@@ -4,7 +4,7 @@ use darkfi::{
         merkle_node::MerkleNode,
         nullifier::Nullifier,
         schnorr::SchnorrSecret,
-        util::pedersen_commitment_u64,
+        util::{pedersen_commitment_u64, poseidon_hash},
         Proof,
     },
     util::serial::{Encodable, SerialDecodable, SerialEncodable},
@@ -26,7 +26,6 @@ use crate::{
     },
     demo::{FuncCall, ZkContractInfo, ZkContractTable},
     money_contract, note,
-    util::poseidon_hash,
 };
 
 use log::debug;

+ 2 - 2
bin/daod/src/demo.rs

@@ -17,7 +17,7 @@ use darkfi::{
         keypair::{Keypair, PublicKey, SecretKey},
         proof::{ProvingKey, VerifyingKey},
         types::{DrkCircuitField, DrkSpendHook, DrkUserData, DrkValue},
-        util::pedersen_commitment_u64,
+        util::{pedersen_commitment_u64, poseidon_hash},
         Proof,
     },
     zk::{
@@ -28,7 +28,7 @@ use darkfi::{
     zkas::decoder::ZkBinary,
 };
 
-use crate::{dao_contract, example_contract, money_contract, util::poseidon_hash};
+use crate::{dao_contract, example_contract, money_contract};
 
 // TODO: Anonymity leaks in this proof of concept:
 //

+ 0 - 1
bin/daod/src/main.rs

@@ -20,7 +20,6 @@ mod money_contract;
 
 mod demo;
 mod note;
-mod util;
 
 use crate::demo::demo;
 

+ 0 - 7
bin/daod/src/util.rs

@@ -1,7 +0,0 @@
-use halo2_gadgets::poseidon::primitives as poseidon;
-use pasta_curves::pallas;
-
-pub fn poseidon_hash<const N: usize>(messages: [pallas::Base; N]) -> pallas::Base {
-    poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<N>, 3, 2>::init()
-        .hash(messages)
-}

+ 6 - 17
src/crypto/burn_proof.rs

@@ -1,11 +1,9 @@
-use std::time::Instant;
-
-use halo2_gadgets::poseidon::primitives as poseidon;
 use halo2_proofs::circuit::Value;
 use incrementalmerkletree::Hashable;
 use log::debug;
 use pasta_curves::{arithmetic::CurveAffine, group::Curve};
 use rand::rngs::OsRng;
+use std::time::Instant;
 
 use super::{
     nullifier::Nullifier,
@@ -20,6 +18,7 @@ use crate::{
             DrkCircuitField, DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData,
             DrkUserDataBlind, DrkUserDataEnc, DrkValue, DrkValueBlind, DrkValueCommit,
         },
+        util::poseidon_hash,
     },
     util::serial::{SerialDecodable, SerialEncodable},
     zk::circuit::burn_contract::BurnContract,
@@ -54,15 +53,12 @@ impl BurnRevealedValues {
         user_data_blind: DrkUserDataBlind,
         signature_secret: SecretKey,
     ) -> Self {
-        let nullifier = [secret.0, serial];
-        let nullifier =
-            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<2>, 3, 2>::init()
-                .hash(nullifier);
+        let nullifier = poseidon_hash::<2>([secret.0, serial]);
 
         let public_key = PublicKey::from_secret(secret);
         let coords = public_key.0.to_affine().coordinates().unwrap();
 
-        let messages = [
+        let coin = poseidon_hash::<8>([
             *coords.x(),
             *coords.y(),
             DrkValue::from(value),
@@ -71,11 +67,7 @@ impl BurnRevealedValues {
             spend_hook,
             user_data,
             coin_blind,
-        ];
-
-        let coin =
-            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<8>, 3, 2>::init()
-                .hash(messages);
+        ]);
 
         let merkle_root = {
             let position: u64 = leaf_position.into();
@@ -91,10 +83,7 @@ impl BurnRevealedValues {
             current
         };
 
-        let messages = [user_data, user_data_blind];
-        let user_data_enc =
-            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<2>, 3, 2>::init()
-                .hash(messages);
+        let user_data_enc = poseidon_hash::<2>([user_data, user_data_blind]);
 
         let value_commit = pedersen_commitment_u64(value, value_blind);
         let token_commit = pedersen_commitment_base(token_id, token_blind);

+ 4 - 8
src/crypto/mint_proof.rs

@@ -1,6 +1,5 @@
 use std::time::Instant;
 
-use halo2_gadgets::poseidon::primitives as poseidon;
 use halo2_proofs::circuit::Value;
 use log::debug;
 use pasta_curves::{arithmetic::CurveAffine, group::Curve};
@@ -15,7 +14,7 @@ use crate::{
             DrkCircuitField, DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData,
             DrkValue, DrkValueBlind, DrkValueCommit,
         },
-        util::{pedersen_commitment_base, pedersen_commitment_u64},
+        util::{pedersen_commitment_base, pedersen_commitment_u64, poseidon_hash},
     },
     util::serial::{SerialDecodable, SerialEncodable},
     zk::circuit::mint_contract::MintContract,
@@ -46,7 +45,8 @@ impl MintRevealedValues {
         let token_commit = pedersen_commitment_base(token_id, token_blind);
 
         let coords = public_key.0.to_affine().coordinates().unwrap();
-        let messages = [
+
+        let coin = poseidon_hash::<8>([
             *coords.x(),
             *coords.y(),
             DrkValue::from(value),
@@ -55,11 +55,7 @@ impl MintRevealedValues {
             spend_hook,
             user_data,
             coin_blind,
-        ];
-
-        let coin =
-            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<8>, 3, 2>::init()
-                .hash(messages);
+        ]);
 
         MintRevealedValues { value_commit, token_commit, coin: Coin(coin) }
     }

+ 2 - 6
src/crypto/nullifier.rs

@@ -1,10 +1,9 @@
 use std::io;
 
-use halo2_gadgets::poseidon::primitives as poseidon;
 use pasta_curves::{group::ff::PrimeField, pallas};
 
 use crate::{
-    crypto::keypair::SecretKey,
+    crypto::{keypair::SecretKey, util::poseidon_hash},
     util::serial::{Decodable, Encodable, ReadExt, WriteExt},
     Result,
 };
@@ -14,10 +13,7 @@ pub struct Nullifier(pub pallas::Base);
 
 impl Nullifier {
     pub fn new(secret: SecretKey, serial: pallas::Base) -> Self {
-        let nullifier = [secret.0, serial];
-        let nullifier =
-            poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<2>, 3, 2>::init()
-                .hash(nullifier);
+        let nullifier = poseidon_hash::<2>([secret.0, serial]);
         Nullifier(nullifier)
     }
 

+ 7 - 1
src/crypto/util.rs

@@ -1,5 +1,5 @@
 use blake2b_simd::Params;
-use halo2_gadgets::ecc::chip::FixedPoint;
+use halo2_gadgets::{ecc::chip::FixedPoint, poseidon::primitives as poseidon};
 use pasta_curves::{
     arithmetic::{CurveExt, FieldExt},
     group::ff::PrimeField,
@@ -45,6 +45,12 @@ pub fn pedersen_commitment_u64(value: u64, blind: DrkValueBlind) -> DrkValueComm
     V * mod_r_p(DrkValue::from(value)) + R * blind
 }
 
+/// Simplified wrapper for poseidon hash function.
+pub fn poseidon_hash<const N: usize>(messages: [pallas::Base; N]) -> pallas::Base {
+    poseidon::Hash::<_, poseidon::P128Pow5T3, poseidon::ConstantLength<N>, 3, 2>::init()
+        .hash(messages)
+}
+
 /// Converts from pallas::Base to pallas::Scalar (aka $x \pmod{r_\mathbb{P}}$).
 ///
 /// This requires no modular reduction because Pallas' base field is smaller than its