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

contract/dao: Replace incrementalmerkletree with bridgetree crate.

parazyd 3 лет назад
Родитель
Сommit
326fa7e2d1

+ 3 - 2
src/contract/dao/src/dao_client/exec.rs

@@ -16,8 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use darkfi_sdk::crypto::{
-    pallas, pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, SecretKey,
+use darkfi_sdk::{
+    crypto::{pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, SecretKey},
+    pasta::pallas,
 };
 
 use halo2_proofs::circuit::Value;

+ 4 - 1
src/contract/dao/src/dao_client/mint.rs

@@ -21,7 +21,10 @@ use darkfi::{
     zkas::ZkBinary,
     Result,
 };
-use darkfi_sdk::crypto::{pallas, poseidon_hash, PublicKey, SecretKey, TokenId};
+use darkfi_sdk::{
+    crypto::{poseidon_hash, PublicKey, SecretKey, TokenId},
+    pasta::pallas,
+};
 use log::debug;
 use rand::rngs::OsRng;
 

+ 10 - 5
src/contract/dao/src/dao_client/propose.rs

@@ -16,9 +16,14 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use darkfi_sdk::crypto::{
-    merkle_prelude::*, pallas, pasta_prelude::*, pedersen::pedersen_commitment_u64, poseidon_hash,
-    MerkleNode, MerklePosition, PublicKey, SecretKey, TokenId,
+use darkfi_sdk::{
+    bridgetree,
+    bridgetree::Hashable,
+    crypto::{
+        pasta_prelude::*, pedersen::pedersen_commitment_u64, poseidon_hash, MerkleNode, PublicKey,
+        SecretKey, TokenId,
+    },
+    pasta::pallas,
 };
 use darkfi_serial::{SerialDecodable, SerialEncodable};
 use rand::rngs::OsRng;
@@ -52,7 +57,7 @@ pub struct DaoProposeNote {
 pub struct DaoProposeStakeInput {
     pub secret: SecretKey,
     pub note: darkfi_money_contract::client::MoneyNote,
-    pub leaf_position: MerklePosition,
+    pub leaf_position: bridgetree::Position,
     pub merkle_path: Vec<MerkleNode>,
     pub signature_secret: SecretKey,
 }
@@ -61,7 +66,7 @@ pub struct DaoProposeCall {
     pub inputs: Vec<DaoProposeStakeInput>,
     pub proposal: DaoProposalInfo,
     pub dao: DaoInfo,
-    pub dao_leaf_position: MerklePosition,
+    pub dao_leaf_position: bridgetree::Position,
     pub dao_merkle_path: Vec<MerkleNode>,
     pub dao_merkle_root: MerkleNode,
 }

+ 9 - 4
src/contract/dao/src/dao_client/vote.rs

@@ -16,9 +16,14 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use darkfi_sdk::crypto::{
-    merkle_prelude::*, pallas, pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, Keypair,
-    MerkleNode, MerklePosition, Nullifier, PublicKey, SecretKey,
+use darkfi_sdk::{
+    bridgetree,
+    bridgetree::Hashable,
+    crypto::{
+        pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, Keypair, MerkleNode, Nullifier,
+        PublicKey, SecretKey,
+    },
+    pasta::pallas,
 };
 use darkfi_serial::{SerialDecodable, SerialEncodable};
 use log::debug;
@@ -48,7 +53,7 @@ pub struct DaoVoteNote {
 pub struct DaoVoteInput {
     pub secret: SecretKey,
     pub note: darkfi_money_contract::client::MoneyNote,
-    pub leaf_position: MerklePosition,
+    pub leaf_position: bridgetree::Position,
     pub merkle_path: Vec<MerkleNode>,
     pub signature_secret: SecretKey,
 }

+ 2 - 1
src/contract/dao/src/dao_model.rs

@@ -17,8 +17,9 @@
  */
 
 use darkfi_sdk::{
-    crypto::{pallas, pasta_prelude::*, MerkleNode, Nullifier, PublicKey},
+    crypto::{pasta_prelude::*, MerkleNode, Nullifier, PublicKey},
     error::ContractError,
+    pasta::pallas,
 };
 use darkfi_serial::{SerialDecodable, SerialEncodable};
 

+ 2 - 1
src/contract/dao/src/entrypoint.rs

@@ -20,12 +20,13 @@ use std::io::Cursor;
 
 use darkfi_sdk::{
     crypto::{
-        pallas, pasta_prelude::*, ContractId, MerkleNode, MerkleTree, PublicKey, DAO_CONTRACT_ID,
+        pasta_prelude::*, ContractId, MerkleNode, MerkleTree, PublicKey, DAO_CONTRACT_ID,
         MONEY_CONTRACT_ID,
     },
     db::{db_contains_key, db_del, db_get, db_init, db_lookup, db_set, zkas_db_set},
     error::{ContractError, ContractResult},
     merkle_add, msg,
+    pasta::pallas,
     util::set_return_data,
     ContractCall,
 };

+ 8 - 4
src/contract/dao/src/money_client.rs

@@ -24,9 +24,13 @@ use darkfi::{
     zkas::ZkBinary,
     Result,
 };
-use darkfi_sdk::crypto::{
-    note::AeadEncryptedNote, pallas, pasta_prelude::*, MerkleNode, MerklePosition, PublicKey,
-    SecretKey, TokenId, ValueBlind,
+use darkfi_sdk::{
+    bridgetree,
+    crypto::{
+        note::AeadEncryptedNote, pasta_prelude::*, MerkleNode, PublicKey, SecretKey, TokenId,
+        ValueBlind,
+    },
+    pasta::pallas,
 };
 
 use rand::rngs::OsRng;
@@ -55,7 +59,7 @@ pub struct TransferClearInput {
 }
 
 pub struct TransferInput {
-    pub leaf_position: MerklePosition,
+    pub leaf_position: bridgetree::Position,
     pub merkle_path: Vec<MerkleNode>,
     pub secret: SecretKey,
     pub note: MoneyNote,

+ 6 - 6
src/contract/dao/src/wallet_cache.rs

@@ -16,8 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use darkfi_sdk::crypto::{
-    merkle_prelude::*, note::AeadEncryptedNote, MerkleNode, MerklePosition, MerkleTree, SecretKey,
+use darkfi_sdk::{
+    bridgetree,
+    crypto::{note::AeadEncryptedNote, MerkleNode, MerkleTree, SecretKey},
 };
 
 use darkfi_money_contract::{client::MoneyNote, model::Coin};
@@ -25,7 +26,7 @@ use darkfi_money_contract::{client::MoneyNote, model::Coin};
 pub struct OwnCoin {
     pub coin: Coin,
     pub note: MoneyNote,
-    pub leaf_position: MerklePosition,
+    pub leaf_position: bridgetree::Position,
 }
 
 pub struct WalletCache {
@@ -66,14 +67,13 @@ impl WalletCache {
 
     pub fn try_decrypt_note(&mut self, coin: Coin, ciphertext: &AeadEncryptedNote) {
         // Add the new coins to the Merkle tree
-        let node = MerkleNode::from(coin.inner());
-        self.tree.append(&node);
+        self.tree.append(MerkleNode::from(coin.inner()));
 
         // Loop through all our secret keys...
         for (secret, own_coins) in self.cache.iter_mut() {
             // .. attempt to decrypt the note ...
             if let Ok(note) = ciphertext.decrypt(secret) {
-                let leaf_position = self.tree.witness().expect("coin should be in tree");
+                let leaf_position = self.tree.mark().expect("coin should be in tree");
                 own_coins.push(OwnCoin { coin, note, leaf_position });
             }
         }

+ 11 - 16
src/contract/dao/tests/integration.rs

@@ -21,10 +21,10 @@ use std::time::{Duration, Instant};
 use darkfi::{tx::Transaction, Result};
 use darkfi_sdk::{
     crypto::{
-        merkle_prelude::*, pallas, pasta_prelude::*, pedersen_commitment_u64, poseidon_hash,
-        Keypair, MerkleNode, MerkleTree, SecretKey, TokenId, DAO_CONTRACT_ID, DARK_TOKEN_ID,
-        MONEY_CONTRACT_ID,
+        pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, Keypair, MerkleNode, MerkleTree,
+        SecretKey, TokenId, DAO_CONTRACT_ID, DARK_TOKEN_ID, MONEY_CONTRACT_ID,
     },
+    pasta::pallas,
     ContractCall,
 };
 use darkfi_serial::{Decodable, Encodable};
@@ -129,8 +129,8 @@ async fn integration_test() -> Result<()> {
     let mut dao_tree = MerkleTree::new(100);
     let dao_leaf_position = {
         let node = MerkleNode::from(params.dao_bulla.inner());
-        dao_tree.append(&node);
-        dao_tree.witness().unwrap()
+        dao_tree.append(node);
+        dao_tree.mark().unwrap()
     };
     let dao_bulla = params.dao_bulla;
     debug!(target: "dao", "Created DAO bulla: {:?}", dao_bulla.inner());
@@ -392,8 +392,7 @@ async fn integration_test() -> Result<()> {
     let (money_leaf_position, money_merkle_path) = {
         let tree = &cache.tree;
         let leaf_position = gov_recv[0].leaf_position;
-        let root = tree.root(0).unwrap();
-        let merkle_path = tree.authentication_path(leaf_position, &root).unwrap();
+        let merkle_path = tree.witness(leaf_position, 0).unwrap();
         (leaf_position, merkle_path)
     };
 
@@ -411,7 +410,7 @@ async fn integration_test() -> Result<()> {
     let (dao_merkle_path, dao_merkle_root) = {
         let tree = &dao_tree;
         let root = tree.root(0).unwrap();
-        let merkle_path = tree.authentication_path(dao_leaf_position, &root).unwrap();
+        let merkle_path = tree.witness(dao_leaf_position, 0).unwrap();
         (merkle_path, root)
     };
 
@@ -514,8 +513,7 @@ async fn integration_test() -> Result<()> {
     let (money_leaf_position, money_merkle_path) = {
         let tree = &cache.tree;
         let leaf_position = gov_recv[0].leaf_position;
-        let root = tree.root(0).unwrap();
-        let merkle_path = tree.authentication_path(leaf_position, &root).unwrap();
+        let merkle_path = tree.witness(leaf_position, 0).unwrap();
         (leaf_position, merkle_path)
     };
 
@@ -590,8 +588,7 @@ async fn integration_test() -> Result<()> {
     let (money_leaf_position, money_merkle_path) = {
         let tree = &cache.tree;
         let leaf_position = gov_recv[1].leaf_position;
-        let root = tree.root(0).unwrap();
-        let merkle_path = tree.authentication_path(leaf_position, &root).unwrap();
+        let merkle_path = tree.witness(leaf_position, 0).unwrap();
         (leaf_position, merkle_path)
     };
 
@@ -663,8 +660,7 @@ async fn integration_test() -> Result<()> {
     let (money_leaf_position, money_merkle_path) = {
         let tree = &cache.tree;
         let leaf_position = gov_recv[2].leaf_position;
-        let root = tree.root(0).unwrap();
-        let merkle_path = tree.authentication_path(leaf_position, &root).unwrap();
+        let merkle_path = tree.witness(leaf_position, 0).unwrap();
         (leaf_position, merkle_path)
     };
 
@@ -818,8 +814,7 @@ async fn integration_test() -> Result<()> {
     let (treasury_leaf_position, treasury_merkle_path) = {
         let tree = &cache.tree;
         let leaf_position = dao_recv_coin.leaf_position;
-        let root = tree.root(0).unwrap();
-        let merkle_path = tree.authentication_path(leaf_position, &root).unwrap();
+        let merkle_path = tree.witness(leaf_position, 0).unwrap();
         (leaf_position, merkle_path)
     };