| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- 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 = ¶ms_paths.0.to_str().unwrap_or("mint.params");
- let spend_params_path = ¶ms_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, ¶ms)?;
- }
- if !params_paths.1.exists() {
- let params = setup_spend_prover();
- save_params(spend_params_path, ¶ms)?;
- }
- if !cashier_params_paths.0.exists() {
- let params = setup_mint_prover();
- save_params(cashier_mint_params_path, ¶ms)?;
- }
- if !cashier_params_paths.1.exists() {
- let params = setup_spend_prover();
- save_params(cashier_spend_params_path, ¶ms)?;
- }
- 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 token_id = jubjub::Fr::random(&mut OsRng);
- let value = 10;
- let signature_secret = cashier_main_keypair.private;
- let input = tx::TransactionBuilderClearInputInfo {
- value,
- token_id,
- signature_secret,
- };
- clear_inputs.push(input);
- outputs.push(tx::TransactionBuilderOutputInfo {
- value,
- token_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(())
- }
|