|
@@ -24,12 +24,20 @@ use darkfi::{
|
|
|
Result,
|
|
Result,
|
|
|
};
|
|
};
|
|
|
use darkfi_money_contract::{
|
|
use darkfi_money_contract::{
|
|
|
- client::{token_freeze_v1::TokenFreezeCallBuilder, token_mint_v1::TokenMintCallBuilder},
|
|
|
|
|
- model::{MoneyTokenFreezeParamsV1, MoneyTokenMintParamsV1},
|
|
|
|
|
- MoneyFunction, MONEY_CONTRACT_ZKAS_TOKEN_FRZ_NS_V1, MONEY_CONTRACT_ZKAS_TOKEN_MINT_NS_V1,
|
|
|
|
|
|
|
+ client::{
|
|
|
|
|
+ auth_token_mint_v1::AuthTokenMintCallBuilder, token_freeze_v1::TokenFreezeCallBuilder,
|
|
|
|
|
+ token_mint_v1::TokenMintCallBuilder,
|
|
|
|
|
+ },
|
|
|
|
|
+ model::{
|
|
|
|
|
+ CoinAttributes, MoneyAuthTokenMintParamsV1, MoneyTokenFreezeParamsV1,
|
|
|
|
|
+ MoneyTokenMintParamsV1, TokenAttributes,
|
|
|
|
|
+ },
|
|
|
|
|
+ MoneyFunction, MONEY_CONTRACT_ZKAS_AUTH_TOKEN_MINT_NS_V1, MONEY_CONTRACT_ZKAS_TOKEN_FRZ_NS_V1,
|
|
|
|
|
+ MONEY_CONTRACT_ZKAS_TOKEN_MINT_NS_V1,
|
|
|
};
|
|
};
|
|
|
use darkfi_sdk::{
|
|
use darkfi_sdk::{
|
|
|
- crypto::{MerkleNode, MONEY_CONTRACT_ID},
|
|
|
|
|
|
|
+ crypto::{poseidon_hash, FuncRef, MerkleNode, MONEY_CONTRACT_ID},
|
|
|
|
|
+ dark_tree::DarkLeaf,
|
|
|
pasta::pallas,
|
|
pasta::pallas,
|
|
|
ContractCall,
|
|
ContractCall,
|
|
|
};
|
|
};
|
|
@@ -46,40 +54,85 @@ impl TestHarness {
|
|
|
recipient: &Holder,
|
|
recipient: &Holder,
|
|
|
spend_hook: Option<pallas::Base>,
|
|
spend_hook: Option<pallas::Base>,
|
|
|
user_data: Option<pallas::Base>,
|
|
user_data: Option<pallas::Base>,
|
|
|
- ) -> Result<(Transaction, MoneyTokenMintParamsV1)> {
|
|
|
|
|
|
|
+ ) -> Result<(Transaction, MoneyTokenMintParamsV1, MoneyAuthTokenMintParamsV1)> {
|
|
|
let wallet = self.holders.get(holder).unwrap();
|
|
let wallet = self.holders.get(holder).unwrap();
|
|
|
let mint_authority = wallet.token_mint_authority;
|
|
let mint_authority = wallet.token_mint_authority;
|
|
|
|
|
+ let token_blind = wallet.token_blind;
|
|
|
|
|
|
|
|
let rcpt = self.holders.get(recipient).unwrap().keypair.public;
|
|
let rcpt = self.holders.get(recipient).unwrap().keypair.public;
|
|
|
|
|
|
|
|
- let (mint_pk, mint_zkbin) =
|
|
|
|
|
- self.proving_keys.get(&MONEY_CONTRACT_ZKAS_TOKEN_MINT_NS_V1.to_string()).unwrap();
|
|
|
|
|
|
|
+ let (mint_pk, mint_zkbin) = self
|
|
|
|
|
+ .proving_keys
|
|
|
|
|
+ .get(&MONEY_CONTRACT_ZKAS_TOKEN_MINT_NS_V1.to_string())
|
|
|
|
|
+ .unwrap()
|
|
|
|
|
+ .clone();
|
|
|
|
|
+ let (auth_mint_pk, auth_mint_zkbin) = self
|
|
|
|
|
+ .proving_keys
|
|
|
|
|
+ .get(&MONEY_CONTRACT_ZKAS_AUTH_TOKEN_MINT_NS_V1.to_string())
|
|
|
|
|
+ .unwrap()
|
|
|
|
|
+ .clone();
|
|
|
|
|
|
|
|
let tx_action_benchmark =
|
|
let tx_action_benchmark =
|
|
|
self.tx_action_benchmarks.get_mut(&TxAction::MoneyTokenMint).unwrap();
|
|
self.tx_action_benchmarks.get_mut(&TxAction::MoneyTokenMint).unwrap();
|
|
|
|
|
|
|
|
let timer = Instant::now();
|
|
let timer = Instant::now();
|
|
|
|
|
|
|
|
- let builder = TokenMintCallBuilder {
|
|
|
|
|
- mint_authority,
|
|
|
|
|
- recipient: rcpt,
|
|
|
|
|
- amount,
|
|
|
|
|
|
|
+ let auth_func_id = FuncRef {
|
|
|
|
|
+ contract_id: *MONEY_CONTRACT_ID,
|
|
|
|
|
+ func_code: MoneyFunction::AuthTokenMintV1 as u8,
|
|
|
|
|
+ }
|
|
|
|
|
+ .to_func_id();
|
|
|
|
|
+
|
|
|
|
|
+ let token_attrs = TokenAttributes {
|
|
|
|
|
+ auth_parent: auth_func_id,
|
|
|
|
|
+ user_data: poseidon_hash([mint_authority.public.x(), mint_authority.public.y()]),
|
|
|
|
|
+ blind: token_blind,
|
|
|
|
|
+ };
|
|
|
|
|
+ let token_id = token_attrs.to_token_id();
|
|
|
|
|
+
|
|
|
|
|
+ let coin_attrs = CoinAttributes {
|
|
|
|
|
+ public_key: rcpt,
|
|
|
|
|
+ value: amount,
|
|
|
|
|
+ token_id,
|
|
|
spend_hook: spend_hook.unwrap_or(pallas::Base::ZERO),
|
|
spend_hook: spend_hook.unwrap_or(pallas::Base::ZERO),
|
|
|
user_data: user_data.unwrap_or(pallas::Base::ZERO),
|
|
user_data: user_data.unwrap_or(pallas::Base::ZERO),
|
|
|
- token_mint_zkbin: mint_zkbin.clone(),
|
|
|
|
|
- token_mint_pk: mint_pk.clone(),
|
|
|
|
|
|
|
+ blind: pallas::Base::random(&mut OsRng),
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- let debris = builder.build()?;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ let builder = TokenMintCallBuilder {
|
|
|
|
|
+ coin_attrs: coin_attrs.clone(),
|
|
|
|
|
+ token_attrs: token_attrs.clone(),
|
|
|
|
|
+ mint_zkbin,
|
|
|
|
|
+ mint_pk,
|
|
|
|
|
+ };
|
|
|
|
|
+ let mint_debris = builder.build()?;
|
|
|
let mut data = vec![MoneyFunction::TokenMintV1 as u8];
|
|
let mut data = vec![MoneyFunction::TokenMintV1 as u8];
|
|
|
- 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![])?;
|
|
|
|
|
- let mut tx = tx_builder.build()?;
|
|
|
|
|
- let sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
|
|
|
|
|
- tx.signatures = vec![sigs];
|
|
|
|
|
|
|
+ mint_debris.params.encode(&mut data)?;
|
|
|
|
|
+ let mint_call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
|
|
|
|
|
+
|
|
|
|
|
+ let builder = AuthTokenMintCallBuilder {
|
|
|
|
|
+ coin_attrs,
|
|
|
|
|
+ token_attrs,
|
|
|
|
|
+ mint_keypair: mint_authority,
|
|
|
|
|
+ auth_mint_zkbin,
|
|
|
|
|
+ auth_mint_pk,
|
|
|
|
|
+ };
|
|
|
|
|
+ let auth_debris = builder.build()?;
|
|
|
|
|
+ let mut data = vec![MoneyFunction::AuthTokenMintV1 as u8];
|
|
|
|
|
+ auth_debris.params.encode(&mut data)?;
|
|
|
|
|
+ let auth_call = ContractCall { contract_id: *MONEY_CONTRACT_ID, data };
|
|
|
|
|
+
|
|
|
|
|
+ let mut tx = Transaction {
|
|
|
|
|
+ calls: vec![
|
|
|
|
|
+ DarkLeaf { data: mint_call, parent_index: Some(1), children_indexes: vec![] },
|
|
|
|
|
+ DarkLeaf { data: auth_call, parent_index: None, children_indexes: vec![0] },
|
|
|
|
|
+ ],
|
|
|
|
|
+ proofs: vec![mint_debris.proofs, auth_debris.proofs],
|
|
|
|
|
+ signatures: vec![],
|
|
|
|
|
+ };
|
|
|
|
|
+ let mint_sigs = tx.create_sigs(&mut OsRng, &[])?;
|
|
|
|
|
+ let auth_sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
|
|
|
|
|
+ tx.signatures = vec![mint_sigs, auth_sigs];
|
|
|
tx_action_benchmark.creation_times.push(timer.elapsed());
|
|
tx_action_benchmark.creation_times.push(timer.elapsed());
|
|
|
|
|
|
|
|
// Calculate transaction sizes
|
|
// Calculate transaction sizes
|
|
@@ -90,7 +143,7 @@ impl TestHarness {
|
|
|
let size = std::mem::size_of_val(&*base58);
|
|
let size = std::mem::size_of_val(&*base58);
|
|
|
tx_action_benchmark.broadcasted_sizes.push(size);
|
|
tx_action_benchmark.broadcasted_sizes.push(size);
|
|
|
|
|
|
|
|
- Ok((tx, debris.params))
|
|
|
|
|
|
|
+ Ok((tx, mint_debris.params, auth_debris.params))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub async fn execute_token_mint_tx(
|
|
pub async fn execute_token_mint_tx(
|
|
@@ -106,7 +159,8 @@ impl TestHarness {
|
|
|
let timer = Instant::now();
|
|
let timer = Instant::now();
|
|
|
|
|
|
|
|
wallet.validator.add_transactions(&[tx.clone()], block_height, true).await?;
|
|
wallet.validator.add_transactions(&[tx.clone()], block_height, true).await?;
|
|
|
- wallet.money_merkle_tree.append(MerkleNode::from(params.output.coin.inner()));
|
|
|
|
|
|
|
+ wallet.money_merkle_tree.append(MerkleNode::from(params.coin.inner()));
|
|
|
|
|
+
|
|
|
tx_action_benchmark.verify_times.push(timer.elapsed());
|
|
tx_action_benchmark.verify_times.push(timer.elapsed());
|
|
|
|
|
|
|
|
Ok(())
|
|
Ok(())
|
|
@@ -117,7 +171,8 @@ impl TestHarness {
|
|
|
holder: &Holder,
|
|
holder: &Holder,
|
|
|
) -> Result<(Transaction, MoneyTokenFreezeParamsV1)> {
|
|
) -> Result<(Transaction, MoneyTokenFreezeParamsV1)> {
|
|
|
let wallet = self.holders.get(holder).unwrap();
|
|
let wallet = self.holders.get(holder).unwrap();
|
|
|
- let mint_authority = wallet.token_mint_authority;
|
|
|
|
|
|
|
+ let mint_keypair = wallet.token_mint_authority;
|
|
|
|
|
+ let token_blind = wallet.token_blind;
|
|
|
|
|
|
|
|
let (frz_pk, frz_zkbin) =
|
|
let (frz_pk, frz_zkbin) =
|
|
|
self.proving_keys.get(&MONEY_CONTRACT_ZKAS_TOKEN_FRZ_NS_V1.to_string()).unwrap();
|
|
self.proving_keys.get(&MONEY_CONTRACT_ZKAS_TOKEN_FRZ_NS_V1.to_string()).unwrap();
|
|
@@ -127,10 +182,23 @@ impl TestHarness {
|
|
|
|
|
|
|
|
let timer = Instant::now();
|
|
let timer = Instant::now();
|
|
|
|
|
|
|
|
|
|
+ let auth_func_id = FuncRef {
|
|
|
|
|
+ contract_id: *MONEY_CONTRACT_ID,
|
|
|
|
|
+ func_code: MoneyFunction::AuthTokenMintV1 as u8,
|
|
|
|
|
+ }
|
|
|
|
|
+ .to_func_id();
|
|
|
|
|
+
|
|
|
|
|
+ let token_attrs = TokenAttributes {
|
|
|
|
|
+ auth_parent: auth_func_id,
|
|
|
|
|
+ user_data: poseidon_hash([mint_keypair.public.x(), mint_keypair.public.y()]),
|
|
|
|
|
+ blind: token_blind,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
let builder = TokenFreezeCallBuilder {
|
|
let builder = TokenFreezeCallBuilder {
|
|
|
- mint_authority,
|
|
|
|
|
- token_freeze_zkbin: frz_zkbin.clone(),
|
|
|
|
|
- token_freeze_pk: frz_pk.clone(),
|
|
|
|
|
|
|
+ mint_keypair,
|
|
|
|
|
+ token_attrs,
|
|
|
|
|
+ freeze_zkbin: frz_zkbin.clone(),
|
|
|
|
|
+ freeze_pk: frz_pk.clone(),
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
let debris = builder.build()?;
|
|
let debris = builder.build()?;
|
|
@@ -141,7 +209,7 @@ impl TestHarness {
|
|
|
let mut tx_builder =
|
|
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 mut tx = tx_builder.build()?;
|
|
|
- let sigs = tx.create_sigs(&mut OsRng, &[mint_authority.secret])?;
|
|
|
|
|
|
|
+ let sigs = tx.create_sigs(&mut OsRng, &[mint_keypair.secret])?;
|
|
|
tx.signatures = vec![sigs];
|
|
tx.signatures = vec![sigs];
|
|
|
tx_action_benchmark.creation_times.push(timer.elapsed());
|
|
tx_action_benchmark.creation_times.push(timer.elapsed());
|
|
|
|
|
|