|
|
@@ -18,6 +18,7 @@
|
|
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
+use async_std::sync::{Arc, RwLock};
|
|
|
use darkfi::{
|
|
|
consensus::{
|
|
|
constants::{TESTNET_GENESIS_HASH_BYTES, TESTNET_GENESIS_TIMESTAMP},
|
|
|
@@ -47,7 +48,7 @@ use rand::rngs::OsRng;
|
|
|
use darkfi_money_contract::{client::build_transfer_tx, MoneyFunction, ZKAS_BURN_NS, ZKAS_MINT_NS};
|
|
|
|
|
|
/// Initialize log configuration
|
|
|
-fn logger_init() -> Result<()> {
|
|
|
+fn init_logger() -> Result<()> {
|
|
|
let mut cfg = simplelog::ConfigBuilder::new();
|
|
|
cfg.add_filter_ignore("sled".to_string());
|
|
|
simplelog::TermLogger::init(
|
|
|
@@ -60,8 +61,76 @@ fn logger_init() -> Result<()> {
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
+/// Initialize a faucet
|
|
|
+async fn init_faucet() -> Result<(
|
|
|
+ Arc<RwLock<ValidatorState>>,
|
|
|
+ Keypair,
|
|
|
+ BridgeTree<MerkleNode, MERKLE_DEPTH>,
|
|
|
+ ContractId,
|
|
|
+ ZkBinary,
|
|
|
+ ProvingKey,
|
|
|
+ ZkBinary,
|
|
|
+ ProvingKey,
|
|
|
+)> {
|
|
|
+ info!("Initializing faucet");
|
|
|
+ let faucet_kp = Keypair::random(&mut OsRng);
|
|
|
+ let faucet_pubkeys = vec![faucet_kp.public];
|
|
|
+ let faucet_wallet = WalletDb::new("sqlite::memory:", "foo").await?;
|
|
|
+ let faucet_sled_db = sled::Config::new().temporary(true).open()?;
|
|
|
+ let faucet_state = ValidatorState::new(
|
|
|
+ &faucet_sled_db,
|
|
|
+ *TESTNET_GENESIS_TIMESTAMP,
|
|
|
+ *TESTNET_GENESIS_HASH_BYTES,
|
|
|
+ faucet_wallet,
|
|
|
+ faucet_pubkeys.clone(),
|
|
|
+ false,
|
|
|
+ )
|
|
|
+ .await?;
|
|
|
+
|
|
|
+ info!("Looking up zkas circuits from DB");
|
|
|
+ let contract_id = ContractId::from(pallas::Base::from(u64::MAX - 420));
|
|
|
+ let faucet_sled = &faucet_state.read().await.blockchain.sled_db;
|
|
|
+ let db_handle = faucet_state.read().await.blockchain.contracts.lookup(
|
|
|
+ faucet_sled,
|
|
|
+ &contract_id,
|
|
|
+ ZKAS_DB_NAME,
|
|
|
+ )?;
|
|
|
+
|
|
|
+ let mint_zkbin = db_handle.get(&serialize(&ZKAS_MINT_NS))?.unwrap();
|
|
|
+ let burn_zkbin = db_handle.get(&serialize(&ZKAS_BURN_NS))?.unwrap();
|
|
|
+ info!("Decoding bincode");
|
|
|
+ let mint_zkbin = ZkBinary::decode(&mint_zkbin.clone())?;
|
|
|
+ let burn_zkbin = ZkBinary::decode(&burn_zkbin.clone())?;
|
|
|
+ let mint_witnesses = empty_witnesses(&mint_zkbin);
|
|
|
+ let burn_witnesses = empty_witnesses(&burn_zkbin);
|
|
|
+ let mint_circuit = ZkCircuit::new(mint_witnesses, mint_zkbin.clone());
|
|
|
+ let burn_circuit = ZkCircuit::new(burn_witnesses, burn_zkbin.clone());
|
|
|
+
|
|
|
+ info!("Creating zk proving keys");
|
|
|
+ let k = 13;
|
|
|
+ let mut proving_keys = HashMap::<[u8; 32], Vec<(&str, ProvingKey)>>::new();
|
|
|
+ let mint_pk = ProvingKey::build(k, &mint_circuit);
|
|
|
+ let burn_pk = ProvingKey::build(k, &burn_circuit);
|
|
|
+ let pks = vec![(ZKAS_MINT_NS, mint_pk.clone()), (ZKAS_BURN_NS, burn_pk.clone())];
|
|
|
+ proving_keys.insert(contract_id.inner().to_repr(), pks);
|
|
|
+
|
|
|
+ info!("Initializing Merkle tree");
|
|
|
+ let faucet_merkle_tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(100);
|
|
|
+
|
|
|
+ Ok((
|
|
|
+ faucet_state.clone(),
|
|
|
+ faucet_kp,
|
|
|
+ faucet_merkle_tree,
|
|
|
+ contract_id,
|
|
|
+ mint_zkbin,
|
|
|
+ mint_pk,
|
|
|
+ burn_zkbin,
|
|
|
+ burn_pk,
|
|
|
+ ))
|
|
|
+}
|
|
|
+
|
|
|
/// Generate N transactions
|
|
|
-fn generate_txs(
|
|
|
+fn generate_faucet_txs(
|
|
|
n: u64,
|
|
|
faucet_kp: &Keypair,
|
|
|
faucet_merkle_tree: &BridgeTree<MerkleNode, MERKLE_DEPTH>,
|
|
|
@@ -111,61 +180,27 @@ fn generate_txs(
|
|
|
/// Check N faucet transactions verification performance
|
|
|
#[async_std::test]
|
|
|
async fn tx_faucet_verification() -> Result<()> {
|
|
|
- logger_init()?;
|
|
|
+ init_logger()?;
|
|
|
|
|
|
// Test configuration
|
|
|
let n = 10;
|
|
|
|
|
|
// We initialize the faucet that will generate the transactions
|
|
|
- info!("Initializing faucet");
|
|
|
- let faucet_kp = Keypair::random(&mut OsRng);
|
|
|
- let faucet_pubkeys = vec![faucet_kp.public];
|
|
|
- let faucet_wallet = WalletDb::new("sqlite::memory:", "foo").await?;
|
|
|
- let faucet_sled_db = sled::Config::new().temporary(true).open()?;
|
|
|
- let faucet_state = ValidatorState::new(
|
|
|
- &faucet_sled_db,
|
|
|
- *TESTNET_GENESIS_TIMESTAMP,
|
|
|
- *TESTNET_GENESIS_HASH_BYTES,
|
|
|
- faucet_wallet,
|
|
|
- faucet_pubkeys.clone(),
|
|
|
- false,
|
|
|
- )
|
|
|
- .await?;
|
|
|
-
|
|
|
- info!("Looking up zkas circuits from DB");
|
|
|
- let contract_id = ContractId::from(pallas::Base::from(u64::MAX - 420));
|
|
|
- let faucet_sled = &faucet_state.read().await.blockchain.sled_db;
|
|
|
- let db_handle = faucet_state.read().await.blockchain.contracts.lookup(
|
|
|
- faucet_sled,
|
|
|
- &contract_id,
|
|
|
- ZKAS_DB_NAME,
|
|
|
- )?;
|
|
|
-
|
|
|
- let mint_zkbin = db_handle.get(&serialize(&ZKAS_MINT_NS))?.unwrap();
|
|
|
- let burn_zkbin = db_handle.get(&serialize(&ZKAS_BURN_NS))?.unwrap();
|
|
|
- info!("Decoding bincode");
|
|
|
- let mint_zkbin = ZkBinary::decode(&mint_zkbin.clone())?;
|
|
|
- let burn_zkbin = ZkBinary::decode(&burn_zkbin.clone())?;
|
|
|
- let mint_witnesses = empty_witnesses(&mint_zkbin);
|
|
|
- let burn_witnesses = empty_witnesses(&burn_zkbin);
|
|
|
- let mint_circuit = ZkCircuit::new(mint_witnesses, mint_zkbin.clone());
|
|
|
- let burn_circuit = ZkCircuit::new(burn_witnesses, burn_zkbin.clone());
|
|
|
-
|
|
|
- info!("Creating zk proving keys");
|
|
|
- let k = 13;
|
|
|
- let mut proving_keys = HashMap::<[u8; 32], Vec<(&str, ProvingKey)>>::new();
|
|
|
- let mint_pk = ProvingKey::build(k, &mint_circuit);
|
|
|
- let burn_pk = ProvingKey::build(k, &burn_circuit);
|
|
|
- let pks = vec![(ZKAS_MINT_NS, mint_pk.clone()), (ZKAS_BURN_NS, burn_pk.clone())];
|
|
|
- proving_keys.insert(contract_id.inner().to_repr(), pks);
|
|
|
-
|
|
|
- info!("Initializing Merkle tree");
|
|
|
- let faucet_merkle_tree = BridgeTree::<MerkleNode, MERKLE_DEPTH>::new(100);
|
|
|
+ let (
|
|
|
+ faucet_state,
|
|
|
+ faucet_kp,
|
|
|
+ faucet_merkle_tree,
|
|
|
+ contract_id,
|
|
|
+ mint_zkbin,
|
|
|
+ mint_pk,
|
|
|
+ burn_zkbin,
|
|
|
+ burn_pk,
|
|
|
+ ) = init_faucet().await?;
|
|
|
|
|
|
// Generating transactions
|
|
|
- info!("Generating {} transactions", n);
|
|
|
+ info!("Generating {} faucet transactions", n);
|
|
|
let init = Timestamp::current_time();
|
|
|
- let txs = generate_txs(
|
|
|
+ let txs = generate_faucet_txs(
|
|
|
n,
|
|
|
&faucet_kp,
|
|
|
&faucet_merkle_tree,
|
|
|
@@ -179,12 +214,12 @@ async fn tx_faucet_verification() -> Result<()> {
|
|
|
assert_eq!(txs.len(), n as usize);
|
|
|
|
|
|
// Verifying transactions
|
|
|
- info!("Verifying transactions...");
|
|
|
+ info!("Verifying faucet transactions...");
|
|
|
let init = Timestamp::current_time();
|
|
|
faucet_state.read().await.verify_transactions(&txs, true).await?;
|
|
|
let verification_elapsed_time = init.elapsed();
|
|
|
|
|
|
- info!("Processing time of {} transactions(in sec):", n);
|
|
|
+ info!("Processing time of {} faucet transactions(in sec):", n);
|
|
|
info!("\tGeneration -> {}", generation_elapsed_time);
|
|
|
info!("\tVerification -> {}", verification_elapsed_time);
|
|
|
|