Parcourir la source

darkfi: add spend_hook and user_data to create_mint/burn_proof()

narodnik il y a 4 ans
Parent
commit
0d9da87d4f

+ 18 - 1
bin/daod/src/money_contract/transfer/builder.rs

@@ -10,7 +10,10 @@ use darkfi::{
         note::Note,
         proof::ProvingKey,
         schnorr::SchnorrSecret,
-        types::{DrkCoinBlind, DrkSerial, DrkTokenId, DrkValueBlind},
+        types::{
+            DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData, DrkUserDataBlind,
+            DrkValueBlind,
+        },
     },
     util::serial::Encodable,
     Result,
@@ -109,6 +112,11 @@ impl Builder {
             };
             let burn_pk = &zk_info.proving_key;
 
+            // TODO: this is disabled for now. We need to enable this.
+            let spend_hook = DrkSpendHook::from(0);
+            let user_data = DrkUserData::from(0);
+            let user_data_blind = DrkUserDataBlind::random(&mut OsRng);
+
             let (burn_proof, revealed) = create_burn_proof(
                 burn_pk,
                 input.note.value,
@@ -116,6 +124,9 @@ impl Builder {
                 value_blind,
                 token_blind,
                 input.note.serial,
+                spend_hook,
+                user_data,
+                user_data_blind,
                 input.note.coin_blind,
                 input.secret,
                 input.leaf_position,
@@ -155,6 +166,10 @@ impl Builder {
             };
             let mint_pk = &zk_info.proving_key;
 
+            // TODO: this is disabled for now. We need to enable this.
+            let spend_hook = DrkSpendHook::from(0);
+            let user_data = DrkUserData::from(0);
+
             let (mint_proof, revealed) = create_mint_proof(
                 mint_pk,
                 output.value,
@@ -162,6 +177,8 @@ impl Builder {
                 value_blind,
                 token_blind,
                 serial,
+                spend_hook,
+                user_data,
                 coin_blind,
                 output.public,
             )?;

+ 18 - 1
bin/darkotc/src/main.rs

@@ -19,7 +19,10 @@ use darkfi::{
         schnorr,
         schnorr::SchnorrSecret,
         token_id,
-        types::{DrkCoinBlind, DrkSerial, DrkTokenId, DrkValueBlind},
+        types::{
+            DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData, DrkUserDataBlind,
+            DrkValueBlind,
+        },
         util::{pedersen_commitment_base, pedersen_commitment_u64},
         BurnRevealedValues, MintRevealedValues, Proof,
     },
@@ -186,6 +189,10 @@ async fn init_swap(
     let recv_coin_blind = DrkCoinBlind::random(&mut OsRng);
     let recv_serial = DrkSerial::random(&mut OsRng);
 
+    // Spend hook and user data disabled
+    let spend_hook = DrkSpendHook::from(0);
+    let user_data = DrkUserData::from(0);
+
     let pb = progress_bar("Building Mint proof for the receiving coin");
     let (mint_proof, mint_revealed) = create_mint_proof(
         &mint_pk,
@@ -194,6 +201,8 @@ async fn init_swap(
         recv_value_blind,
         recv_token_blind,
         recv_serial,
+        spend_hook,
+        user_data,
         recv_coin_blind,
         our_pubk,
     )?;
@@ -212,6 +221,11 @@ async fn init_swap(
         }
     };
 
+    // Spend hook and user data disabled
+    let spend_hook = DrkSpendHook::from(0);
+    let user_data = DrkUserData::from(0);
+    let user_data_blind = DrkUserDataBlind::random(&mut OsRng);
+
     let (burn_proof, burn_revealed) = create_burn_proof(
         &burn_pk,
         vp.0,
@@ -219,6 +233,9 @@ async fn init_swap(
         coin.note.value_blind,
         coin.note.token_blind,
         coin.note.serial,
+        spend_hook,
+        user_data,
+        user_data_blind,
         coin.note.coin_blind,
         coin.secret,
         coin.leaf_position,

+ 23 - 1
src/crypto/burn_proof.rs

@@ -16,7 +16,10 @@ use crate::{
     crypto::{
         keypair::{PublicKey, SecretKey},
         merkle_node::MerkleNode,
-        types::*,
+        types::{
+            DrkCircuitField, DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData,
+            DrkUserDataBlind, DrkUserDataEnc, DrkValue, DrkValueBlind, DrkValueCommit,
+        },
     },
     util::serial::{SerialDecodable, SerialEncodable},
     zk::circuit::burn_contract::BurnContract,
@@ -29,6 +32,8 @@ pub struct BurnRevealedValues {
     pub token_commit: DrkValueCommit,
     pub nullifier: Nullifier,
     pub merkle_root: MerkleNode,
+    pub spend_hook: DrkSpendHook,
+    pub user_data_enc: DrkUserDataEnc,
     pub signature_public: PublicKey,
 }
 
@@ -44,6 +49,9 @@ impl BurnRevealedValues {
         secret: SecretKey,
         leaf_position: incrementalmerkletree::Position,
         merkle_path: Vec<MerkleNode>,
+        spend_hook: DrkSpendHook,
+        user_data: DrkUserData,
+        user_data_blind: DrkUserDataBlind,
         signature_secret: SecretKey,
     ) -> Self {
         let nullifier = [secret.0, serial];
@@ -75,6 +83,11 @@ 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 value_commit = pedersen_commitment_u64(value, value_blind);
         let token_commit = pedersen_commitment_base(token_id, token_blind);
 
@@ -83,6 +96,8 @@ impl BurnRevealedValues {
             token_commit,
             nullifier: Nullifier(nullifier),
             merkle_root,
+            spend_hook,
+            user_data_enc,
             signature_public: PublicKey::from_secret(signature_secret),
         }
     }
@@ -91,6 +106,7 @@ impl BurnRevealedValues {
         let value_coords = self.value_commit.to_affine().coordinates().unwrap();
         let token_coords = self.token_commit.to_affine().coordinates().unwrap();
         let merkle_root = self.merkle_root.0;
+        let user_data_enc = self.user_data_enc;
         let sig_coords = self.signature_public.0.to_affine().coordinates().unwrap();
 
         vec![
@@ -116,6 +132,9 @@ pub fn create_burn_proof(
     value_blind: DrkValueBlind,
     token_blind: DrkValueBlind,
     serial: DrkSerial,
+    spend_hook: DrkSpendHook,
+    user_data: DrkUserData,
+    user_data_blind: DrkUserDataBlind,
     coin_blind: DrkCoinBlind,
     secret: SecretKey,
     leaf_position: incrementalmerkletree::Position,
@@ -132,6 +151,9 @@ pub fn create_burn_proof(
         secret,
         leaf_position,
         merkle_path.clone(),
+        spend_hook,
+        user_data,
+        user_data_blind,
         signature_secret,
     );
 

+ 4 - 2
src/crypto/mint_proof.rs

@@ -12,8 +12,8 @@ use crate::{
         keypair::PublicKey,
         proof::{Proof, ProvingKey, VerifyingKey},
         types::{
-            DrkCircuitField, DrkCoinBlind, DrkSerial, DrkTokenId, DrkValue, DrkValueBlind,
-            DrkValueCommit,
+            DrkCircuitField, DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData,
+            DrkValue, DrkValueBlind, DrkValueCommit,
         },
         util::{pedersen_commitment_base, pedersen_commitment_u64},
     },
@@ -77,6 +77,8 @@ pub fn create_mint_proof(
     value_blind: DrkValueBlind,
     token_blind: DrkValueBlind,
     serial: DrkSerial,
+    spend_hook: DrkSpendHook,
+    user_data: DrkUserData,
     coin_blind: DrkCoinBlind,
     public_key: PublicKey,
 ) -> Result<(Proof, MintRevealedValues)> {

+ 7 - 1
src/crypto/proof.rs

@@ -119,7 +119,9 @@ mod tests {
         crypto::{
             keypair::PublicKey,
             mint_proof::create_mint_proof,
-            types::{DrkCoinBlind, DrkSerial, DrkTokenId, DrkValueBlind},
+            types::{
+                DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData, DrkValueBlind,
+            },
         },
         zk::circuit::MintContract,
     };
@@ -133,6 +135,8 @@ mod tests {
         let value_blind = DrkValueBlind::random(&mut OsRng);
         let token_blind = DrkValueBlind::random(&mut OsRng);
         let serial = DrkSerial::random(&mut OsRng);
+        let spend_hook = DrkSpendHook::random(&mut OsRng);
+        let user_data = DrkUserData::random(&mut OsRng);
         let coin_blind = DrkCoinBlind::random(&mut OsRng);
         let public_key = PublicKey::random(&mut OsRng);
 
@@ -144,6 +148,8 @@ mod tests {
             value_blind,
             token_blind,
             serial,
+            spend_hook,
+            user_data,
             coin_blind,
             public_key,
         )?;

+ 5 - 0
src/crypto/types.rs

@@ -8,6 +8,11 @@ pub type DrkTokenId = pallas::Base;
 pub type DrkValue = pallas::Base;
 pub type DrkSerial = pallas::Base;
 
+pub type DrkSpendHook = pallas::Base;
+pub type DrkUserData = pallas::Base;
+pub type DrkUserDataBlind = pallas::Base;
+pub type DrkUserDataEnc = pallas::Base;
+
 pub type DrkCoinBlind = pallas::Base;
 pub type DrkValueBlind = pallas::Scalar;
 pub type DrkValueCommit = pallas::Point;

+ 18 - 1
src/tx/builder.rs

@@ -14,7 +14,10 @@ use crate::{
         note::Note,
         proof::ProvingKey,
         schnorr::SchnorrSecret,
-        types::{DrkCoinBlind, DrkSerial, DrkTokenId, DrkValueBlind},
+        types::{
+            DrkCoinBlind, DrkSerial, DrkSpendHook, DrkTokenId, DrkUserData, DrkUserDataBlind,
+            DrkValueBlind,
+        },
     },
     util::serial::Encodable,
     Result,
@@ -96,6 +99,11 @@ impl TransactionBuilder {
 
             let signature_secret = SecretKey::random(&mut OsRng);
 
+            // Disable composability for this old obselete API
+            let spend_hook = DrkSpendHook::from(0);
+            let user_data = DrkUserData::from(0);
+            let user_data_blind = DrkUserDataBlind::random(&mut OsRng);
+
             let (proof, revealed) = create_burn_proof(
                 burn_pk,
                 input.note.value,
@@ -103,6 +111,9 @@ impl TransactionBuilder {
                 value_blind,
                 token_blind,
                 input.note.serial,
+                spend_hook,
+                user_data,
+                user_data_blind,
                 input.note.coin_blind,
                 input.secret,
                 input.leaf_position,
@@ -133,6 +144,10 @@ impl TransactionBuilder {
             let serial = DrkSerial::random(&mut OsRng);
             let coin_blind = DrkCoinBlind::random(&mut OsRng);
 
+            // Disable composability for this old obselete API
+            let spend_hook = DrkSpendHook::from(0);
+            let user_data = DrkUserData::from(0);
+
             let (mint_proof, revealed) = create_mint_proof(
                 mint_pk,
                 output.value,
@@ -140,6 +155,8 @@ impl TransactionBuilder {
                 value_blind,
                 token_blind,
                 serial,
+                spend_hook,
+                user_data,
                 coin_blind,
                 output.public,
             )?;