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

contract/money: add money_call_nullifiers fn (moved from drk and added money burn support)

x пре 4 недеља
родитељ
комит
a1897717dc
2 измењених фајлова са 36 додато и 28 уклоњено
  1. 3 26
      bin/drk/src/money.rs
  2. 33 2
      src/contract/money/src/client/mod.rs

+ 3 - 26
bin/drk/src/money.rs

@@ -35,7 +35,7 @@ use darkfi_money_contract::{
     client::{
         compute_remainder_blind,
         fee_v1::{create_fee_proof, FeeCallInput, FeeCallOutput, FEE_CALL_GAS},
-        MoneyNote, OwnCoin,
+        money_call_nullifiers, MoneyNote, OwnCoin,
     },
     model::{
         Coin, Input, MoneyAuthTokenFreezeParamsV1, MoneyBurnParamsV1, MoneyFeeParamsV1,
@@ -1075,29 +1075,6 @@ impl Drk {
         Ok((wallet_spent_coins || !owncoins.is_empty() || wallet_freezes, block_signing_key))
     }
 
-    /// Auxiliary function to  grab all the nullifiers from a transaction money call.
-    async fn money_call_nullifiers(&self, call: &DarkLeaf<ContractCall>) -> Result<Vec<Nullifier>> {
-        let mut nullifiers: Vec<Nullifier> = vec![];
-
-        let data = &call.data.data;
-        match MoneyFunction::try_from(data[0])? {
-            MoneyFunction::FeeV1 => {
-                let params: MoneyFeeParamsV1 = deserialize_async(&data[9..]).await?;
-                nullifiers.push(params.input.nullifier);
-            }
-            MoneyFunction::TransferV1 => {
-                let params: MoneyTransferParamsV1 = deserialize_async(&data[1..]).await?;
-
-                for input in params.inputs {
-                    nullifiers.push(input.nullifier);
-                }
-            }
-            _ => { /* Do nothing */ }
-        }
-
-        Ok(nullifiers)
-    }
-
     /// Mark provided transaction input coins as spent.
     pub async fn mark_tx_spend(&self, tx: &Transaction, output: &mut Vec<String>) -> Result<()> {
         // Create a cache of all our own nullifiers
@@ -1117,7 +1094,7 @@ impl Drk {
             }
 
             output.push(format!("[mark_tx_spend] Found Money contract in call {i}"));
-            let nullifiers = self.money_call_nullifiers(call).await?;
+            let nullifiers = money_call_nullifiers(&call.data).await?;
             self.mark_spent_coins(None, &owncoins_nullifiers, &nullifiers, &None, &tx_hash).await?;
         }
 
@@ -1407,7 +1384,7 @@ impl Drk {
                 _ => { /* Do nothing */ }
             }
 
-            let nullifiers = self.money_call_nullifiers(call).await?;
+            let nullifiers = money_call_nullifiers(&call.data).await?;
             tx_nullifiers.extend_from_slice(&nullifiers);
         }
 

+ 33 - 2
src/contract/money/src/client/mod.rs

@@ -30,6 +30,7 @@
 
 use std::hash::{Hash, Hasher};
 
+use darkfi::Result;
 use darkfi_sdk::{
     bridgetree,
     crypto::{
@@ -37,10 +38,14 @@ use darkfi_sdk::{
         poseidon_hash, BaseBlind, Blind, FuncId, ScalarBlind, SecretKey,
     },
     pasta::pallas,
+    ContractCall,
 };
-use darkfi_serial::{async_trait, SerialDecodable, SerialEncodable};
+use darkfi_serial::{async_trait, deserialize_async, SerialDecodable, SerialEncodable};
 
-use crate::model::{Coin, Nullifier, TokenId};
+use crate::{
+    model::{Coin, MoneyBurnParamsV1, MoneyFeeParamsV1, MoneyTransferParamsV1, Nullifier, TokenId},
+    MoneyFunction,
+};
 
 /// `Money::FeeV1` API
 pub mod fee_v1;
@@ -141,3 +146,29 @@ pub fn compute_remainder_blind(
 
     Blind(total)
 }
+
+/// Auxiliary function to grab all the nullifiers from a transaction money call.
+pub async fn money_call_nullifiers(call: &ContractCall) -> Result<Vec<Nullifier>> {
+    let mut nullifiers: Vec<Nullifier> = vec![];
+    let data = &call.data;
+    match MoneyFunction::try_from(data[0])? {
+        MoneyFunction::FeeV1 => {
+            let params: MoneyFeeParamsV1 = deserialize_async(&data[9..]).await?;
+            nullifiers.push(params.input.nullifier);
+        }
+        MoneyFunction::TransferV1 => {
+            let params: MoneyTransferParamsV1 = deserialize_async(&data[1..]).await?;
+            for input in params.inputs {
+                nullifiers.push(input.nullifier);
+            }
+        }
+        MoneyFunction::BurnV1 => {
+            let params: MoneyBurnParamsV1 = deserialize_async(&data[1..]).await?;
+            for input in params.inputs {
+                nullifiers.push(input.nullifier);
+            }
+        }
+        _ => { /* Do nothing */ }
+    }
+    Ok(nullifiers)
+}