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

Add a function to cashierdb to get all withdraws private keys and a
function to delete withdraws keys records by btc address

ghassmo 4 лет назад
Родитель
Сommit
7d1d97c5ba
1 измененных файлов с 85 добавлено и 1 удалено
  1. 85 1
      src/wallet/cashierdb.rs

+ 85 - 1
src/wallet/cashierdb.rs

@@ -5,10 +5,12 @@ use crate::{Error, Result};
 
 
 use async_std::sync::Arc;
 use async_std::sync::Arc;
 
 
+use bitcoin::Address as BtcAddr;
 use log::*;
 use log::*;
-use rusqlite::{named_params, Connection};
+use rusqlite::{named_params, Connection, params};
 
 
 use std::path::PathBuf;
 use std::path::PathBuf;
+use std::str::FromStr;
 
 
 pub type CashierDbPtr = Arc<CashierDb>;
 pub type CashierDbPtr = Arc<CashierDb>;
 
 
@@ -102,6 +104,30 @@ impl CashierDb {
         Ok(())
         Ok(())
     }
     }
 
 
+    pub fn get_withdraw_private_keys(&self) -> Result<Vec<jubjub::Fr>> {
+        debug!(target: "CASHIERDB", "Get withdraw private keys");
+        // open connection
+        let conn = Connection::open(&self.path)?;
+        // unlock database
+        conn.pragma_update(None, "key", &self.password)?;
+
+        let mut stmt = conn.prepare("SELECT d_key_private FROM withdraw_keypairs")?;
+        let keys = stmt.query_map([], |row| {
+            let private_key: jubjub::Fr = self
+                .get_value_deserialized(row.get(0)?)
+                .expect("deserialize private key");
+            Ok(private_key)
+        })?;
+
+        let mut private_keys: Vec<jubjub::Fr> = vec![];
+
+        for k in keys {
+            private_keys.push(k?);
+        }
+
+        Ok(private_keys)
+    }
+
     // return (public key, private key)
     // return (public key, private key)
     pub fn get_address_by_btc_key(
     pub fn get_address_by_btc_key(
         &self,
         &self,
@@ -133,6 +159,64 @@ impl CashierDb {
         return Ok(None);
         return Ok(None);
     }
     }
 
 
+    pub fn get_btc_addr_by_address(
+        &self,
+        pub_key: jubjub::SubgroupPoint,
+    ) -> Result<Option<BtcAddr>> {
+        debug!(target: "CASHIERDB", "Get btc address by pub_key");
+        // open connection
+        let conn = Connection::open(&self.path)?;
+        // unlock database
+        conn.pragma_update(None, "key", &self.password)?;
+
+        let d_key_public = self.get_value_serialized(&pub_key)?;
+
+        let mut stmt = conn.prepare(
+            "SELECT btc_key_id FROM withdraw_keypairs where d_key_public = :d_key_public",
+        )?;
+        let addr_iter =
+            stmt.query_map::<BtcAddr, _, _>(&[(":d_key_public", &d_key_public)], |row| {
+                let btc_address: String = self
+                    .get_value_deserialized(row.get(0)?)
+                    .expect("deserialize btc address");
+                let btc_address = bitcoin::util::address::Address::from_str(&btc_address)
+                    .expect("get btc_address from_str");
+                Ok(btc_address)
+            })?;
+
+        let mut btc_addresses: Vec<BtcAddr> = vec![];
+
+        for addr in addr_iter {
+            btc_addresses.push(addr?);
+        }
+
+        Ok(btc_addresses.pop())
+    }
+
+    pub fn delete_withdraw_key_record(
+        &self,
+        btc_address: BtcAddr,
+    ) -> Result<()> {
+        debug!(target: "CASHIERDB", "Delete withdraw keys");
+
+        // open connection
+        let conn = Connection::open(&self.path)?;
+        // unlock database
+        conn.pragma_update(None, "key", &self.password)?;
+
+        let btc_address = btc_address.to_string();
+        let btc_address = self.get_value_serialized(&btc_address)?;
+
+        conn.execute(
+            "DELETE FROM withdraw_keypairs WHERE btc_key_id = ?1;",
+            params! [
+                btc_address
+            ],
+        )?;
+
+        Ok(())
+    }
+
     pub fn put_withdraw_keys(
     pub fn put_withdraw_keys(
         &self,
         &self,
         btc_key_id: Vec<u8>,
         btc_key_id: Vec<u8>,