darkfid.rs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. use async_std::sync::Arc;
  2. use rand::rngs::OsRng;
  3. use std::net::SocketAddr;
  4. use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
  5. use drk::crypto::{
  6. coin::Coin,
  7. load_params,
  8. merkle::{CommitmentTree, IncrementalWitness},
  9. merkle_node::MerkleNode,
  10. note::{EncryptedNote, Note},
  11. nullifier::Nullifier,
  12. save_params, setup_mint_prover, setup_spend_prover,
  13. };
  14. use drk::serial::{deserialize, Decodable};
  15. use drk::service::{ClientProgramOptions, GatewayClient, GatewaySlabsSubscriber};
  16. use drk::state::{state_transition, ProgramState, StateUpdate};
  17. use drk::wallet::WalletDB;
  18. use drk::{tx, Result, Error};
  19. use rusqlite::Connection;
  20. use async_executor::Executor;
  21. use bellman::groth16;
  22. use bls12_381::Bls12;
  23. use easy_parallel::Parallel;
  24. use ff::Field;
  25. use std::path::Path;
  26. #[allow(dead_code)]
  27. pub struct State {
  28. // The entire merkle tree state
  29. tree: CommitmentTree<MerkleNode>,
  30. // List of all previous and the current merkle roots
  31. // This is the hashed value of all the children.
  32. merkle_roots: RocksColumn<columns::MerkleRoots>,
  33. // Nullifiers prevent double spending
  34. nullifiers: RocksColumn<columns::Nullifiers>,
  35. // All received coins
  36. own_coins: Vec<(Coin, Note, jubjub::Fr, IncrementalWitness<MerkleNode>)>,
  37. // Mint verifying key used by ZK
  38. mint_pvk: groth16::PreparedVerifyingKey<Bls12>,
  39. // Spend verifying key used by ZK
  40. spend_pvk: groth16::PreparedVerifyingKey<Bls12>,
  41. // Public key of the cashier
  42. cashier_public: jubjub::SubgroupPoint,
  43. // List of all our secret keys
  44. secrets: Vec<jubjub::Fr>,
  45. }
  46. impl ProgramState for State {
  47. fn is_valid_cashier_public_key(&self, _public: &jubjub::SubgroupPoint) -> bool {
  48. //let path = WalletDB::path("cashier.db").expect("Failed to find path");
  49. //let connect = Connection::open(&path).expect("Failed to connect to database.");
  50. //let mut stmt = connect
  51. // .prepare("SELECT key_public FROM cashier WHERE key_public IN (SELECT key_public)")
  52. // .expect("Cannot generate statement.");
  53. //stmt.exists([1i32]).unwrap()
  54. 0
  55. }
  56. fn is_valid_merkle(&self, merkle_root: &MerkleNode) -> bool {
  57. self.merkle_roots
  58. .key_exist(*merkle_root)
  59. .expect("couldn't check if the merkle_root valid")
  60. }
  61. fn nullifier_exists(&self, nullifier: &Nullifier) -> bool {
  62. self.nullifiers
  63. .key_exist(nullifier.repr)
  64. .expect("couldn't check if nullifier exists")
  65. }
  66. // load from disk
  67. fn mint_pvk(&self) -> &groth16::PreparedVerifyingKey<Bls12> {
  68. &self.mint_pvk
  69. }
  70. fn spend_pvk(&self) -> &groth16::PreparedVerifyingKey<Bls12> {
  71. &self.spend_pvk
  72. }
  73. }
  74. impl State {
  75. fn apply(&mut self, update: StateUpdate) -> Result<()> {
  76. // Extend our list of nullifiers with the ones from the update
  77. for nullifier in update.nullifiers {
  78. self.nullifiers.put(nullifier, vec![] as Vec<u8>)?;
  79. }
  80. // Update merkle tree and witnesses
  81. for (coin, enc_note) in update.coins.into_iter().zip(update.enc_notes.into_iter()) {
  82. // Add the new coins to the merkle tree
  83. let node = MerkleNode::from_coin(&coin);
  84. self.tree.append(node).expect("Append to merkle tree");
  85. // Keep track of all merkle roots that have existed
  86. self.merkle_roots.put(self.tree.root(), vec![] as Vec<u8>)?;
  87. // Also update all the coin witnesses
  88. for (_, _, _, witness) in self.own_coins.iter_mut() {
  89. witness.append(node).expect("append to witness");
  90. }
  91. // if let Some((note, secret)) = self.try_decrypt_note(enc_note) {
  92. // // We need to keep track of the witness for this coin.
  93. // // This allows us to prove inclusion of the coin in the merkle tree with ZK.
  94. // // Just as we update the merkle tree with every new coin, so we do the same with
  95. // // the witness.
  96. // // Derive the current witness from the current tree.
  97. // // This is done right after we add our coin to the tree (but before any other
  98. // // coins are added)
  99. // // Make a new witness for this coin
  100. // let witness = IncrementalWitness::from_tree(&self.tree);
  101. // self.own_coins.push((coin, note, secret, witness));
  102. // }
  103. }
  104. Ok(())
  105. }
  106. // sql
  107. async fn try_decrypt_note(&self, ciphertext: EncryptedNote) -> Option<(Note, jubjub::Fr)> {
  108. //let path = WalletDB::path("wallet.db")?;
  109. //let vec = WalletDB::get_private(path)?;
  110. //let secret = WalletDB::get_value_deserialized(vec).await?;
  111. //let mut stmt = connect.prepare("SELECT key_private FROM keys").ok()?;
  112. //let key_iter = stmt.query_map::<String, _, _>([], |row| row.get(0)).ok()?;
  113. //for key in key_iter {
  114. // println!("Foun//d key {:?}", key.unwrap());
  115. //}
  116. //
  117. //match stmt {
  118. //let mut stmt = connect
  119. // .prepare("SELECT key_public FROM cashier WHERE key_public IN (SELECT key_public)")
  120. //.expect("Cannot generate statement.");
  121. // test this
  122. //stmt.exists([1i32]).unwrap()
  123. // Some(v) => {
  124. // Ok(Some(v))
  125. // }
  126. // None => Ok(None),
  127. //}
  128. //match ciphertext.decrypt(&secret) {
  129. // Ok(note) => {
  130. // // ... and return the decrypted note for this coin.
  131. // return Some((note, secret.clone()));
  132. // }
  133. // Err(_) => {
  134. // println!("Cannot decrypt note! {}", err)
  135. // }
  136. //}
  137. None
  138. }
  139. }
  140. fn setup_addr(address: Option<SocketAddr>, default: SocketAddr) -> SocketAddr {
  141. match address {
  142. Some(addr) => addr,
  143. None => default,
  144. }
  145. }
  146. pub async fn subscribe(gateway_slabs_sub: GatewaySlabsSubscriber, mut state: State) -> Result<()> {
  147. loop {
  148. let slab = gateway_slabs_sub.recv().await?;
  149. let tx = tx::Transaction::decode(&slab.get_payload()[..])?;
  150. let update = state_transition(&state, tx)?;
  151. state.apply(update)?;
  152. }
  153. }
  154. async fn start(executor: Arc<Executor<'_>>, options: ClientProgramOptions) -> Result<()> {
  155. let connect_addr: SocketAddr = setup_addr(options.connect_addr, "127.0.0.1:3333".parse()?);
  156. let sub_addr: SocketAddr = setup_addr(options.sub_addr, "127.0.0.1:4444".parse()?);
  157. let database_path = options.database_path.as_path();
  158. let rocks = Rocks::new(database_path)?;
  159. let slabstore = RocksColumn::<columns::Slabs>::new(rocks.clone());
  160. //
  161. // Auto create trusted ceremony parameters if they don't exist
  162. if !Path::new("mint.params").exists() {
  163. let params = setup_mint_prover();
  164. save_params("mint.params", &params)?;
  165. }
  166. if !Path::new("spend.params").exists() {
  167. let params = setup_spend_prover();
  168. save_params("spend.params", &params)?;
  169. }
  170. // Load trusted setup parameters
  171. let (_mint_params, mint_pvk) = load_params("mint.params")?;
  172. let (_spend_params, spend_pvk) = load_params("spend.params")?;
  173. let cashier_secret = jubjub::Fr::random(&mut OsRng);
  174. let cashier_public = zcash_primitives::constants::SPENDING_KEY_GENERATOR * cashier_secret;
  175. // wallet secret key
  176. let secret = jubjub::Fr::random(&mut OsRng);
  177. // wallet public key
  178. let _public = zcash_primitives::constants::SPENDING_KEY_GENERATOR * secret;
  179. let merkle_roots = RocksColumn::<columns::MerkleRoots>::new(rocks.clone());
  180. let nullifiers = RocksColumn::<columns::Nullifiers>::new(rocks);
  181. let state = State {
  182. tree: CommitmentTree::empty(),
  183. merkle_roots,
  184. nullifiers,
  185. own_coins: vec![],
  186. mint_pvk,
  187. spend_pvk,
  188. cashier_public,
  189. secrets: vec![secret.clone()],
  190. };
  191. // create gateway client
  192. let mut client = GatewayClient::new(connect_addr, slabstore)?;
  193. // start subscribing
  194. let gateway_slabs_sub: GatewaySlabsSubscriber =
  195. client.start_subscriber(sub_addr, executor.clone()).await?;
  196. let subscribe_task = executor.spawn(subscribe(gateway_slabs_sub, state));
  197. // start gateway client
  198. client.start().await?;
  199. subscribe_task.cancel().await;
  200. Ok(())
  201. }
  202. fn main() -> Result<()> {
  203. use simplelog::*;
  204. let ex = Arc::new(Executor::new());
  205. let (signal, shutdown) = async_channel::unbounded::<()>();
  206. let options = ClientProgramOptions::load()?;
  207. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  208. let debug_level = if options.verbose {
  209. LevelFilter::Debug
  210. } else {
  211. LevelFilter::Off
  212. };
  213. CombinedLogger::init(vec![
  214. TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
  215. WriteLogger::new(
  216. LevelFilter::Debug,
  217. Config::default(),
  218. std::fs::File::create(options.log_path.as_path()).unwrap(),
  219. ),
  220. ])
  221. .unwrap();
  222. let ex2 = ex.clone();
  223. let (_, result) = Parallel::new()
  224. // Run four executor threads.
  225. .each(0..3, |_| smol::future::block_on(ex.run(shutdown.recv())))
  226. // Run the main future on the current thread.
  227. .finish(|| {
  228. smol::future::block_on(async move {
  229. start(ex2, options).await?;
  230. drop(signal);
  231. Ok::<(), drk::Error>(())
  232. })
  233. });
  234. result
  235. }
  236. //// $ cargo test test_ten_clients_simultaneously --bin darkfid
  237. //this will run 10 clients simultaneously
  238. //// $ cargo test test_subscriber --bin darkfid
  239. // Run Client A and send 10 slabs
  240. // Client B should receive 10 slabs from subscriber
  241. #[cfg(test)]
  242. mod test {
  243. use std::net::SocketAddr;
  244. use std::path::Path;
  245. use std::sync::Arc;
  246. use drk::blockchain::{rocks::columns, Rocks, RocksColumn, Slab};
  247. use drk::service::{GatewayClient, GatewaySlabsSubscriber};
  248. use async_executor::Executor;
  249. use easy_parallel::Parallel;
  250. use log::*;
  251. use rand::Rng;
  252. use simplelog::*;
  253. pub async fn subscribe(gateway_slabs_sub: GatewaySlabsSubscriber, id: String) {
  254. loop {
  255. gateway_slabs_sub.recv().await.unwrap();
  256. info!("Client {}: update state", id);
  257. }
  258. }
  259. fn setup_log() {
  260. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  261. CombinedLogger::init(vec![
  262. TermLogger::new(LevelFilter::Debug, logger_config, TerminalMode::Mixed).unwrap(),
  263. WriteLogger::new(
  264. LevelFilter::Debug,
  265. Config::default(),
  266. std::fs::File::create(Path::new("/tmp/dar.log")).unwrap(),
  267. ),
  268. ])
  269. .unwrap();
  270. }
  271. #[test]
  272. fn test_ten_clients_simultaneously() {
  273. setup_log();
  274. let mut thread_pools: Vec<std::thread::JoinHandle<()>> = vec![];
  275. for _ in 0..10 {
  276. let thread = std::thread::spawn(|| {
  277. let ex = Arc::new(Executor::new());
  278. let (signal, shutdown) = async_channel::unbounded::<()>();
  279. let ex2 = ex.clone();
  280. let (_, _) = Parallel::new()
  281. // Run four executor threads.
  282. .each(0..3, |_| smol::future::block_on(ex2.run(shutdown.recv())))
  283. // Run the main future on the current thread.
  284. .finish(|| {
  285. smol::future::block_on(async move {
  286. let connect_addr: SocketAddr = "127.0.0.1:3333".parse().unwrap();
  287. let sub_addr: SocketAddr = "127.0.0.1:4444".parse().unwrap();
  288. let mut rng = rand::thread_rng();
  289. let rnd: u32 = rng.gen();
  290. let path_str = format!("database_{}.db", rnd);
  291. let database_path = Path::new(path_str.as_str());
  292. let rocks = Rocks::new(database_path.clone()).unwrap();
  293. let slabstore = RocksColumn::<columns::Slabs>::new(rocks.clone());
  294. // create gateway client
  295. let mut client = GatewayClient::new(connect_addr, slabstore).unwrap();
  296. // start subscribing
  297. let gateway_slabs_sub: GatewaySlabsSubscriber =
  298. client.start_subscriber(sub_addr, ex.clone()).await.unwrap();
  299. ex.clone()
  300. .spawn(subscribe(gateway_slabs_sub, rnd.clone().to_string()))
  301. .detach();
  302. // start gateway client
  303. client.start().await.unwrap();
  304. let slab = Slab::new("btc".to_string(), rnd.to_le_bytes().to_vec());
  305. client.put_slab(slab).await.unwrap();
  306. });
  307. drop(signal);
  308. Ok::<(), drk::Error>(())
  309. });
  310. });
  311. thread_pools.push(thread);
  312. }
  313. for t in thread_pools {
  314. t.join().unwrap();
  315. }
  316. }
  317. #[test]
  318. fn test_subscriber() {
  319. setup_log();
  320. let mut thread_pools: Vec<std::thread::JoinHandle<()>> = vec![];
  321. // Client A
  322. let thread = std::thread::spawn(|| {
  323. smol::future::block_on(async move {
  324. let connect_addr: SocketAddr = "127.0.0.1:3333".parse().unwrap();
  325. let mut rng = rand::thread_rng();
  326. let rnd: u32 = rng.gen();
  327. let path_str = format!("database_{}.db", rnd);
  328. let database_path = Path::new(path_str.as_str());
  329. let rocks = Rocks::new(database_path.clone()).unwrap();
  330. let slabstore = RocksColumn::<columns::Slabs>::new(rocks.clone());
  331. // create gateway client
  332. let mut client = GatewayClient::new(connect_addr, slabstore).unwrap();
  333. // start gateway client
  334. client.start().await.unwrap();
  335. let slab = Slab::new("btc".to_string(), rnd.to_le_bytes().to_vec());
  336. client.put_slab(slab.clone()).await.unwrap();
  337. client.put_slab(slab.clone()).await.unwrap();
  338. client.put_slab(slab.clone()).await.unwrap();
  339. client.put_slab(slab.clone()).await.unwrap();
  340. client.put_slab(slab.clone()).await.unwrap();
  341. client.put_slab(slab.clone()).await.unwrap();
  342. client.put_slab(slab.clone()).await.unwrap();
  343. client.put_slab(slab.clone()).await.unwrap();
  344. client.put_slab(slab.clone()).await.unwrap();
  345. client.put_slab(slab.clone()).await.unwrap();
  346. });
  347. });
  348. // Client B
  349. let thread2 = std::thread::spawn(|| {
  350. let ex = Arc::new(Executor::new());
  351. let (signal, shutdown) = async_channel::unbounded::<()>();
  352. let ex2 = ex.clone();
  353. let (_, _) = Parallel::new()
  354. // Run four executor threads.
  355. .each(0..3, |_| smol::future::block_on(ex2.run(shutdown.recv())))
  356. // Run the main future on the current thread.
  357. .finish(|| {
  358. smol::future::block_on(async move {
  359. let connect_addr: SocketAddr = "127.0.0.1:3333".parse().unwrap();
  360. let sub_addr: SocketAddr = "127.0.0.1:4444".parse().unwrap();
  361. let mut rng = rand::thread_rng();
  362. let rnd: u32 = rng.gen();
  363. let path_str = format!("database_{}.db", rnd);
  364. let database_path = Path::new(path_str.as_str());
  365. let rocks = Rocks::new(database_path.clone()).unwrap();
  366. let slabstore = RocksColumn::<columns::Slabs>::new(rocks.clone());
  367. // create gateway client
  368. let mut client = GatewayClient::new(connect_addr, slabstore).unwrap();
  369. // start subscribing
  370. let gateway_slabs_sub: GatewaySlabsSubscriber =
  371. client.start_subscriber(sub_addr, ex.clone()).await.unwrap();
  372. ex.clone()
  373. .spawn(subscribe(gateway_slabs_sub, "B".to_string()))
  374. .detach();
  375. // start gateway client
  376. client.start().await.unwrap();
  377. // sleep for 2 seconds
  378. std::thread::sleep(std::time::Duration::from_secs(2));
  379. });
  380. drop(signal);
  381. Ok::<(), drk::Error>(())
  382. });
  383. });
  384. thread_pools.push(thread);
  385. thread_pools.push(thread2);
  386. for t in thread_pools {
  387. t.join().unwrap();
  388. }
  389. }
  390. }