main.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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> = bincode::serialize(&wrapper).unwrap();
  39. let size = ::std::mem::size_of_val(&*encoded);
  40. println!(" {} size: {:?} Bytes", prefix, size);
  41. }
  42. #[async_std::main]
  43. async fn main() -> darkfi::Result<()> {
  44. // Config
  45. let folder = "~/.config/darkfi/merkle_testing";
  46. let genesis_ts = *TESTNET_GENESIS_TIMESTAMP;
  47. let genesis_data = *TESTNET_GENESIS_HASH_BYTES;
  48. let pass = "changeme";
  49. // Initialize
  50. let pb = progress_bar("Initializing wallet...");
  51. let path = folder.to_owned() + "/wallet.db";
  52. let wallet = init_wallet(&path, &pass).await?;
  53. let client = Arc::new(Client::new(wallet.clone()).await?);
  54. let address = wallet.get_default_address().await?;
  55. let pubkey = PublicKey::try_from(address)?;
  56. pb.finish();
  57. let pb = progress_bar("Initializing sled database...");
  58. let path = folder.to_owned() + "/blockchain/testnet";
  59. let db_path = expand_path(&path).unwrap();
  60. let sled_db = sled::open(&db_path)?;
  61. pb.finish();
  62. let pb = progress_bar("Generating state machine...");
  63. let blockchain = Blockchain::new(&sled_db, genesis_ts, genesis_data)?;
  64. let state_machine = State {
  65. tree: client.get_tree().await?,
  66. merkle_roots: blockchain.merkle_roots.clone(),
  67. nullifiers: blockchain.nullifiers.clone(),
  68. cashier_pubkeys: vec![],
  69. faucet_pubkeys: vec![pubkey.clone()],
  70. mint_vk: Lazy::new(),
  71. burn_vk: Lazy::new(),
  72. };
  73. pb.finish();
  74. let pb = progress_bar("Creating zk proof verification keys...");
  75. let _ = state_machine.mint_vk();
  76. let _ = state_machine.burn_vk();
  77. pb.finish();
  78. let pb = progress_bar("Generating memory state and secret keys...");
  79. let canon_state_clone = state_machine.clone();
  80. let mut state = state_machine;
  81. let mut mem_state = MemoryState::new(canon_state_clone);
  82. let state_arc = Arc::new(Mutex::new(state.clone()));
  83. let secret_keys: Vec<SecretKey> =
  84. client.get_keypairs().await?.iter().map(|x| x.secret).collect();
  85. pb.finish();
  86. // Initial size
  87. bridge_tree_usage("Original state", state.tree.clone());
  88. // Create txs token
  89. let token_id = Base::random(&mut OsRng);
  90. let amount = 1;
  91. // Generating and applying transactions
  92. let txs = 5;
  93. println!(" Applying {} transactions...", txs);
  94. for i in 0..txs {
  95. println!(" tx {}", i);
  96. let tx =
  97. match client.build_transaction(pubkey, amount, token_id, true, state_arc.clone()).await
  98. {
  99. Ok(v) => v,
  100. Err(e) => {
  101. println!("Failed building transaction: {}", e);
  102. return Err(e.into())
  103. }
  104. };
  105. let update = match state_transition(&mem_state, tx.clone()) {
  106. Ok(v) => v,
  107. Err(e) => {
  108. println!("validate_state_transition(): Failed for tx {}: {}", i, e);
  109. return Err(e.into())
  110. }
  111. };
  112. mem_state.apply(update.clone());
  113. state.apply(update, secret_keys.clone(), None, client.wallet.clone()).await?;
  114. }
  115. // Final size
  116. bridge_tree_usage("Final state", state.tree);
  117. Ok(())
  118. }