Selaa lähdekoodia

create demo build tx for testing

ghassmo 4 vuotta sitten
vanhempi
sitoutus
8bb85c9ade
1 muutettua tiedostoa jossa 181 lisäystä ja 0 poistoa
  1. 181 0
      src/bin/build_tx.rs

+ 181 - 0
src/bin/build_tx.rs

@@ -0,0 +1,181 @@
+use drk::{
+    blockchain::{rocks::columns, Rocks, RocksColumn},
+    cli::{CashierdConfig, Config, DarkfidConfig},
+    client::State,
+    crypto::{
+        load_params, merkle::CommitmentTree, save_params, setup_mint_prover, setup_spend_prover,
+    },
+    state::state_transition,
+    tx,
+    util::{expand_path, join_config_path},
+    wallet::WalletDb,
+    Result,
+};
+
+use std::path::PathBuf;
+
+use async_std;
+use async_std::sync::{Arc, Mutex};
+use ff::Field;
+use rand::rngs::OsRng;
+
+#[async_std::main]
+async fn main() -> Result<()> {
+    let config: DarkfidConfig =
+        Config::<DarkfidConfig>::load(join_config_path(&PathBuf::from("darkfid.toml"))?)?;
+
+    let config_cashier: CashierdConfig =
+        Config::<CashierdConfig>::load(join_config_path(&PathBuf::from("cashierd.toml"))?)?;
+
+    let rocks = Rocks::new(expand_path(&config.database_path.clone())?.as_path())?;
+
+    let merkle_roots = RocksColumn::<columns::MerkleRoots>::new(rocks.clone());
+    let nullifiers = RocksColumn::<columns::Nullifiers>::new(rocks);
+
+    let params_paths = (
+        expand_path(&config.mint_params_path.clone())?,
+        expand_path(&config.spend_params_path.clone())?,
+    );
+
+    let mint_params_path = &params_paths.0.to_str().unwrap_or("mint.params");
+    let spend_params_path = &params_paths.1.to_str().unwrap_or("spend.params");
+
+    let cashier_params_paths = (
+        expand_path(&config_cashier.mint_params_path.clone())?,
+        expand_path(&config_cashier.spend_params_path.clone())?,
+    );
+
+    let cashier_mint_params_path = &cashier_params_paths
+        .0
+        .to_str()
+        .unwrap_or("cash_mint.params");
+    let cashier_spend_params_path = &cashier_params_paths
+        .1
+        .to_str()
+        .unwrap_or("cash_spend.params");
+
+    if !params_paths.0.exists() {
+        let params = setup_mint_prover();
+        save_params(mint_params_path, &params)?;
+    }
+    if !params_paths.1.exists() {
+        let params = setup_spend_prover();
+        save_params(spend_params_path, &params)?;
+    }
+
+    if !cashier_params_paths.0.exists() {
+        let params = setup_mint_prover();
+        save_params(cashier_mint_params_path, &params)?;
+    }
+    if !cashier_params_paths.1.exists() {
+        let params = setup_spend_prover();
+        save_params(cashier_spend_params_path, &params)?;
+    }
+
+    let cashier_wallet = WalletDb::new(
+        expand_path(&config_cashier.client_wallet_path.clone())?.as_path(),
+        config.wallet_password.clone(),
+    )?;
+
+    let wallet = WalletDb::new(
+        expand_path(&config.wallet_path.clone())?.as_path(),
+        config.wallet_password.clone(),
+    )?;
+
+    wallet.init_db().await?;
+
+    if wallet.get_keypairs()?.is_empty() {
+        wallet.key_gen()?;
+    }
+
+    cashier_wallet.init_db().await?;
+
+    if cashier_wallet.get_keypairs()?.is_empty() {
+        cashier_wallet.key_gen()?;
+    }
+
+    let user_main_keypair = wallet.get_keypairs()?[0].clone();
+
+    let cashier_main_keypair = cashier_wallet.get_keypairs()?[0].clone();
+
+    wallet.put_cashier_pub(&cashier_main_keypair.public)?;
+
+
+    // Load trusted setup parameters
+    let (_, mint_pvk) = load_params(mint_params_path)?;
+    let (_, spend_pvk) = load_params(spend_params_path)?;
+
+    // Load trusted setup parameters
+    let (cashier_mint_params, _) = load_params(cashier_mint_params_path)?;
+    let (cashier_spend_params, _) = load_params(cashier_spend_params_path)?;
+
+    //
+    //
+    //
+    // user's state 
+    //
+    //
+    //
+    let state = Arc::new(Mutex::new(State {
+        tree: CommitmentTree::empty(),
+        merkle_roots,
+        nullifiers,
+        mint_pvk,
+        spend_pvk,
+        wallet,
+    }));
+
+
+    //
+    //
+    //
+    // cashier buid tx
+    //
+    //
+    //
+    let mut clear_inputs: Vec<tx::TransactionBuilderClearInputInfo> = vec![];
+    let inputs: Vec<tx::TransactionBuilderInputInfo> = vec![];
+    let mut outputs: Vec<tx::TransactionBuilderOutputInfo> = vec![];
+
+    let asset_id = jubjub::Fr::random(&mut OsRng);
+    let value = 10;
+
+    let signature_secret = cashier_main_keypair.private;
+    let input = tx::TransactionBuilderClearInputInfo {
+        value,
+        asset_id,
+        signature_secret,
+    };
+
+    clear_inputs.push(input);
+
+    outputs.push(tx::TransactionBuilderOutputInfo {
+        value,
+        asset_id,
+        public: user_main_keypair.public,
+    });
+
+    let builder = tx::TransactionBuilder {
+        clear_inputs,
+        inputs,
+        outputs,
+    };
+
+    let tx = builder.build(&cashier_mint_params, &cashier_spend_params);
+
+    //
+    //
+    //
+    // user get the tx
+    //
+    //
+    //
+    let state = state.lock().await;
+    let update = state_transition(&state, tx);
+
+    if let Err(e) = update {
+        println!("state transition error: {}", e.to_string());
+    }
+
+    Ok(())
+}