Răsfoiți Sursa

handle transfer command from darkfid

ghassmo 5 ani în urmă
părinte
comite
eb9511cb49
4 a modificat fișierele cu 61 adăugiri și 27 ștergeri
  1. 22 7
      src/bin/darkfid.rs
  2. 14 5
      src/rpc/adapter.rs
  3. 11 15
      src/rpc/jsonserver.rs
  4. 14 0
      src/rpc/mod.rs

+ 22 - 7
src/bin/darkfid.rs

@@ -1,5 +1,5 @@
-use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
-use drk::cli::{DarkfidCli, DarkfidConfig, Config};
+use drk::blockchain::{rocks::columns, Rocks, RocksColumn, Slab};
+use drk::cli::{Config, DarkfidCli, DarkfidConfig};
 use drk::crypto::{
     load_params,
     merkle::{CommitmentTree, IncrementalWitness},
@@ -31,7 +31,6 @@ use std::net::SocketAddr;
 use std::path::Path;
 use std::path::PathBuf;
 
-#[allow(dead_code)]
 pub struct State {
     // The entire merkle tree state
     tree: CommitmentTree<MerkleNode>,
@@ -40,7 +39,6 @@ pub struct State {
     merkle_roots: RocksColumn<columns::MerkleRoots>,
     // Nullifiers prevent double spending
     nullifiers: RocksColumn<columns::Nullifiers>,
-    // All received coins
     // Mint verifying key used by ZK
     mint_pvk: groth16::PreparedVerifyingKey<Bls12>,
     // Spend verifying key used by ZK
@@ -156,7 +154,6 @@ async fn start(executor: Arc<Executor<'_>>, config: Arc<&DarkfidConfig>) -> Resu
 
     let rocks2 = rocks.clone();
     let slabstore = RocksColumn::<columns::Slabs>::new(rocks2.clone());
-    let rocks3 = rocks2.clone();
 
     // Auto create trusted ceremony parameters if they don't exist
     if !Path::new("mint.params").exists() {
@@ -210,7 +207,26 @@ async fn start(executor: Arc<Executor<'_>>, config: Arc<&DarkfidConfig>) -> Resu
     debug!(target: "fn::start client", "start() Client started");
     client.start().await?;
 
-    let adapter = RpcAdapter::new(wallet.clone(), config.connect_url.clone())?;
+    let (publish_tx_send, publish_tx_recv) = async_channel::unbounded::<drk::rpc::TransferParams>();
+
+    let adapter = RpcAdapter::new(wallet.clone(), config.connect_url.clone(), publish_tx_send)?;
+
+    executor
+        .spawn(async move {
+            loop {
+                let _transfer_params = publish_tx_recv
+                    .recv()
+                    .await
+                    .expect("receive transfer params");
+
+                let tx_data = vec![];
+
+                let slab = Slab::new(tx_data);
+                client.put_slab(slab).await.expect("put slab");
+            }
+        })
+        .detach();
+
     // start the rpc server
     jsonserver::start(ex.clone(), config.clone(), adapter).await?;
 
@@ -272,4 +288,3 @@ fn main() -> Result<()> {
 
     result
 }
-

+ 14 - 5
src/rpc/adapter.rs

@@ -2,7 +2,8 @@ use crate::service::btc::PubAddress;
 use crate::service::cashier::CashierClient;
 use crate::wallet::WalletDb;
 use crate::{Error, Result};
-use crate::tx;
+
+use super::TransferParams;
 
 use log::*;
 
@@ -15,18 +16,23 @@ pub struct RpcAdapter {
     pub wallet: Arc<WalletDb>,
     pub cashier_client: CashierClient,
     pub connect_url: String,
-
+    publish_tx_send: async_channel::Sender<TransferParams>,
 }
 
 impl RpcAdapter {
-    pub fn new(wallet: Arc<WalletDb>, connect_url: String) -> Result<Self> {
+    pub fn new(
+        wallet: Arc<WalletDb>,
+        connect_url: String,
+        publish_tx_send: async_channel::Sender<TransferParams>,
+    ) -> Result<Self> {
         debug!(target: "ADAPTER", "new() [CREATING NEW WALLET]");
-        let connect_addr: SocketAddr = connect_url.parse().unwrap();
+        let connect_addr: SocketAddr = connect_url.parse()?;
         let cashier_client = CashierClient::new(connect_addr)?;
         Ok(Self {
             wallet,
             cashier_client,
             connect_url,
+            publish_tx_send
         })
     }
 
@@ -89,7 +95,10 @@ impl RpcAdapter {
         }
     }
 
-
+    pub async fn transfer(&self, transfer_params: TransferParams) -> Result<()> {
+        self.publish_tx_send.send(transfer_params).await?;
+        Ok(())
+    }
 
     pub fn get_info(&self) {}
 

+ 11 - 15
src/rpc/jsonserver.rs

@@ -2,28 +2,19 @@ use crate::cli::DarkfidConfig;
 use crate::rpc::adapter::RpcAdapter;
 use crate::{Error, Result};
 
+use super::{TransferParams, WithdrawParams};
+
 use async_executor::Executor;
 use async_native_tls::TlsAcceptor;
 use async_std::sync::Mutex;
 use http_types::{Request, Response, StatusCode};
 use log::*;
-use serde::Deserialize;
 use smol::Async;
 
 use std::net::TcpListener;
 use std::sync::Arc;
 
-#[derive(Deserialize, Debug)]
-pub struct TransferParams {
-    address: String,
-    amount: String,
-}
 
-#[derive(Deserialize, Debug)]
-pub struct WithdrawParams {
-    address: String,
-    amount: String,
-}
 
 /// Listens for incoming connections and serves them.
 pub async fn listen(
@@ -254,10 +245,15 @@ impl RpcInterface {
             }
         });
 
-        io.add_method("transfer", |params: jsonrpc_core::Params| async move {
-            let parsed: TransferParams = params.parse().unwrap();
-            println!("test transfer params:  {:?}", parsed);
-            Ok(jsonrpc_core::Value::String("Transfer To... ".into()))
+        let self1 = self.clone();
+        io.add_method("transfer", move |params: jsonrpc_core::Params| {
+            let self2 = self1.clone();
+            async move {
+                let parsed: TransferParams = params.parse().unwrap();
+                let address = parsed.address.clone();
+                self2.adapter.transfer(parsed).await?;
+                Ok(jsonrpc_core::Value::String(format!("Transfer To: {}", address)))
+            }
         });
 
         io.add_method("withdraw", |params: jsonrpc_core::Params| async move {

+ 14 - 0
src/rpc/mod.rs

@@ -2,4 +2,18 @@ pub mod adapter;
 pub mod jsonserver;
 pub mod test;
 
+use serde::Deserialize;
+
+#[derive(Deserialize, Debug)]
+pub struct TransferParams {
+    pub address: String,
+    pub amount: String,
+}
+
+#[derive(Deserialize, Debug)]
+pub struct WithdrawParams {
+    address: String,
+    amount: String,
+}
+
 pub use adapter::{AdapterPtr, RpcAdapter};