Просмотр исходного кода

clean up withdraw implementation

ghassmo 5 лет назад
Родитель
Сommit
c4c8234f65
2 измененных файлов с 31 добавлено и 26 удалено
  1. 14 9
      src/service/cashier.rs
  2. 17 17
      src/wallet/cashierdb.rs

+ 14 - 9
src/service/cashier.rs

@@ -195,11 +195,19 @@ impl CashierService {
             }
             1 => {
                 let btc_address = request.get_payload();
-                let btc_address: String = deserialize(&btc_address)?;
-                let _btc_address = bitcoin::util::address::Address::from_str(&btc_address)?;
-
-                let cashier_secret = cashier_wallet.get_cashier_private()?;
-                let cashier_public = zcash_primitives::constants::SPENDING_KEY_GENERATOR * cashier_secret;
+                //let btc_address: String = deserialize(&btc_address)?;
+                //let btc_address = bitcoin::util::address::Address::from_str(&btc_address)?;
+                //
+
+                let cashier_public: jubjub::SubgroupPoint;
+
+                if let Some(addr) = cashier_wallet.get_address_by_btc_key(&btc_address)? {
+                    cashier_public = deserialize(&addr)?;
+                } 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 mut reply = Reply::from(&request, CashierError::NoError as u32, vec![]);
 
@@ -235,10 +243,7 @@ impl CashierClient {
         Ok(())
     }
 
-    pub async fn withdraw(
-        &mut self,
-        btc_address: String,
-    ) -> Result<Option<jubjub::SubgroupPoint>> {
+    pub async fn withdraw(&mut self, btc_address: String) -> Result<Option<jubjub::SubgroupPoint>> {
         let handle_error = Arc::new(handle_error);
         let rep = self
             .protocol

+ 17 - 17
src/wallet/cashierdb.rs

@@ -96,17 +96,18 @@ impl CashierDb {
             "INSERT INTO keypairs(dkey_id, btc_key_private, btc_key_public)
             VALUES (:dkey_id, :btc_key_private, :btc_key_public)",
             named_params! {
-            ":dkey_id": dkey_pub,
-            ":btc_key_private": btc_private,
-            ":btc_key_private": btc_public,
+                ":dkey_id": dkey_pub,
+                ":btc_key_private": btc_private,
+                ":btc_key_private": btc_public,
             },
         )?;
         Ok(())
     }
 
-
-
-    pub fn is_btc_adddress_exist_in_withdraw_keypairs(&self, btc_address: &Vec<u8>) -> Result<bool> {
+    pub fn get_address_by_btc_key(
+        &self,
+        btc_address: &Vec<u8>,
+    ) -> Result<Option<Vec<u8>>> {
         debug!(target: "CashierDB", "Check for existing btc address");
         // open connection
         let conn = Connection::open(&self.path)?;
@@ -114,7 +115,8 @@ impl CashierDb {
         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>, _, _>([], |row| row.get(0))?;
+        let addr_iter =
+            stmt.query_map::<(Vec<u8>, Vec<u8>), _, _>([], |row| Ok((row.get(0)?, row.get(1)?)))?;
 
         let mut btc_addresses = vec![];
 
@@ -122,14 +124,14 @@ impl CashierDb {
             btc_addresses.push(addr);
         }
 
-        return Ok(!btc_address.is_empty())
+        if let Some(addr) = btc_addresses.pop() {
+            return Ok(Some(addr?.1));
+        }
+
+        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_public: Vec<u8>) -> Result<()> {
         debug!(target: "CashierDB", "Put withdraw keys");
 
         // open connection
@@ -141,15 +143,13 @@ impl CashierDb {
             "INSERT withdraw_keypairs(btc_key_id, d_key_public)
             VALUES (:btc_key_id, :d_key_public)",
             named_params! {
-            ":btc_key_id": btc_key_id,
-            ":d_key_public": d_key_public,
+                ":btc_key_id": btc_key_id,
+                ":d_key_public": d_key_public,
             },
         )?;
         Ok(())
     }
 
-
-
     pub fn cash_key_gen(&self) -> (Vec<u8>, Vec<u8>) {
         debug!(target: "cash key_gen", "Generating cashier keys...");
         let secret: jubjub::Fr = jubjub::Fr::random(&mut OsRng);