build_tx.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. use drk::{
  2. blockchain::{rocks::columns, Rocks, RocksColumn},
  3. cli::{CashierdConfig, Config, DarkfidConfig},
  4. client::State,
  5. crypto::{
  6. load_params, merkle::CommitmentTree, save_params, setup_mint_prover, setup_spend_prover,
  7. },
  8. state::state_transition,
  9. tx,
  10. util::{expand_path, join_config_path},
  11. wallet::WalletDb,
  12. Result,
  13. };
  14. use std::path::PathBuf;
  15. use async_std;
  16. use async_std::sync::{Arc, Mutex};
  17. use ff::Field;
  18. use rand::rngs::OsRng;
  19. #[async_std::main]
  20. async fn main() -> Result<()> {
  21. let config: DarkfidConfig =
  22. Config::<DarkfidConfig>::load(join_config_path(&PathBuf::from("darkfid.toml"))?)?;
  23. let config_cashier: CashierdConfig =
  24. Config::<CashierdConfig>::load(join_config_path(&PathBuf::from("cashierd.toml"))?)?;
  25. let rocks = Rocks::new(expand_path(&config.database_path.clone())?.as_path())?;
  26. let merkle_roots = RocksColumn::<columns::MerkleRoots>::new(rocks.clone());
  27. let nullifiers = RocksColumn::<columns::Nullifiers>::new(rocks);
  28. let params_paths = (
  29. expand_path(&config.mint_params_path.clone())?,
  30. expand_path(&config.spend_params_path.clone())?,
  31. );
  32. let mint_params_path = &params_paths.0.to_str().unwrap_or("mint.params");
  33. let spend_params_path = &params_paths.1.to_str().unwrap_or("spend.params");
  34. let cashier_params_paths = (
  35. expand_path(&config_cashier.mint_params_path.clone())?,
  36. expand_path(&config_cashier.spend_params_path.clone())?,
  37. );
  38. let cashier_mint_params_path = &cashier_params_paths
  39. .0
  40. .to_str()
  41. .unwrap_or("cash_mint.params");
  42. let cashier_spend_params_path = &cashier_params_paths
  43. .1
  44. .to_str()
  45. .unwrap_or("cash_spend.params");
  46. if !params_paths.0.exists() {
  47. let params = setup_mint_prover();
  48. save_params(mint_params_path, &params)?;
  49. }
  50. if !params_paths.1.exists() {
  51. let params = setup_spend_prover();
  52. save_params(spend_params_path, &params)?;
  53. }
  54. if !cashier_params_paths.0.exists() {
  55. let params = setup_mint_prover();
  56. save_params(cashier_mint_params_path, &params)?;
  57. }
  58. if !cashier_params_paths.1.exists() {
  59. let params = setup_spend_prover();
  60. save_params(cashier_spend_params_path, &params)?;
  61. }
  62. let cashier_wallet = WalletDb::new(
  63. expand_path(&config_cashier.client_wallet_path.clone())?.as_path(),
  64. config.wallet_password.clone(),
  65. )?;
  66. let wallet = WalletDb::new(
  67. expand_path(&config.wallet_path.clone())?.as_path(),
  68. config.wallet_password.clone(),
  69. )?;
  70. wallet.init_db().await?;
  71. if wallet.get_keypairs()?.is_empty() {
  72. wallet.key_gen()?;
  73. }
  74. cashier_wallet.init_db().await?;
  75. if cashier_wallet.get_keypairs()?.is_empty() {
  76. cashier_wallet.key_gen()?;
  77. }
  78. let user_main_keypair = wallet.get_keypairs()?[0].clone();
  79. let cashier_main_keypair = cashier_wallet.get_keypairs()?[0].clone();
  80. wallet.put_cashier_pub(&cashier_main_keypair.public)?;
  81. // Load trusted setup parameters
  82. let (_, mint_pvk) = load_params(mint_params_path)?;
  83. let (_, spend_pvk) = load_params(spend_params_path)?;
  84. // Load trusted setup parameters
  85. let (cashier_mint_params, _) = load_params(cashier_mint_params_path)?;
  86. let (cashier_spend_params, _) = load_params(cashier_spend_params_path)?;
  87. //
  88. //
  89. //
  90. // user's state
  91. //
  92. //
  93. //
  94. let state = Arc::new(Mutex::new(State {
  95. tree: CommitmentTree::empty(),
  96. merkle_roots,
  97. nullifiers,
  98. mint_pvk,
  99. spend_pvk,
  100. wallet,
  101. }));
  102. //
  103. //
  104. //
  105. // cashier buid tx
  106. //
  107. //
  108. //
  109. let mut clear_inputs: Vec<tx::TransactionBuilderClearInputInfo> = vec![];
  110. let inputs: Vec<tx::TransactionBuilderInputInfo> = vec![];
  111. let mut outputs: Vec<tx::TransactionBuilderOutputInfo> = vec![];
  112. let token_id = jubjub::Fr::random(&mut OsRng);
  113. let value = 10;
  114. let signature_secret = cashier_main_keypair.private;
  115. let input = tx::TransactionBuilderClearInputInfo {
  116. value,
  117. token_id,
  118. signature_secret,
  119. };
  120. clear_inputs.push(input);
  121. outputs.push(tx::TransactionBuilderOutputInfo {
  122. value,
  123. token_id,
  124. public: user_main_keypair.public,
  125. });
  126. let builder = tx::TransactionBuilder {
  127. clear_inputs,
  128. inputs,
  129. outputs,
  130. };
  131. let tx = builder.build(&cashier_mint_params, &cashier_spend_params);
  132. //
  133. //
  134. //
  135. // user get the tx
  136. //
  137. //
  138. //
  139. let state = state.lock().await;
  140. let update = state_transition(&state, tx);
  141. if let Err(e) = update {
  142. println!("state transition error: {}", e.to_string());
  143. }
  144. Ok(())
  145. }