handle transfer command from darkfid

This commit is contained in:
ghassmo
2021-08-02 04:29:55 +03:00
parent 9f07bbca80
commit eb9511cb49
4 changed files with 61 additions and 27 deletions

View File

@@ -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
}

View File

@@ -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) {}

View File

@@ -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 {

View File

@@ -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};