Переглянути джерело

tx: use DarkForest in TransactionBuilder

aggstam 2 роки тому
батько
коміт
15c44bd7bb

+ 1 - 1
bin/darkfid2/src/task/miner.rs

@@ -211,7 +211,7 @@ fn generate_pow_transaction(
     debris.params.encode(&mut data)?;
     let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
     let mut tx_builder =
-        TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![]);
+        TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
     let mut tx = tx_builder.build()?;
     let sigs = tx.create_sigs(&mut OsRng, &[*secret])?;
     tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/consensus_genesis_stake.rs

@@ -79,7 +79,7 @@ impl TestHarness {
         let mut genesis_stake_tx_builder = TransactionBuilder::new(
             ContractCallLeaf { call: contract_call, proofs: genesis_stake_proofs },
             vec![],
-        );
+        )?;
         let mut genesis_stake_tx = genesis_stake_tx_builder.build()?;
         let sigs = genesis_stake_tx.create_sigs(&mut OsRng, &[wallet.keypair.secret])?;
         genesis_stake_tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/consensus_proposal.rs

@@ -81,7 +81,7 @@ impl TestHarness {
         let mut data = vec![ConsensusFunction::ProposalV1 as u8];
         params.encode(&mut data)?;
         let call = ContractCall { contract_id: *CONSENSUS_CONTRACT_ID, data };
-        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![]);
+        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[signature_secret_key])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/consensus_stake.rs

@@ -111,7 +111,7 @@ impl TestHarness {
         let mut stake_tx_builder = TransactionBuilder::new(
             ContractCallLeaf { call: consensus_call, proofs: consensus_stake_proofs },
             vec![],
-        );
+        )?;
         stake_tx_builder
             .append(ContractCallLeaf { call: money_call, proofs: money_stake_proofs }, vec![])?;
         let mut stake_tx = stake_tx_builder.build()?;

+ 1 - 1
src/contract/test-harness/src/consensus_unstake.rs

@@ -105,7 +105,7 @@ impl TestHarness {
         let mut unstake_tx_builder = TransactionBuilder::new(
             ContractCallLeaf { call: money_call, proofs: money_unstake_proofs },
             vec![],
-        );
+        )?;
         unstake_tx_builder.append(
             ContractCallLeaf { call: consensus_call, proofs: consensus_unstake_proofs },
             vec![],

+ 1 - 1
src/contract/test-harness/src/consensus_unstake_request.rs

@@ -90,7 +90,7 @@ impl TestHarness {
         let mut unstake_request_builder = TransactionBuilder::new(
             ContractCallLeaf { call, proofs: unstake_request_proofs },
             vec![],
-        );
+        )?;
         let mut unstake_request_tx = unstake_request_builder.build()?;
         let sigs =
             unstake_request_tx.create_sigs(&mut OsRng, &[unstake_request_signature_secret_key])?;

+ 1 - 1
src/contract/test-harness/src/dao_exec.rs

@@ -192,7 +192,7 @@ impl TestHarness {
         //let mut tx_builder = TransactionBuilder::new(
         //    ContractCallLeaf { call: exec_call, proofs: exec_proofs },
         //    vec![],
-        //);
+        //)?;
         //tx_builder
         //    .append(ContractCallLeaf { call: authxfer_call, proofs: authxfer_proofs }, vec![])?;
         //tx_builder

+ 1 - 1
src/contract/test-harness/src/dao_mint.rs

@@ -54,7 +54,7 @@ impl TestHarness {
         let mut data = vec![DaoFunction::Mint as u8];
         params.encode(&mut data)?;
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
-        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![]);
+        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[dao_kp.secret])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/dao_propose.rs

@@ -123,7 +123,7 @@ impl TestHarness {
         let mut data = vec![DaoFunction::Propose as u8];
         params.encode(&mut data)?;
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
-        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![]);
+        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/dao_vote.rs

@@ -97,7 +97,7 @@ impl TestHarness {
         let mut data = vec![DaoFunction::Vote as u8];
         params.encode(&mut data)?;
         let call = ContractCall { contract_id: *DAO_CONTRACT_ID, data };
-        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![]);
+        let mut tx_builder = TransactionBuilder::new(ContractCallLeaf { call, proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[signature_secret])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/money_airdrop.rs

@@ -87,7 +87,7 @@ impl TestHarness {
         params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: secrets.proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: secrets.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &secrets.signature_secrets)?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/money_genesis_mint.rs

@@ -71,7 +71,7 @@ impl TestHarness {
         debris.params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[wallet.keypair.secret])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/money_otc_swap.rs

@@ -140,7 +140,7 @@ impl TestHarness {
         swap_full_params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: swap_full_proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: swap_full_proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[debris1.signature_secret])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/money_pow_reward.rs

@@ -91,7 +91,7 @@ impl TestHarness {
         debris.params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[wallet.keypair.secret])?;
         tx.signatures = vec![sigs];

+ 2 - 2
src/contract/test-harness/src/money_token.rs

@@ -76,7 +76,7 @@ impl TestHarness {
         debris.params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
         tx.signatures = vec![sigs];
@@ -139,7 +139,7 @@ impl TestHarness {
         debris.params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: debris.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
         tx.signatures = vec![sigs];

+ 1 - 1
src/contract/test-harness/src/money_transfer.rs

@@ -76,7 +76,7 @@ impl TestHarness {
         params.encode(&mut data)?;
         let call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
         let mut tx_builder =
-            TransactionBuilder::new(ContractCallLeaf { call, proofs: secrets.proofs }, vec![]);
+            TransactionBuilder::new(ContractCallLeaf { call, proofs: secrets.proofs }, vec![])?;
         let mut tx = tx_builder.build()?;
         let sigs = tx.create_sigs(&mut OsRng, &secrets.signature_secrets)?;
         tx.signatures = vec![sigs];

+ 18 - 13
src/tx/mod.rs

@@ -23,7 +23,7 @@ use darkfi_sdk::{
         schnorr::{SchnorrPublic, SchnorrSecret, Signature},
         PublicKey, SecretKey,
     },
-    dark_tree::{dark_leaf_vec_integrity_check, DarkLeaf, DarkTree},
+    dark_tree::{dark_forest_leaf_vec_integrity_check, DarkForest, DarkLeaf, DarkTree},
     error::DarkTreeResult,
     pasta::pallas,
     tx::ContractCall,
@@ -210,38 +210,43 @@ pub struct ContractCallLeaf {
 /// Auxilliary structure to build a full [`Transaction`] using
 /// [`DarkTree`] to order everything.
 pub struct TransactionBuilder {
-    /// Contract calls tree
-    pub calls: DarkTree<ContractCallLeaf>,
+    /// Contract calls trees forest
+    pub calls: DarkForest<ContractCallLeaf>,
 }
 
-// TODO: for now we build the tree manually, but we should
+// TODO: for now we build the trees manually, but we should
 //       add all the proper functions for easier building.
 impl TransactionBuilder {
     /// Initialize the builder, using provided data to
-    /// generate its [`DarkTree`] root.
-    pub fn new(data: ContractCallLeaf, children: Vec<DarkTree<ContractCallLeaf>>) -> Self {
-        let calls = DarkTree::new(data, children, Some(MIN_TX_CALLS), Some(MAX_TX_CALLS));
-        Self { calls }
+    /// generate its initial [`DarkTree`] root.
+    pub fn new(
+        data: ContractCallLeaf,
+        children: Vec<DarkTree<ContractCallLeaf>>,
+    ) -> DarkTreeResult<Self> {
+        let calls = DarkForest::new(Some(MIN_TX_CALLS), Some(MAX_TX_CALLS));
+        let mut self_ = Self { calls };
+        self_.append(data, children)?;
+        Ok(self_)
     }
 
-    /// Append a new call to the tree
+    /// Append a new call tree to the forest
     pub fn append(
         &mut self,
         data: ContractCallLeaf,
         children: Vec<DarkTree<ContractCallLeaf>>,
     ) -> DarkTreeResult<()> {
-        let child = DarkTree::new(data, children, Some(MIN_TX_CALLS), Some(MAX_TX_CALLS));
-        self.calls.append(child)
+        let tree = DarkTree::new(data, children, None, None);
+        self.calls.append(tree)
     }
 
-    /// Builder builds the calls vector using the [`DarkTree`]
+    /// Builder builds the calls vector using the [`DarkForest`]
     /// and generates the corresponding [`Transaction`].
     pub fn build(&mut self) -> DarkTreeResult<Transaction> {
         // Build the leafs vector
         let leafs = self.calls.build_vec()?;
 
         // Double check integrity
-        dark_leaf_vec_integrity_check(&leafs, Some(MIN_TX_CALLS), Some(MAX_TX_CALLS), None)?;
+        dark_forest_leaf_vec_integrity_check(&leafs, Some(MIN_TX_CALLS), Some(MAX_TX_CALLS))?;
 
         // Build the corresponding transaction
         let mut calls = Vec::with_capacity(leafs.len());

+ 7 - 3
src/validator/verification.rs

@@ -21,7 +21,7 @@ use std::collections::HashMap;
 use darkfi_sdk::{
     blockchain::{block_version, expected_reward},
     crypto::{schnorr::SchnorrPublic, PublicKey, CONSENSUS_CONTRACT_ID, MONEY_CONTRACT_ID},
-    dark_tree::dark_leaf_vec_integrity_check,
+    dark_tree::dark_forest_leaf_vec_integrity_check,
     pasta::pallas,
 };
 use darkfi_serial::{deserialize_async, AsyncDecodable, AsyncEncodable, AsyncWriteExt, WriteExt};
@@ -347,9 +347,13 @@ pub async fn verify_transaction(
 
     // Verify calls indexes integrity
     if verify_fee {
-        dark_leaf_vec_integrity_check(&tx.calls, Some(MIN_TX_CALLS + 1), Some(MAX_TX_CALLS), None)?;
+        dark_forest_leaf_vec_integrity_check(
+            &tx.calls,
+            Some(MIN_TX_CALLS + 1),
+            Some(MAX_TX_CALLS),
+        )?;
     } else {
-        dark_leaf_vec_integrity_check(&tx.calls, Some(MIN_TX_CALLS), Some(MAX_TX_CALLS), None)?;
+        dark_forest_leaf_vec_integrity_check(&tx.calls, Some(MIN_TX_CALLS), Some(MAX_TX_CALLS))?;
     }
 
     // Table of public inputs used for ZK proof verification