crypsinous.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. use std::sync::Arc;
  2. use clap::Parser;
  3. use easy_parallel::Parallel;
  4. use log::info;
  5. use smol::Executor;
  6. use url::Url;
  7. use darkfi::{
  8. consensus::{
  9. ouroboros::{EpochConsensus, Stakeholder},
  10. proto::{ProtocolSync, ProtocolTx},
  11. ValidatorState, TESTNET_GENESIS_HASH_BYTES, TESTNET_GENESIS_TIMESTAMP,
  12. },
  13. net,
  14. net::Settings,
  15. node::Client,
  16. util::{path::expand_path, time::Timestamp},
  17. wallet::walletdb::init_wallet,
  18. Result,
  19. };
  20. #[derive(Parser)]
  21. struct NetCli {
  22. #[clap(long, value_parser)]
  23. addr: Vec<String>,
  24. #[clap(long, value_parser, default_value = "/tmp/db")]
  25. path: String,
  26. #[clap(long, value_parser)]
  27. peers: Vec<String>,
  28. #[clap(long, value_parser)]
  29. seeds: Vec<String>,
  30. #[clap(long, value_parser, default_value = "0")]
  31. slots: u32,
  32. #[clap(long, value_parser)]
  33. wallet_path: String,
  34. #[clap(long, value_parser)]
  35. wallet_pass: String,
  36. }
  37. #[async_std::main]
  38. async fn main() -> Result<()> {
  39. env_logger::init();
  40. let args = NetCli::parse();
  41. let (signal, shutdown) = smol::channel::unbounded::<()>();
  42. let ex = Arc::new(Executor::new());
  43. let ex2 = ex.clone();
  44. let ex3 = ex2.clone();
  45. let (_, result) = Parallel::new()
  46. .each(0..4, |_| smol::future::block_on(ex2.run(shutdown.recv())))
  47. .finish(|| {
  48. smol::future::block_on(async move {
  49. start(args, ex3).await?;
  50. drop(signal);
  51. Ok(())
  52. })
  53. });
  54. result
  55. }
  56. async fn start(args: NetCli, ex: Arc<Executor<'_>>) -> Result<()> {
  57. let mut addr = vec![];
  58. for i in 0..args.addr.len() {
  59. addr.push(Url::parse(args.addr[i].as_str()).unwrap());
  60. }
  61. let mut peers = vec![];
  62. for i in 0..args.peers.len() {
  63. peers.push(Url::parse(args.peers[i].as_str()).unwrap());
  64. }
  65. let mut seeds = vec![];
  66. for i in 0..args.seeds.len() {
  67. seeds.push(Url::parse(args.seeds[i].as_str()).unwrap());
  68. }
  69. // initialize n stakeholders
  70. let settings = Settings {
  71. inbound: addr.clone(),
  72. outbound_connections: args.slots,
  73. manual_attempt_limit: 0,
  74. seed_query_timeout_seconds: 8,
  75. connect_timeout_seconds: 10,
  76. channel_handshake_seconds: 4,
  77. channel_heartbeat_seconds: 10,
  78. external_addr: addr,
  79. peers,
  80. seeds,
  81. ..Default::default()
  82. };
  83. let p2p = net::P2p::new(settings.clone()).await;
  84. //////////////////////////////
  85. // Initialize or load wallet
  86. let wallet = init_wallet(&args.wallet_path, &args.wallet_pass).await?;
  87. // Initialize or open sled database
  88. let db_path = format!("{}/{}", expand_path(&args.path)?.to_str().unwrap(), "testnet");
  89. let sled_db = sled::open(&db_path)?;
  90. // Initialize validator state
  91. let (genesis_ts, genesis_data) = (*TESTNET_GENESIS_TIMESTAMP, *TESTNET_GENESIS_HASH_BYTES);
  92. // TODO: sqldb init cleanup
  93. // Initialize client
  94. let client = Arc::new(Client::new(wallet.clone()).await?);
  95. // Parse cashier addresses
  96. let cashier_pubkeys = vec![wallet.get_default_keypair().await?.public];
  97. // Parse faucet addresses
  98. let faucet_pubkeys = vec![wallet.get_default_keypair().await?.public];
  99. // Initialize validator state
  100. let state = ValidatorState::new(
  101. &sled_db,
  102. genesis_ts,
  103. genesis_data,
  104. client,
  105. cashier_pubkeys,
  106. faucet_pubkeys,
  107. )
  108. .await?;
  109. let registry = p2p.protocol_registry();
  110. info!("Registering block sync P2P protocols...");
  111. let _state = state.clone();
  112. registry
  113. .register(net::SESSION_ALL, move |channel, p2p| {
  114. let state = _state.clone();
  115. async move { ProtocolSync::init(channel, state, p2p, false).await.unwrap() }
  116. })
  117. .await;
  118. let _state = state.clone();
  119. registry
  120. .register(net::SESSION_ALL, move |channel, p2p| {
  121. let state = _state.clone();
  122. async move { ProtocolTx::init(channel, state, p2p).await.unwrap() }
  123. })
  124. .await;
  125. //////////////////////////////
  126. let ex2 = ex.clone();
  127. p2p.clone().start(ex.clone()).await?;
  128. ex2.spawn(p2p.clone().run(ex.clone())).detach();
  129. let slots = 3;
  130. let epochs = 3;
  131. let ticks = 10;
  132. let reward = 1;
  133. let epoch_consensus = EpochConsensus::new(Some(slots), Some(epochs), Some(ticks), Some(reward));
  134. //proof's number of rows
  135. let k: u32 = 13;
  136. let path = args.path.clone();
  137. let id = Timestamp::current_time().0;
  138. let mut stakeholder =
  139. Stakeholder::new(epoch_consensus, p2p.clone(), settings.to_owned(), &path, id, Some(k))
  140. .await?;
  141. stakeholder.background(Some(100)).await;
  142. p2p.stop().await;
  143. Ok(())
  144. }