Jelajahi Sumber

use note mechanism to transmit active proposal to all dao members

narodnik 4 tahun lalu
induk
melakukan
9fb4f8570e

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

@@ -18,7 +18,7 @@ use pasta_curves::{
 };
 use std::any::{Any, TypeId};
 
-use crate::money_contract::state::State as MoneyState;
+use crate::{money_contract::state::State as MoneyState, note::EncryptedNote2};
 
 const TARGET: &str = "dao_contract::propose::validate::state_transition()";
 
@@ -112,6 +112,7 @@ pub struct Header {
     pub dao_merkle_root: MerkleNode,
     pub token_commit: pallas::Base,
     pub proposal_bulla: pallas::Base,
+    pub enc_note: EncryptedNote2,
 }
 
 #[derive(Clone, SerialEncodable, SerialDecodable)]

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

@@ -29,10 +29,15 @@ use darkfi::{
 use crate::{
     dao_contract::propose::validate::{CallData, Header, Input},
     demo::{CallDataBase, FuncCall, StateRegistry, ZkContractInfo, ZkContractTable},
-    money_contract,
+    money_contract, note,
     util::poseidon_hash,
 };
 
+#[derive(SerialEncodable, SerialDecodable)]
+pub struct Note {
+    pub proposal: Proposal,
+}
+
 pub struct BuilderInput {
     pub secret: SecretKey,
     pub note: money_contract::transfer::wallet::Note,
@@ -40,6 +45,7 @@ pub struct BuilderInput {
     pub merkle_path: Vec<MerkleNode>,
 }
 
+#[derive(SerialEncodable, SerialDecodable)]
 pub struct Proposal {
     pub dest: PublicKey,
     pub amount: u64,
@@ -266,7 +272,14 @@ impl Builder {
             .expect("DAO::propose() proving error!");
         proofs.push(main_proof);
 
-        let header = Header { dao_merkle_root: self.dao_merkle_root, proposal_bulla, token_commit };
+        let note = Note { proposal: self.proposal };
+        let enc_note = note::encrypt(&note, &self.dao.public_key).unwrap();
+        let header = Header {
+            dao_merkle_root: self.dao_merkle_root,
+            proposal_bulla,
+            token_commit,
+            enc_note,
+        };
 
         let mut unsigned_tx_data = vec![];
         header.encode(&mut unsigned_tx_data).expect("failed to encode data");

+ 23 - 0
bin/daod/src/demo.rs

@@ -652,5 +652,28 @@ pub async fn demo() -> Result<()> {
 
     //// Wallet
 
+    // Read received proposal
+    let proposal = {
+        assert_eq!(tx.func_calls.len(), 1);
+        let func_call = &tx.func_calls[0];
+        let call_data = func_call.call_data.as_any();
+        assert_eq!(
+            (&*call_data).type_id(),
+            TypeId::of::<dao_contract::propose::validate::CallData>()
+        );
+        let call_data =
+            call_data.downcast_ref::<dao_contract::propose::validate::CallData>().unwrap();
+
+        let header = &call_data.header;
+        let note: dao_contract::propose::wallet::Note =
+            header.enc_note.decrypt(&dao_keypair.secret).unwrap();
+        // Return the proposal info
+        note.proposal
+    };
+    debug!(target: "demo", "Proposal now active!");
+    debug!(target: "demo", "  destination: {:?}", proposal.dest);
+    debug!(target: "demo", "  amount: {}", proposal.amount);
+    debug!(target: "demo", "  token_id: {:?}", proposal.token_id);
+
     Ok(())
 }