Przeglądaj źródła

Add cashier function mint_dbtc

Janus 5 lat temu
rodzic
commit
c47057e25f
3 zmienionych plików z 56 dodań i 7 usunięć
  1. 1 1
      src/bin/cashierd.rs
  2. 41 5
      src/service/cashier.rs
  3. 14 1
      src/wallet/cashierdb.rs

+ 1 - 1
src/bin/cashierd.rs

@@ -6,7 +6,7 @@ use std::{path::Path, path::PathBuf};
 
 use drk::cli::{CashierdCli, CashierdConfig, Config};
 use drk::service::CashierService;
-use drk::wallet::{CashierDb, CashierDbPtr};
+use drk::wallet::CashierDb;
 
 use drk::util::join_config_path;
 use drk::Result;

+ 41 - 5
src/service/cashier.rs

@@ -3,7 +3,10 @@ use super::reqrep::{PeerId, RepProtocol, Reply, ReqProtocol, Request};
 use super::btc::{BitcoinKeys, PubAddress};
 
 use crate::{serial::deserialize, serial::serialize, Error, Result};
+use crate::serial::{Decodable, Encodable};
 use crate::wallet::{CashierDb, CashierDbPtr};
+use crate::tx;
+use crate::crypto::load_params;
 
 use std::net::SocketAddr;
 use async_std::sync::Arc;
@@ -24,13 +27,13 @@ enum CashierCommand {
 
 pub struct CashierService {
     addr: SocketAddr,
-    wallet: Arc<CashierDb>,
+    wallet: CashierDbPtr,
 }
 
 impl CashierService {
     pub fn new(
         addr: SocketAddr,
-        wallet: Arc<CashierDb>,
+        wallet: CashierDbPtr,
     )-> Result<Arc<CashierService>> {
 
         Ok(Arc::new(CashierService {
@@ -57,6 +60,39 @@ impl CashierService {
         Ok(())
     }
 
+    fn mint_dbtc(&self, dkey_pub: jubjub::SubgroupPoint, value: u64) -> Result<Vec<u8>> {
+        // Load trusted setup parameters
+        let (mint_params, _mint_pvk) = load_params("mint.params")?;
+        let (spend_params, _spend_pvk) = load_params("spend.params")?;
+
+
+        let cashier_secret = self.wallet.get_cashier_private().unwrap();
+
+        let builder = tx::TransactionBuilder {
+            clear_inputs: vec![tx::TransactionBuilderClearInputInfo {
+                value: value,
+                asset_id: 1,
+                signature_secret: cashier_secret,
+            }],
+            inputs: vec![],
+            outputs: vec![tx::TransactionBuilderOutputInfo {
+                value: value,
+                asset_id: 1,
+                public: dkey_pub,
+            }],
+        };
+
+        let mut tx_data = vec![];
+        {
+            // Build the tx
+            let tx = builder.build(&mint_params, &spend_params);
+            // Now serialize it
+            tx.encode(&mut tx_data).expect("encode tx");
+        }
+
+        Ok(tx_data)
+    }
+
     async fn handle_request_loop(
         self: Arc<Self>,
         send_queue: async_channel::Sender<(PeerId, Reply)>,
@@ -84,7 +120,7 @@ impl CashierService {
     }
     async fn handle_request(
         msg: (PeerId, Request),
-        cashier_wallet: Arc<CashierDb>,
+        cashier_wallet: CashierDbPtr,
         send_queue: async_channel::Sender<(PeerId, Reply)>,
     ) -> Result<()> {
         let request = msg.1;
@@ -99,8 +135,8 @@ impl CashierService {
 
                 let btc_pub = btc_keys.get_pubkey();
 
-                // add to cashier_wallet
-                //
+                // add to watchlist
+
 
                 let mut reply = Reply::from(&request, CashierError::NoError as u32, vec![]);
 

+ 14 - 1
src/wallet/cashierdb.rs

@@ -6,7 +6,7 @@ use crate::service::btc::{PrivKey, PubKey, PubAddress};
 
 use secp256k1::key::SecretKey;
 
-use async_std::sync::{Arc, Mutex};
+use async_std::sync::Arc;
 use ff::Field;
 use log::*;
 use rand::rngs::OsRng;
@@ -128,6 +128,19 @@ impl CashierDb {
         let public: jubjub::SubgroupPoint = self.get_value_deserialized(pub_keys)?;
         Ok(public)
     }
+    pub fn get_cashier_private(&self) -> Result<jubjub::Fr> {
+        debug!(target: "get", "Returning keys...");
+        let conn = Connection::open(&self.path)?;
+        conn.pragma_update(None, "key", &self.password)?;
+        let mut stmt = conn.prepare("SELECT key_private FROM keys")?;
+        let key_iter = stmt.query_map::<u8, _, _>([], |row| row.get(0))?;
+        let mut keys = Vec::new();
+        for key in key_iter {
+            keys.push(key?);
+        }
+        let private: jubjub::Fr = self.get_value_deserialized(keys)?;
+        Ok(private)
+    }
 
     pub fn test_wallet(&self) -> Result<()> {
         let conn = Connection::open(&self.path)?;