main.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. use async_std::sync::{Arc, Mutex};
  2. use incrementalmerkletree::bridgetree::BridgeTree;
  3. use lazy_init::Lazy;
  4. use pasta_curves::{group::ff::Field, pallas::Base};
  5. use rand::rngs::OsRng;
  6. use serde::ser::{Serialize, SerializeStruct, Serializer};
  7. use darkfi::{
  8. blockchain::Blockchain,
  9. consensus::{TESTNET_GENESIS_HASH_BYTES, TESTNET_GENESIS_TIMESTAMP},
  10. crypto::{
  11. constants::MERKLE_DEPTH,
  12. keypair::{PublicKey, SecretKey},
  13. merkle_node::MerkleNode,
  14. },
  15. node::{
  16. state::{state_transition, ProgramState},
  17. Client, MemoryState, State,
  18. },
  19. util::{cli::progress_bar, expand_path},
  20. wallet::walletdb::init_wallet,
  21. };
  22. // Auxiliary struct to Serialize BridgeTree
  23. struct BridgeTreeWrapper {
  24. tree: BridgeTree<MerkleNode, MERKLE_DEPTH>,
  25. }
  26. impl Serialize for BridgeTreeWrapper {
  27. fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  28. where
  29. S: Serializer,
  30. {
  31. let mut state = serializer.serialize_struct("BridgeTreeWrapper", 1)?;
  32. state.serialize_field("tree", &self.tree)?;
  33. state.end()
  34. }
  35. }
  36. pub fn bridge_tree_usage(prefix: &str, tree: BridgeTree<MerkleNode, MERKLE_DEPTH>) {
  37. let wrapper = BridgeTreeWrapper { tree };
  38. let encoded: Vec<u8> =
  39. bincode::serde::encode_to_vec(&wrapper, bincode::config::legacy()).unwrap();
  40. let size = ::std::mem::size_of_val(&*encoded);
  41. println!(" {} size: {:?} Bytes", prefix, size);
  42. }
  43. #[async_std::main]
  44. async fn main() -> darkfi::Result<()> {
  45. // Config
  46. let folder = "~/.config/darkfi/merkle_testing";
  47. let genesis_ts = *TESTNET_GENESIS_TIMESTAMP;
  48. let genesis_data = *TESTNET_GENESIS_HASH_BYTES;
  49. let pass = "changeme";
  50. // Initialize
  51. let pb = progress_bar("Initializing wallet...");
  52. let path = folder.to_owned() + "/wallet.db";
  53. let wallet = init_wallet(&path, &pass).await?;
  54. let client = Arc::new(Client::new(wallet.clone()).await?);
  55. let address = wallet.get_default_address().await?;
  56. let pubkey = PublicKey::try_from(address)?;
  57. pb.finish();
  58. let pb = progress_bar("Initializing sled database...");
  59. let path = folder.to_owned() + "/blockchain/testnet";
  60. let db_path = expand_path(&path).unwrap();
  61. let sled_db = sled::open(&db_path)?;
  62. pb.finish();
  63. let pb = progress_bar("Generating state machine...");
  64. let blockchain = Blockchain::new(&sled_db, genesis_ts, genesis_data)?;
  65. let state_machine = State {
  66. tree: client.get_tree().await?,
  67. merkle_roots: blockchain.merkle_roots.clone(),
  68. nullifiers: blockchain.nullifiers.clone(),
  69. cashier_pubkeys: vec![],
  70. faucet_pubkeys: vec![pubkey.clone()],
  71. mint_vk: Lazy::new(),
  72. burn_vk: Lazy::new(),
  73. };
  74. pb.finish();
  75. let pb = progress_bar("Creating zk proof verification keys...");
  76. let _ = state_machine.mint_vk();
  77. let _ = state_machine.burn_vk();
  78. pb.finish();
  79. let pb = progress_bar("Generating memory state and secret keys...");
  80. let canon_state_clone = state_machine.clone();
  81. let mut state = state_machine;
  82. let mut mem_state = MemoryState::new(canon_state_clone);
  83. let state_arc = Arc::new(Mutex::new(state.clone()));
  84. let secret_keys: Vec<SecretKey> =
  85. client.get_keypairs().await?.iter().map(|x| x.secret).collect();
  86. pb.finish();
  87. // Initial size
  88. bridge_tree_usage("Original state", state.tree.clone());
  89. // Create txs token
  90. let token_id = Base::random(&mut OsRng);
  91. let amount = 1;
  92. // Generating and applying transactions
  93. let txs = 5;
  94. println!(" Applying {} transactions...", txs);
  95. for i in 0..txs {
  96. println!(" tx {}", i);
  97. let tx =
  98. match client.build_transaction(pubkey, amount, token_id, true, state_arc.clone()).await
  99. {
  100. Ok(v) => v,
  101. Err(e) => {
  102. println!("Failed building transaction: {}", e);
  103. return Err(e.into())
  104. }
  105. };
  106. let update = match state_transition(&mem_state, tx.clone()) {
  107. Ok(v) => v,
  108. Err(e) => {
  109. println!("validate_state_transition(): Failed for tx {}: {}", i, e);
  110. return Err(e.into())
  111. }
  112. };
  113. mem_state.apply(update.clone());
  114. state.apply(update, secret_keys.clone(), None, client.wallet.clone()).await?;
  115. }
  116. // Final size
  117. bridge_tree_usage("Final state", state.tree);
  118. Ok(())
  119. }