فهرست منبع

create a new public and private keypair for withdraw process

ghassmo 5 سال پیش
والد
کامیت
3639c6d20f
3فایلهای تغییر یافته به همراه32 افزوده شده و 22 حذف شده
  1. 2 1
      res/cashier.sql
  2. 12 13
      src/service/cashier.rs
  3. 18 8
      src/wallet/cashierdb.rs

+ 2 - 1
res/cashier.sql

@@ -11,6 +11,7 @@ CREATE TABLE IF NOT EXISTS keypairs(
 );
 CREATE TABLE IF NOT EXISTS withdraw_keypairs(
     btc_key_id INTEGER PRIMARY KEY NOT NULL,
-    d_key_public BLOB NOT NULL,
+	d_key_private BLOB NOT NULL,
+    d_key_public BLOB NOT NULL, 
     txid BLOB
 );

+ 12 - 13
src/service/cashier.rs

@@ -1,11 +1,6 @@
-use super::reqrep::{PeerId, RepProtocol, Reply, ReqProtocol, Request};
-
-use super::btc::{BitcoinKeys, PubAddress, PubKey};
-//use bitcoin::blockdata::script::Script;
-use electrum_client::bitcoin::Script;
-use electrum_client::{Client, ElectrumApi};
-
 use super::GatewayClient;
+use super::reqrep::{PeerId, RepProtocol, Reply, ReqProtocol, Request};
+use super::btc::{BitcoinKeys, PubAddress};
 use crate::blockchain::Slab;
 use crate::crypto::load_params;
 use crate::serial::{deserialize, serialize, Encodable};
@@ -15,14 +10,18 @@ use crate::{Error, Result};
 
 use bellman::groth16;
 use bls12_381::Bls12;
+use rand::rngs::OsRng;
+use ff::Field;
+//use bitcoin::blockdata::script::Script;
+use electrum_client::bitcoin::Script;
+use electrum_client::{Client, ElectrumApi};
 
+use log::*;
 use async_executor::Executor;
 
 use async_std::sync::Arc;
-use log::*;
 
 use std::net::SocketAddr;
-use std::str::FromStr;
 
 #[repr(u8)]
 enum CashierError {
@@ -202,11 +201,11 @@ impl CashierService {
                 let cashier_public: jubjub::SubgroupPoint;
 
                 if let Some(addr) = cashier_wallet.get_address_by_btc_key(&btc_address)? {
-                    cashier_public = deserialize(&addr)?;
+                    cashier_public = deserialize(&addr.1)?;
                 } else {
-                    let cashier_secret = cashier_wallet.get_cashier_private()?;
-                    cashier_public = cashier_wallet.get_cashier_public()?;
-                    cashier_wallet.put_withdraw_keys(btc_address, serialize(&cashier_public))?;
+                    let cashier_secret = jubjub::Fr::random(&mut OsRng);
+                    cashier_public = zcash_primitives::constants::SPENDING_KEY_GENERATOR * cashier_secret;
+                    cashier_wallet.put_withdraw_keys(btc_address, serialize(&cashier_secret), serialize(&cashier_public))?;
                 }
 
                 let mut reply = Reply::from(&request, CashierError::NoError as u32, vec![]);

+ 18 - 8
src/wallet/cashierdb.rs

@@ -104,19 +104,23 @@ impl CashierDb {
         Ok(())
     }
 
+    // return (private key, public key)
     pub fn get_address_by_btc_key(
         &self,
         btc_address: &Vec<u8>,
-    ) -> Result<Option<Vec<u8>>> {
+    ) -> Result<Option<(Vec<u8>, Vec<u8>)>> {
         debug!(target: "CashierDB", "Check for existing btc address");
         // open connection
         let conn = Connection::open(&self.path)?;
         // unlock database
         conn.pragma_update(None, "key", &self.password)?;
 
-        let mut stmt = conn.prepare("SELECT * FROM withdraw_keypairs where btc_key_id = ?")?;
-        let addr_iter =
-            stmt.query_map::<(Vec<u8>, Vec<u8>), _, _>([], |row| Ok((row.get(0)?, row.get(1)?)))?;
+        let mut stmt =
+            conn.prepare("SELECT * FROM withdraw_keypairs where btc_key_id = :btc_key_id")?;
+        let addr_iter = stmt
+            .query_map::<(Vec<u8>, Vec<u8>), _, _>(&[(":btc_key_id", btc_address)], |row| {
+                Ok((row.get(1)?, row.get(2)?))
+            })?;
 
         let mut btc_addresses = vec![];
 
@@ -125,13 +129,18 @@ impl CashierDb {
         }
 
         if let Some(addr) = btc_addresses.pop() {
-            return Ok(Some(addr?.1));
+            return Ok(Some(addr?));
         }
 
         return Ok(None);
     }
 
-    pub fn put_withdraw_keys(&self, btc_key_id: Vec<u8>, d_key_public: Vec<u8>) -> Result<()> {
+    pub fn put_withdraw_keys(
+        &self,
+        btc_key_id: Vec<u8>,
+        d_key_private: Vec<u8>,
+        d_key_public: Vec<u8>,
+    ) -> Result<()> {
         debug!(target: "CashierDB", "Put withdraw keys");
 
         // open connection
@@ -140,10 +149,11 @@ impl CashierDb {
         conn.pragma_update(None, "key", &self.password)?;
 
         conn.execute(
-            "INSERT withdraw_keypairs(btc_key_id, d_key_public)
-            VALUES (:btc_key_id, :d_key_public)",
+            "INSERT withdraw_keypairs(btc_key_id, d_key_private, d_key_public)
+            VALUES (:btc_key_id, :d_key_private, :d_key_public)",
             named_params! {
                 ":btc_key_id": btc_key_id,
+                ":d_key_private": d_key_private,
                 ":d_key_public": d_key_public,
             },
         )?;