From 326fa7e2d1d148981ab4991572b284bec1539749 Mon Sep 17 00:00:00 2001 From: parazyd Date: Wed, 19 Apr 2023 19:36:49 +0200 Subject: [PATCH] contract/dao: Replace incrementalmerkletree with bridgetree crate. --- src/contract/dao/src/dao_client/exec.rs | 5 ++-- src/contract/dao/src/dao_client/mint.rs | 5 +++- src/contract/dao/src/dao_client/propose.rs | 15 ++++++++---- src/contract/dao/src/dao_client/vote.rs | 13 +++++++---- src/contract/dao/src/dao_model.rs | 3 ++- src/contract/dao/src/entrypoint.rs | 3 ++- src/contract/dao/src/money_client.rs | 12 ++++++---- src/contract/dao/src/wallet_cache.rs | 12 +++++----- src/contract/dao/tests/integration.rs | 27 +++++++++------------- 9 files changed, 55 insertions(+), 40 deletions(-) diff --git a/src/contract/dao/src/dao_client/exec.rs b/src/contract/dao/src/dao_client/exec.rs index 2ebacded4..db7b483ce 100644 --- a/src/contract/dao/src/dao_client/exec.rs +++ b/src/contract/dao/src/dao_client/exec.rs @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -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; diff --git a/src/contract/dao/src/dao_client/mint.rs b/src/contract/dao/src/dao_client/mint.rs index fb9731036..9f95b8e4f 100644 --- a/src/contract/dao/src/dao_client/mint.rs +++ b/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; diff --git a/src/contract/dao/src/dao_client/propose.rs b/src/contract/dao/src/dao_client/propose.rs index 463fbf1b8..565c87bec 100644 --- a/src/contract/dao/src/dao_client/propose.rs +++ b/src/contract/dao/src/dao_client/propose.rs @@ -16,9 +16,14 @@ * along with this program. If not, see . */ -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, pub signature_secret: SecretKey, } @@ -61,7 +66,7 @@ pub struct DaoProposeCall { pub inputs: Vec, pub proposal: DaoProposalInfo, pub dao: DaoInfo, - pub dao_leaf_position: MerklePosition, + pub dao_leaf_position: bridgetree::Position, pub dao_merkle_path: Vec, pub dao_merkle_root: MerkleNode, } diff --git a/src/contract/dao/src/dao_client/vote.rs b/src/contract/dao/src/dao_client/vote.rs index dfe2fe90f..303514d95 100644 --- a/src/contract/dao/src/dao_client/vote.rs +++ b/src/contract/dao/src/dao_client/vote.rs @@ -16,9 +16,14 @@ * along with this program. If not, see . */ -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, pub signature_secret: SecretKey, } diff --git a/src/contract/dao/src/dao_model.rs b/src/contract/dao/src/dao_model.rs index b984fde7b..28fe83ea8 100644 --- a/src/contract/dao/src/dao_model.rs +++ b/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}; diff --git a/src/contract/dao/src/entrypoint.rs b/src/contract/dao/src/entrypoint.rs index 81c44d92e..2974e703f 100644 --- a/src/contract/dao/src/entrypoint.rs +++ b/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, }; diff --git a/src/contract/dao/src/money_client.rs b/src/contract/dao/src/money_client.rs index 20a26b322..6c0d209fc 100644 --- a/src/contract/dao/src/money_client.rs +++ b/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, pub secret: SecretKey, pub note: MoneyNote, diff --git a/src/contract/dao/src/wallet_cache.rs b/src/contract/dao/src/wallet_cache.rs index f4807d8a9..bf7d730a9 100644 --- a/src/contract/dao/src/wallet_cache.rs +++ b/src/contract/dao/src/wallet_cache.rs @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -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 }); } } diff --git a/src/contract/dao/tests/integration.rs b/src/contract/dao/tests/integration.rs index eae82e24f..bf986b7a9 100644 --- a/src/contract/dao/tests/integration.rs +++ b/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) };