client_old.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. use crate::blockchain::{rocks::columns, Rocks, RocksColumn, Slab};
  2. use crate::cli::TransferParams;
  3. use crate::crypto::{
  4. load_params,
  5. merkle::{CommitmentTree, IncrementalWitness},
  6. merkle_node::MerkleNode,
  7. note::{EncryptedNote, Note},
  8. nullifier::Nullifier,
  9. save_params, setup_mint_prover, setup_spend_prover,
  10. };
  11. use crate::rpc::adapters::user_adapter::UserAdapter;
  12. use crate::rpc::jsonserver;
  13. use crate::serial::Encodable;
  14. use crate::serial::{deserialize, Decodable};
  15. use crate::service::{CashierClient, GatewayClient, GatewaySlabsSubscriber};
  16. use crate::state::{state_transition, ProgramState, StateUpdate};
  17. use crate::wallet::WalletPtr;
  18. use crate::{tx, Result};
  19. use super::{ClientFailed, ClientResult};
  20. use async_executor::Executor;
  21. use bellman::groth16;
  22. use bls12_381::Bls12;
  23. use log::*;
  24. use rusqlite::Connection;
  25. use async_std::sync::{Arc, Mutex};
  26. use futures::FutureExt;
  27. use std::net::SocketAddr;
  28. use std::path::PathBuf;
  29. pub struct Client {
  30. state: State,
  31. secret: jubjub::Fr,
  32. mint_params: bellman::groth16::Parameters<Bls12>,
  33. spend_params: bellman::groth16::Parameters<Bls12>,
  34. gateway: GatewayClient,
  35. }
  36. impl Client {
  37. pub fn new(
  38. secret: jubjub::Fr,
  39. rocks: Arc<Rocks>,
  40. gateway_addrs: (SocketAddr, SocketAddr),
  41. params_paths: (PathBuf, PathBuf),
  42. wallet_path: PathBuf,
  43. ) -> Result<Self> {
  44. let slabstore = RocksColumn::<columns::Slabs>::new(rocks.clone());
  45. let merkle_roots = RocksColumn::<columns::MerkleRoots>::new(rocks.clone());
  46. let nullifiers = RocksColumn::<columns::Nullifiers>::new(rocks);
  47. let mint_params_path = params_paths.0.to_str().unwrap_or("mint.params");
  48. let spend_params_path = params_paths.1.to_str().unwrap_or("spend.params");
  49. // Auto create trusted ceremony parameters if they don't exist
  50. if !params_paths.0.exists() {
  51. let params = setup_mint_prover();
  52. save_params(mint_params_path, &params)?;
  53. }
  54. if !params_paths.1.exists() {
  55. let params = setup_spend_prover();
  56. save_params(spend_params_path, &params)?;
  57. }
  58. // Load trusted setup parameters
  59. let (mint_params, mint_pvk) = load_params(mint_params_path)?;
  60. let (spend_params, spend_pvk) = load_params(spend_params_path)?;
  61. let state = State {
  62. tree: CommitmentTree::empty(),
  63. merkle_roots,
  64. nullifiers,
  65. mint_pvk,
  66. spend_pvk,
  67. wallet_path,
  68. };
  69. // create gateway client
  70. debug!(target: "CLIENT", "Creating GatewayClient");
  71. let gateway = GatewayClient::new(gateway_addrs.0, gateway_addrs.1, slabstore)?;
  72. Ok(Self {
  73. state,
  74. secret,
  75. mint_params,
  76. spend_params,
  77. gateway,
  78. })
  79. }
  80. pub async fn start(&mut self) -> Result<()> {
  81. self.gateway.start().await?;
  82. Ok(())
  83. }
  84. pub async fn connect_to_cashier(
  85. &mut self,
  86. executor: Arc<Executor<'_>>,
  87. wallet: WalletPtr,
  88. cashier_addr: SocketAddr,
  89. rpc_url: SocketAddr,
  90. ) -> Result<()> {
  91. // create cashier client
  92. debug!(target: "CLIENT", "Creating cashier client");
  93. let mut cashier_client = CashierClient::new(cashier_addr)?;
  94. // start subscribing
  95. debug!(target: "CLIENT", "Start subscriber");
  96. let gateway_slabs_sub: GatewaySlabsSubscriber =
  97. self.gateway.start_subscriber(executor.clone()).await?;
  98. // channels to request transfer from adapter
  99. let (transfer_req_send, transfer_req_recv) = async_channel::unbounded::<TransferParams>();
  100. let (transfer_rep_send, transfer_rep_recv) = async_channel::unbounded::<ClientResult<()>>();
  101. // channels to request deposit from adapter, send DRK key and receive BTC key
  102. let (deposit_req_send, deposit_req_recv) =
  103. async_channel::unbounded::<jubjub::SubgroupPoint>();
  104. let (deposit_rep_send, deposit_rep_recv) =
  105. async_channel::unbounded::<ClientResult<bitcoin::util::address::Address>>();
  106. // channel to request withdraw from adapter, send BTC key and receive DRK key
  107. let (withdraw_req_send, withdraw_req_recv) = async_channel::unbounded::<String>();
  108. let (withdraw_rep_send, withdraw_rep_recv) =
  109. async_channel::unbounded::<ClientResult<jubjub::SubgroupPoint>>();
  110. // start cashier_client
  111. cashier_client.start().await?;
  112. let adapter = Arc::new(UserAdapter::new(
  113. wallet.clone(),
  114. (transfer_req_send.clone(), transfer_rep_recv.clone()),
  115. (deposit_req_send.clone(), deposit_rep_recv.clone()),
  116. (withdraw_req_send.clone(), withdraw_rep_recv.clone()),
  117. )?);
  118. // start the rpc server
  119. debug!(target: "CLIENT", "Start RPC server");
  120. let io = Arc::new(adapter.handle_input()?);
  121. let _ = jsonserver::start(executor.clone(), rpc_url, io).await?;
  122. self.futures_broker(
  123. &mut cashier_client,
  124. wallet,
  125. gateway_slabs_sub.clone(),
  126. deposit_req_recv.clone(),
  127. deposit_rep_send.clone(),
  128. withdraw_req_recv.clone(),
  129. withdraw_rep_send.clone(),
  130. transfer_req_recv.clone(),
  131. transfer_rep_send.clone(),
  132. )
  133. .await?;
  134. Ok(())
  135. }
  136. pub async fn futures_broker(
  137. &mut self,
  138. cashier_client: &mut CashierClient,
  139. wallet: WalletPtr,
  140. gateway_slabs_sub: async_channel::Receiver<Slab>,
  141. deposit_req: async_channel::Receiver<jubjub::SubgroupPoint>,
  142. deposit_rep: async_channel::Sender<ClientResult<bitcoin::util::address::Address>>,
  143. withdraw_req: async_channel::Receiver<String>,
  144. withdraw_rep: async_channel::Sender<ClientResult<jubjub::SubgroupPoint>>,
  145. transfer_req: async_channel::Receiver<TransferParams>,
  146. transfer_rep: async_channel::Sender<ClientResult<()>>,
  147. ) -> Result<()> {
  148. loop {
  149. futures::select! {
  150. slab = gateway_slabs_sub.recv().fuse() => {
  151. let slab = slab?;
  152. let tx = tx::Transaction::decode(&slab.get_payload()[..])?;
  153. let update = state_transition(&self.state, tx)?;
  154. self.state.apply(update, wallet.clone()).await?;
  155. }
  156. deposit_addr = deposit_req.recv().fuse() => {
  157. let btc_public = cashier_client.get_address(deposit_addr?).await.map_err(|err| {ClientFailed::from(err)});
  158. if let Err(err) = btc_public {
  159. deposit_rep.send(Err(err)).await?;
  160. } else {
  161. if let Some(btc_addr) = btc_public? {
  162. deposit_rep.send(Ok(btc_addr)).await?;
  163. }else {
  164. deposit_rep.send(Err(ClientFailed::UnableToGetDepositAddress)).await?;
  165. }
  166. }
  167. }
  168. withdraw_addr = withdraw_req.recv().fuse() => {
  169. let drk_public = cashier_client.withdraw(withdraw_addr?).await.map_err(|err| {ClientFailed::from(err)});
  170. if let Err(err) = drk_public {
  171. withdraw_rep.send(Err(err)).await?;
  172. } else {
  173. if let Some(drk_addr) = drk_public? {
  174. withdraw_rep.send(Ok(drk_addr)).await?;
  175. }else {
  176. withdraw_rep.send(Err(ClientFailed::UnableToGetWithdrawAddress)).await?;
  177. }
  178. }
  179. }
  180. transfer_params = transfer_req.recv().fuse() => {
  181. let result = self.transfer(
  182. transfer_params?,
  183. wallet.clone()
  184. ).await;
  185. if let Err(err) = result {
  186. transfer_rep.send(Err(err)).await?;
  187. } else {
  188. transfer_rep.send(Ok(())).await?;
  189. }
  190. }
  191. }
  192. }
  193. }
  194. pub async fn transfer(
  195. &mut self,
  196. transfer_params: TransferParams,
  197. wallet: WalletPtr,
  198. ) -> ClientResult<()> {
  199. let pub_key = transfer_params.pub_key;
  200. let address = bs58::decode(pub_key.clone())
  201. .into_vec()
  202. .map_err(|_| ClientFailed::UnvalidAddress(pub_key.clone()))?;
  203. let address: jubjub::SubgroupPoint =
  204. deserialize(&address).map_err(|_| ClientFailed::UnvalidAddress(pub_key))?;
  205. let amount = transfer_params.amount;
  206. if amount <= 0.0 {
  207. return Err(ClientFailed::UnvalidAmount(amount as u64));
  208. }
  209. // check if there are coins
  210. let own_coins = wallet.get_own_coins()?;
  211. if own_coins.is_empty() {
  212. return Err(ClientFailed::NotEnoughValue(0));
  213. }
  214. let witness = &own_coins[0].3;
  215. let merkle_path = witness.path().unwrap();
  216. // Construct a new tx spending the coin
  217. let builder = tx::TransactionBuilder {
  218. clear_inputs: vec![],
  219. inputs: vec![tx::TransactionBuilderInputInfo {
  220. merkle_path,
  221. secret: self.secret.clone(),
  222. note: own_coins[0].1.clone(),
  223. }],
  224. // We can add more outputs to this list.
  225. // The only constraint is that sum(value in) == sum(value out)
  226. outputs: vec![tx::TransactionBuilderOutputInfo {
  227. value: amount as u64,
  228. asset_id: 1,
  229. public: address,
  230. }],
  231. };
  232. // Build the tx
  233. let mut tx_data = vec![];
  234. {
  235. let tx = builder.build(&self.mint_params, &self.spend_params);
  236. tx.encode(&mut tx_data).expect("encode tx");
  237. }
  238. // build slab from the transaction
  239. let slab = Slab::new(tx_data);
  240. self.gateway.put_slab(slab).await?;
  241. Ok(())
  242. }
  243. pub async fn connect_to_subscriber(
  244. client: Arc<Mutex<Client>>,
  245. executor: Arc<Executor<'_>>,
  246. wallet: WalletPtr,
  247. ) -> Result<()> {
  248. // start subscribing
  249. debug!(target: "CLIENT", "Start subscriber");
  250. let gateway_slabs_sub: GatewaySlabsSubscriber = client
  251. .lock()
  252. .await
  253. .gateway
  254. .start_subscriber(executor.clone())
  255. .await?;
  256. loop {
  257. let slab = gateway_slabs_sub.recv().await?;
  258. let tx = tx::Transaction::decode(&slab.get_payload()[..])?;
  259. let mut client = client.lock().await;
  260. let update = state_transition(&client.state, tx)?;
  261. client.state.apply(update, wallet.clone()).await?;
  262. }
  263. }
  264. }
  265. pub struct State {
  266. // The entire merkle tree state
  267. pub tree: CommitmentTree<MerkleNode>,
  268. // List of all previous and the current merkle roots
  269. // This is the hashed value of all the children.
  270. pub merkle_roots: RocksColumn<columns::MerkleRoots>,
  271. // Nullifiers prevent double spending
  272. pub nullifiers: RocksColumn<columns::Nullifiers>,
  273. // Mint verifying key used by ZK
  274. pub mint_pvk: groth16::PreparedVerifyingKey<Bls12>,
  275. // Spend verifying key used by ZK
  276. pub spend_pvk: groth16::PreparedVerifyingKey<Bls12>,
  277. // TODO: remove this
  278. wallet_path: PathBuf,
  279. }
  280. impl ProgramState for State {
  281. fn is_valid_cashier_public_key(&self, _public: &jubjub::SubgroupPoint) -> bool {
  282. // TODO: use walletdb instead of connecting with sqlite directly
  283. let conn =
  284. Connection::open(self.wallet_path.clone()).expect("Connect to database");
  285. let mut stmt = conn
  286. .prepare("SELECT key_public FROM cashier WHERE key_public IN (SELECT key_public)")
  287. .expect("Generate statement");
  288. stmt.exists([1i32]).expect("Read database")
  289. // do actual validity check
  290. }
  291. fn is_valid_merkle(&self, merkle_root: &MerkleNode) -> bool {
  292. self.merkle_roots
  293. .key_exist(*merkle_root)
  294. .expect("Check if the merkle_root valid")
  295. }
  296. fn nullifier_exists(&self, nullifier: &Nullifier) -> bool {
  297. self.nullifiers
  298. .key_exist(nullifier.repr)
  299. .expect("Check if nullifier exists")
  300. }
  301. // load from disk
  302. fn mint_pvk(&self) -> &groth16::PreparedVerifyingKey<Bls12> {
  303. &self.mint_pvk
  304. }
  305. fn spend_pvk(&self) -> &groth16::PreparedVerifyingKey<Bls12> {
  306. &self.spend_pvk
  307. }
  308. }
  309. impl State {
  310. pub async fn apply(&mut self, update: StateUpdate, wallet: WalletPtr) -> Result<()> {
  311. // Extend our list of nullifiers with the ones from the update
  312. for nullifier in update.nullifiers {
  313. self.nullifiers.put(nullifier, vec![] as Vec<u8>)?;
  314. }
  315. // Update merkle tree and witnesses
  316. for (coin, enc_note) in update.coins.into_iter().zip(update.enc_notes.into_iter()) {
  317. // Add the new coins to the merkle tree
  318. let node = MerkleNode::from_coin(&coin);
  319. self.tree.append(node).expect("Append to merkle tree");
  320. // Keep track of all merkle roots that have existed
  321. self.merkle_roots.put(self.tree.root(), vec![] as Vec<u8>)?;
  322. // Also update all the coin witnesses
  323. for witness in wallet.witnesses.lock().await.iter_mut() {
  324. witness.append(node).expect("Append to witness");
  325. }
  326. if let Some((note, secret)) = self.try_decrypt_note(wallet.clone(), enc_note).await {
  327. // We need to keep track of the witness for this coin.
  328. // This allows us to prove inclusion of the coin in the merkle tree with ZK.
  329. // Just as we update the merkle tree with every new coin, so we do the same with
  330. // the witness.
  331. // Derive the current witness from the current tree.
  332. // This is done right after we add our coin to the tree (but before any other
  333. // coins are added)
  334. // Make a new witness for this coin
  335. let witness = IncrementalWitness::from_tree(&self.tree);
  336. wallet.put_own_coins(coin.clone(), note.clone(), witness.clone(), secret)?;
  337. }
  338. }
  339. Ok(())
  340. }
  341. async fn try_decrypt_note(
  342. &self,
  343. wallet: WalletPtr,
  344. ciphertext: EncryptedNote,
  345. ) -> Option<(Note, jubjub::Fr)> {
  346. let secret = wallet.get_private().ok()?;
  347. match ciphertext.decrypt(&secret) {
  348. Ok(note) => {
  349. // ... and return the decrypted note for this coin.
  350. return Some((note, secret.clone()));
  351. }
  352. Err(_) => {}
  353. }
  354. // We weren't able to decrypt the note with our key.
  355. None
  356. }
  357. }