Преглед изворни кода

contract/consensus: Replace incrementalmerkletree with bridgetree crate.

parazyd пре 3 година
родитељ
комит
afa34c59b1

+ 2 - 3
src/consensus/block.rs

@@ -19,8 +19,7 @@
 use std::fmt;
 
 use darkfi_sdk::{
-    crypto::{constants::MERKLE_DEPTH, MerkleNode},
-    incrementalmerkletree::{bridgetree::BridgeTree, Tree},
+    crypto::{MerkleNode, MerkleTree},
     pasta::pallas,
 };
 use darkfi_serial::{serialize, SerialDecodable, SerialEncodable};
@@ -62,7 +61,7 @@ impl Header {
 
     /// Generate the genesis block.
     pub fn genesis_header(genesis_ts: Timestamp, genesis_data: blake3::Hash) -> Self {
-        let tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(100);
+        let tree = MerkleTree::new(100);
         let root = tree.root(0).unwrap();
 
         Self::new(genesis_data, 0, 0, genesis_ts, root)

+ 16 - 19
src/consensus/lead_coin.rs

@@ -21,9 +21,8 @@ use darkfi_sdk::{
         pedersen::{pedersen_commitment_base, pedersen_commitment_u64},
         poseidon_hash,
         util::mod_r_p,
-        MerkleNode, SecretKey,
+        MerkleNode, MerkleTree, SecretKey,
     },
-    incrementalmerkletree::{bridgetree::BridgeTree, Tree},
     pasta::{arithmetic::CurveAffine, group::Curve, pallas},
 };
 use darkfi_serial::{SerialDecodable, SerialEncodable};
@@ -109,7 +108,7 @@ impl LeadCoin {
         // coin1 nonce
         seed: pallas::Base,
         // Merkle tree of coin commitments
-        coin_commitment_tree: &mut BridgeTree<MerkleNode, MERKLE_DEPTH>,
+        coin_commitment_tree: &mut MerkleTree,
     ) -> Self {
         // Generate random blinding values for commitments:
         let coin1_blind = pallas::Scalar::random(&mut OsRng);
@@ -122,12 +121,11 @@ impl LeadCoin {
         let c1_base_msg = [*c1_cm_coords.x(), *c1_cm_coords.y()];
         let coin1_commitment_base = poseidon_hash(c1_base_msg);
         // Append the element to the Merkle tree
-        coin_commitment_tree.append(&MerkleNode::from(coin1_commitment_base));
-        let coin1_commitment_pos = coin_commitment_tree.witness().unwrap();
+        coin_commitment_tree.append(MerkleNode::from(coin1_commitment_base));
+        let coin1_commitment_pos = coin_commitment_tree.mark().unwrap();
         let coin1_commitment_root = coin_commitment_tree.root(0).unwrap();
-        let coin1_commitment_merkle_path = coin_commitment_tree
-            .authentication_path(coin1_commitment_pos, &coin1_commitment_root)
-            .unwrap();
+        let coin1_commitment_merkle_path =
+            coin_commitment_tree.witness(coin1_commitment_pos, 0).unwrap();
 
         Self {
             value,
@@ -135,7 +133,7 @@ impl LeadCoin {
             nonce: seed,
             coin1_commitment,
             coin1_commitment_root,
-            coin1_commitment_pos: u32::try_from(usize::from(coin1_commitment_pos)).unwrap(),
+            coin1_commitment_pos: u32::try_from(u64::from(coin1_commitment_pos)).unwrap(),
             coin1_commitment_merkle_path,
             coin1_sk,
             coin1_sk_root,
@@ -299,7 +297,7 @@ impl LeadCoin {
     /// in lottery.
     pub fn derive_coin(
         &self,
-        coin_commitment_tree: &mut BridgeTree<MerkleNode, MERKLE_DEPTH>,
+        coin_commitment_tree: &mut MerkleTree,
         derived_blind: pallas::Scalar,
     ) -> LeadCoin {
         info!(target: "consensus::leadcoin", "derive_coin(): Deriving new coin!");
@@ -308,18 +306,17 @@ impl LeadCoin {
         let derived_c1_cm_coord = derived_c1_cm.to_affine().coordinates().unwrap();
         let derived_c1_cm_msg = [*derived_c1_cm_coord.x(), *derived_c1_cm_coord.y()];
         let derived_c1_cm_base = poseidon_hash(derived_c1_cm_msg);
-        coin_commitment_tree.append(&MerkleNode::from(derived_c1_cm_base));
-        let leaf_pos = coin_commitment_tree.witness().unwrap();
+        coin_commitment_tree.append(MerkleNode::from(derived_c1_cm_base));
+        let leaf_pos = coin_commitment_tree.mark().unwrap();
         let commitment_root = coin_commitment_tree.root(0).unwrap();
-        let commitment_merkle_path =
-            coin_commitment_tree.authentication_path(leaf_pos, &commitment_root).unwrap();
+        let commitment_merkle_path = coin_commitment_tree.witness(leaf_pos, 0).unwrap();
         LeadCoin {
             value: self.value + constants::REWARD,
             slot: self.slot,
             nonce: derived_c1_rho,
             coin1_commitment: derived_c1_cm,
             coin1_commitment_root: commitment_root,
-            coin1_commitment_pos: u32::try_from(usize::from(leaf_pos)).unwrap(),
+            coin1_commitment_pos: u32::try_from(u64::from(leaf_pos)).unwrap(),
             coin1_commitment_merkle_path: commitment_merkle_path,
             coin1_sk: self.coin1_sk,
             coin1_sk_root: self.coin1_sk_root,
@@ -476,7 +473,7 @@ impl LeadCoinSecrets {
     /// sk[n] -> derive_function(sk[n-1]),
     /// ```
     pub fn generate() -> Self {
-        let mut tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(EPOCH_LENGTH);
+        let mut tree = MerkleTree::new(EPOCH_LENGTH);
         let mut sks = Vec::with_capacity(EPOCH_LENGTH);
         let mut root_sks = Vec::with_capacity(EPOCH_LENGTH);
         let mut path_sks = Vec::with_capacity(EPOCH_LENGTH);
@@ -498,10 +495,10 @@ impl LeadCoinSecrets {
             prev_sk = secret_key;
 
             let node = MerkleNode::from(secret_key.inner());
-            tree.append(&node);
-            let leaf_pos = tree.witness().unwrap();
+            tree.append(node);
+            let leaf_pos = tree.mark().unwrap();
             let root = tree.root(0).unwrap();
-            let path = tree.authentication_path(leaf_pos, &root).unwrap();
+            let path = tree.witness(leaf_pos, 0).unwrap();
 
             root_sks.push(root);
             path_sks.push(path);

+ 6 - 7
src/consensus/state.rs

@@ -17,8 +17,7 @@
  */
 
 use darkfi_sdk::{
-    crypto::{constants::MERKLE_DEPTH, pasta_prelude::*, MerkleNode},
-    incrementalmerkletree::bridgetree::BridgeTree,
+    crypto::{pasta_prelude::*, MerkleTree},
     pasta::{group::ff::PrimeField, pallas},
 };
 use darkfi_serial::{deserialize, serialize, SerialDecodable, SerialEncodable};
@@ -86,7 +85,7 @@ pub struct ConsensusState {
     /// Canonical competing coins
     pub coins: Vec<LeadCoin>,
     /// Canonical coin commitments tree
-    pub coins_tree: BridgeTree<MerkleNode, MERKLE_DEPTH>,
+    pub coins_tree: MerkleTree,
     /// Canonical seen nullifiers from proposals
     pub nullifiers: Vec<pallas::Base>,
 }
@@ -123,7 +122,7 @@ impl ConsensusState {
             f_history: vec![constants::FLOAT10_ZERO.clone()],
             err_history: vec![constants::FLOAT10_ZERO.clone(), constants::FLOAT10_ZERO.clone()],
             coins: vec![],
-            coins_tree: BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(constants::EPOCH_LENGTH * 100),
+            coins_tree: MerkleTree::new(constants::EPOCH_LENGTH * 100),
             nullifiers: vec![],
         }
     }
@@ -782,7 +781,7 @@ pub struct StateCheckpoint {
     /// Node competing coins current state
     pub coins: Vec<LeadCoin>,
     /// Coin commitments tree current state
-    pub coins_tree: BridgeTree<MerkleNode, MERKLE_DEPTH>,
+    pub coins_tree: MerkleTree,
     /// Seen nullifiers from proposals current state
     pub nullifiers: Vec<pallas::Base>,
 }
@@ -791,7 +790,7 @@ impl StateCheckpoint {
     pub fn new(
         proposal: BlockProposal,
         coins: Vec<LeadCoin>,
-        coins_tree: BridgeTree<MerkleNode, MERKLE_DEPTH>,
+        coins_tree: MerkleTree,
         nullifiers: Vec<pallas::Base>,
     ) -> Self {
         Self { proposal, coins, coins_tree, nullifiers }
@@ -818,7 +817,7 @@ impl From<StateCheckpointInfo> for StateCheckpoint {
         Self {
             proposal: state_checkpoint_info.proposal,
             coins: vec![],
-            coins_tree: BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(constants::EPOCH_LENGTH * 100),
+            coins_tree: MerkleTree::new(constants::EPOCH_LENGTH * 100),
             nullifiers: state_checkpoint_info.nullifiers,
         }
     }

+ 3 - 5
src/consensus/validator.rs

@@ -21,12 +21,10 @@ use std::{collections::HashMap, io::Cursor};
 use async_std::sync::{Arc, RwLock};
 use darkfi_sdk::{
     crypto::{
-        constants::MERKLE_DEPTH,
         contract_id::{CONSENSUS_CONTRACT_ID, DAO_CONTRACT_ID, MONEY_CONTRACT_ID},
         schnorr::{SchnorrPublic, SchnorrSecret},
-        MerkleNode, PublicKey, SecretKey,
+        MerkleNode, MerkleTree, PublicKey, SecretKey,
     },
-    incrementalmerkletree::{bridgetree::BridgeTree, Tree},
     pasta::{group::ff::PrimeField, pallas},
 };
 use darkfi_serial::{serialize, Decodable, Encodable, WriteExt};
@@ -381,12 +379,12 @@ impl ValidatorState {
         if !erroneous_txs.is_empty() {
             unproposed_txs.retain(|x| !erroneous_txs.contains(x));
         }
-        let mut tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(100);
+        let mut tree = MerkleTree::new(100);
         // The following is pretty weird, so something better should be done.
         for tx in &unproposed_txs {
             let mut hash = [0_u8; 32];
             hash[0..31].copy_from_slice(&blake3::hash(&serialize(tx)).as_bytes()[0..31]);
-            tree.append(&MerkleNode::from(pallas::Base::from_repr(hash).unwrap()));
+            tree.append(MerkleNode::from(pallas::Base::from_repr(hash).unwrap()));
         }
         let root = tree.root(0).unwrap();
 

+ 5 - 3
src/contract/consensus/src/client/common.rs

@@ -25,9 +25,11 @@ use darkfi::{
 };
 use darkfi_money_contract::{client::ConsensusNote, model::Coin};
 use darkfi_sdk::{
+    bridgetree,
+    bridgetree::Hashable,
     crypto::{
-        pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, MerkleNode, MerklePosition,
-        Nullifier, PublicKey, SecretKey,
+        pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, MerkleNode, Nullifier, PublicKey,
+        SecretKey,
     },
     pasta::pallas,
 };
@@ -43,7 +45,7 @@ pub struct ConsensusMintOutputInfo {
 }
 
 pub struct ConsensusBurnInputInfo {
-    pub leaf_position: MerklePosition,
+    pub leaf_position: bridgetree::Position,
     pub merkle_path: Vec<MerkleNode>,
     pub secret: SecretKey,
     pub note: ConsensusNote,

+ 2 - 3
src/contract/consensus/src/client/proposal_v1.rs

@@ -29,6 +29,7 @@ use darkfi_money_contract::{
     model::{Coin, ConsensusInput, ConsensusOutput},
 };
 use darkfi_sdk::{
+    bridgetree::Hashable,
     crypto::{
         ecvrf::VrfProof, note::AeadEncryptedNote, pasta_prelude::*, pedersen_commitment_u64,
         poseidon_hash, Keypair, MerkleNode, MerkleTree, Nullifier, PublicKey, SecretKey,
@@ -131,9 +132,7 @@ impl ConsensusProposalCallBuilder {
         assert!(self.owncoin.note.value != 0);
 
         debug!("Building Consensus::ProposalV1 anonymous input");
-        let root = self.merkle_tree.root(0).unwrap();
-        let merkle_path =
-            self.merkle_tree.authentication_path(self.owncoin.leaf_position, &root).unwrap();
+        let merkle_path = self.merkle_tree.witness(self.owncoin.leaf_position, 0).unwrap();
 
         let input = ConsensusBurnInputInfo {
             leaf_position: self.owncoin.leaf_position,

+ 1 - 2
src/contract/consensus/src/client/unstake_request_v1.rs

@@ -74,8 +74,7 @@ impl ConsensusUnstakeRequestCallBuilder {
         assert!(self.owncoin.note.value != 0);
 
         debug!("Building Consensus::UnstakeRequestV1 anonymous input");
-        let root = self.tree.root(0).unwrap();
-        let merkle_path = self.tree.authentication_path(self.owncoin.leaf_position, &root).unwrap();
+        let merkle_path = self.tree.witness(self.owncoin.leaf_position, 0).unwrap();
 
         let input = ConsensusBurnInputInfo {
             leaf_position: self.owncoin.leaf_position,

+ 1 - 2
src/contract/consensus/src/client/unstake_v1.rs

@@ -65,8 +65,7 @@ impl ConsensusUnstakeCallBuilder {
         assert!(self.owncoin.note.value != 0);
 
         debug!("Building Consensus::UnstakeV1 anonymous input");
-        let root = self.tree.root(0).unwrap();
-        let merkle_path = self.tree.authentication_path(self.owncoin.leaf_position, &root).unwrap();
+        let merkle_path = self.tree.witness(self.owncoin.leaf_position, 0).unwrap();
 
         let input = ConsensusBurnInputInfo {
             leaf_position: self.owncoin.leaf_position,