From 85de41642e20e4c7c391af3962e475cb86931d5f Mon Sep 17 00:00:00 2001 From: debris Date: Thu, 21 Jan 2016 11:25:39 +0100 Subject: [PATCH] rpc api in progress --- src/bin/client/main.rs | 4 ++- src/bin/client/rpc/impls/eth.rs | 42 +++++++++++++++++++++++++++++++- src/bin/client/rpc/impls/mod.rs | 3 ++- src/bin/client/rpc/impls/net.rs | 15 ++++++++++++ src/bin/client/rpc/mod.rs | 2 +- src/bin/client/rpc/traits/eth.rs | 20 +++++++++++++++ src/bin/client/rpc/traits/mod.rs | 2 +- 7 files changed, 83 insertions(+), 5 deletions(-) diff --git a/src/bin/client/main.rs b/src/bin/client/main.rs index bb19ca700..fc1b10b8a 100644 --- a/src/bin/client/main.rs +++ b/src/bin/client/main.rs @@ -36,7 +36,9 @@ fn setup_rpc_server(client: Arc>) { let mut server = HttpServer::new(1); server.add_delegate(Web3Client::new().to_delegate()); - server.add_delegate(EthClient::new(client).to_delegate()); + server.add_delegate(EthClient::new(client.clone()).to_delegate()); + server.add_delegate(EthFilterClient::new(client).to_delegate()); + server.add_delegate(NetClient::new().to_delegate()); server.start_async("127.0.0.1:3030"); } diff --git a/src/bin/client/rpc/impls/eth.rs b/src/bin/client/rpc/impls/eth.rs index 89c23419e..1151909ec 100644 --- a/src/bin/client/rpc/impls/eth.rs +++ b/src/bin/client/rpc/impls/eth.rs @@ -3,7 +3,7 @@ use rustc_serialize::hex::ToHex; use util::hash::*; use ethcore::client::*; use rpc::jsonrpc_core::*; -use rpc::Eth; +use rpc::{Eth, EthFilter}; pub struct EthClient { client: Arc>, @@ -32,6 +32,13 @@ impl Eth for EthClient { } } + fn gas_price(&self, params: Params) -> Result { + match params { + Params::None => Ok(Value::U64(0)), + _ => Err(Error::invalid_params()) + } + } + fn block_number(&self, params: Params) -> Result { match params { Params::None => Ok(Value::U64(self.client.read().unwrap().chain_info().best_block_number)), @@ -45,4 +52,37 @@ impl Eth for EthClient { _ => Err(Error::invalid_params()) } } + + fn hashrate(&self, params: Params) -> Result { + match params { + Params::None => Ok(Value::U64(0)), + _ => Err(Error::invalid_params()) + } + } +} + +pub struct EthFilterClient { + client: Arc> +} + +impl EthFilterClient { + pub fn new(client: Arc>) -> Self { + EthFilterClient { + client: client + } + } +} + +impl EthFilter for EthFilterClient { + fn new_block_filter(&self, _params: Params) -> Result { + Ok(Value::U64(0)) + } + + fn new_pending_transaction_filter(&self, _params: Params) -> Result { + Ok(Value::U64(1)) + } + + fn filter_changes(&self, _: Params) -> Result { + Ok(Value::String(self.client.read().unwrap().chain_info().best_block_hash.to_hex())) + } } diff --git a/src/bin/client/rpc/impls/mod.rs b/src/bin/client/rpc/impls/mod.rs index d229c5c13..813a168fd 100644 --- a/src/bin/client/rpc/impls/mod.rs +++ b/src/bin/client/rpc/impls/mod.rs @@ -4,4 +4,5 @@ pub mod eth; pub mod net; pub use self::web3::Web3Client; -pub use self::eth::EthClient; +pub use self::eth::{EthClient, EthFilterClient}; +pub use self::net::NetClient; diff --git a/src/bin/client/rpc/impls/net.rs b/src/bin/client/rpc/impls/net.rs index e69de29bb..6e528d156 100644 --- a/src/bin/client/rpc/impls/net.rs +++ b/src/bin/client/rpc/impls/net.rs @@ -0,0 +1,15 @@ +//! Net rpc implementation. +use rpc::jsonrpc_core::*; +use rpc::Net; + +pub struct NetClient; + +impl NetClient { + pub fn new() -> Self { NetClient } +} + +impl Net for NetClient { + fn peer_count(&self, _params: Params) -> Result { + Ok(Value::U64(0)) + } +} diff --git a/src/bin/client/rpc/mod.rs b/src/bin/client/rpc/mod.rs index 1053904e9..bf18e4b5f 100644 --- a/src/bin/client/rpc/mod.rs +++ b/src/bin/client/rpc/mod.rs @@ -10,7 +10,7 @@ macro_rules! rpcerr { pub mod traits; pub mod impls; -pub use self::traits::{Web3, Eth, Net}; +pub use self::traits::{Web3, Eth, EthFilter, Net}; pub use self::impls::*; diff --git a/src/bin/client/rpc/traits/eth.rs b/src/bin/client/rpc/traits/eth.rs index 8703d21fc..dfc72e89a 100644 --- a/src/bin/client/rpc/traits/eth.rs +++ b/src/bin/client/rpc/traits/eth.rs @@ -43,3 +43,23 @@ pub trait Eth: Sized + Send + Sync + 'static { } } +// TODO: do filters api properly if we commit outselves to polling again... +pub trait EthFilter: Sized + Send + Sync + 'static { + /// Returns id of new block filter + fn new_block_filter(&self, _: Params) -> Result { rpcerr!() } + + /// Returns id of new block filter + fn new_pending_transaction_filter(&self, _: Params) -> Result { rpcerr!() } + + /// Returns filter changes since last poll + fn filter_changes(&self, _: Params) -> Result { rpcerr!() } + + /// Should be used to convert object to io delegate. + fn to_delegate(self) -> IoDelegate { + let mut delegate = IoDelegate::new(Arc::new(self)); + delegate.add_method("eth_newBlockFilter", EthFilter::new_block_filter); + delegate.add_method("eth_newPendingTransactionFilter", EthFilter::new_pending_transaction_filter); + delegate.add_method("eth_getFilterChanges", EthFilter::new_block_filter); + delegate + } +} diff --git a/src/bin/client/rpc/traits/mod.rs b/src/bin/client/rpc/traits/mod.rs index 83f70f17d..2fa52d538 100644 --- a/src/bin/client/rpc/traits/mod.rs +++ b/src/bin/client/rpc/traits/mod.rs @@ -4,5 +4,5 @@ pub mod eth; pub mod net; pub use self::web3::Web3; -pub use self::eth::Eth; +pub use self::eth::{Eth, EthFilter}; pub use self::net::Net;