Procházet zdrojové kódy

src/contract/money/tx_verification: generalize initializations

aggstam před 3 roky
rodič
revize
9c1b3172b9
1 změnil soubory, kde provedl 86 přidání a 51 odebrání
  1. 86 51
      src/contract/money/tests/tx_verification.rs

+ 86 - 51
src/contract/money/tests/tx_verification.rs

@@ -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);