light client RPC dependencies
This commit is contained in:
parent
35d9a9815e
commit
73b2dd7a59
@ -55,6 +55,7 @@ pub mod remote {
|
|||||||
|
|
||||||
mod types;
|
mod types;
|
||||||
|
|
||||||
|
pub use self::cache::Cache;
|
||||||
pub use self::provider::Provider;
|
pub use self::provider::Provider;
|
||||||
pub use self::transaction_queue::TransactionQueue;
|
pub use self::transaction_queue::TransactionQueue;
|
||||||
pub use types::request as request;
|
pub use types::request as request;
|
||||||
|
@ -28,12 +28,13 @@ use ethcore::miner::{Miner, ExternalMiner};
|
|||||||
use ethcore::snapshot::SnapshotService;
|
use ethcore::snapshot::SnapshotService;
|
||||||
use ethcore_rpc::{Metadata, NetworkSettings};
|
use ethcore_rpc::{Metadata, NetworkSettings};
|
||||||
use ethcore_rpc::informant::{ActivityNotifier, Middleware, RpcStats, ClientNotifier};
|
use ethcore_rpc::informant::{ActivityNotifier, Middleware, RpcStats, ClientNotifier};
|
||||||
use ethcore_rpc::dispatch::FullDispatcher;
|
use ethcore_rpc::dispatch::{FullDispatcher, LightDispatcher};
|
||||||
use ethsync::{ManageNetwork, SyncProvider};
|
use ethsync::{ManageNetwork, SyncProvider, LightSync};
|
||||||
use hash_fetch::fetch::Client as FetchClient;
|
use hash_fetch::fetch::Client as FetchClient;
|
||||||
use jsonrpc_core::{MetaIoHandler};
|
use jsonrpc_core::{MetaIoHandler};
|
||||||
|
use light::{TransactionQueue as LightTransactionQueue, Cache as LightDataCache};
|
||||||
use updater::Updater;
|
use updater::Updater;
|
||||||
use util::RotatingLogger;
|
use util::{Mutex, RwLock, RotatingLogger};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
|
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
|
||||||
pub enum Api {
|
pub enum Api {
|
||||||
@ -271,6 +272,114 @@ impl Dependencies for FullDependencies {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Light client notifier. Doesn't do anything yet, but might in the future.
|
||||||
|
pub struct LightClientNotifier;
|
||||||
|
|
||||||
|
impl ActivityNotifier for LightClientNotifier {
|
||||||
|
fn active(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// RPC dependencies for a light client.
|
||||||
|
pub struct LightDependencies {
|
||||||
|
pub signer_service: Arc<SignerService>,
|
||||||
|
pub client: Arc<::light::client::Client>,
|
||||||
|
pub sync: Arc<LightSync>,
|
||||||
|
pub net: Arc<ManageNetwork>,
|
||||||
|
pub secret_store: Arc<AccountProvider>,
|
||||||
|
pub logger: Arc<RotatingLogger>,
|
||||||
|
pub settings: Arc<NetworkSettings>,
|
||||||
|
pub on_demand: Arc<::light::on_demand::OnDemand>,
|
||||||
|
pub cache: Arc<Mutex<LightDataCache>>,
|
||||||
|
pub transaction_queue: Arc<RwLock<LightTransactionQueue>>,
|
||||||
|
pub updater: Arc<Updater>,
|
||||||
|
pub dapps_interface: Option<String>,
|
||||||
|
pub dapps_port: Option<u16>,
|
||||||
|
pub fetch: FetchClient,
|
||||||
|
pub geth_compatibility: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Dependencies for LightDependencies {
|
||||||
|
type Notifier = LightClientNotifier;
|
||||||
|
|
||||||
|
fn activity_notifier(&self) -> Self::Notifier { LightClientNotifier }
|
||||||
|
fn extend_with_set(&self, handler: &mut MetaIoHandler<Metadata, Middleware<Self::Notifier>>, apis: &[Api]) {
|
||||||
|
use ethcore_rpc::v1::*;
|
||||||
|
|
||||||
|
let dispatcher = LightDispatcher::new(
|
||||||
|
self.sync.clone(),
|
||||||
|
self.client.clone(),
|
||||||
|
self.on_demand.clone(),
|
||||||
|
self.cache.clone(),
|
||||||
|
self.transaction_queue.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
|
for api in apis {
|
||||||
|
match *api {
|
||||||
|
Api::Web3 => {
|
||||||
|
handler.extend_with(Web3Client::new().to_delegate());
|
||||||
|
},
|
||||||
|
Api::Net => {
|
||||||
|
handler.extend_with(light::NetClient::new(self.sync.clone()).to_delegate());
|
||||||
|
},
|
||||||
|
Api::Eth => {
|
||||||
|
let client = light::EthClient::new(
|
||||||
|
self.sync.clone(),
|
||||||
|
self.client.clone(),
|
||||||
|
self.on_demand.clone(),
|
||||||
|
self.transaction_queue.clone(),
|
||||||
|
self.secret_store.clone(),
|
||||||
|
self.cache.clone(),
|
||||||
|
);
|
||||||
|
handler.extend_with(client.to_delegate());
|
||||||
|
|
||||||
|
// TODO: filters and signing methods.
|
||||||
|
},
|
||||||
|
Api::Personal => {
|
||||||
|
handler.extend_with(PersonalClient::new(&self.secret_store, dispatcher.clone(), self.geth_compatibility).to_delegate());
|
||||||
|
},
|
||||||
|
Api::Signer => {
|
||||||
|
handler.extend_with(SignerClient::new(&self.secret_store, dispatcher.clone(), &self.signer_service).to_delegate());
|
||||||
|
},
|
||||||
|
Api::Parity => {
|
||||||
|
let signer = match self.signer_service.is_enabled() {
|
||||||
|
true => Some(self.signer_service.clone()),
|
||||||
|
false => None,
|
||||||
|
};
|
||||||
|
handler.extend_with(light::ParityClient::new(
|
||||||
|
Arc::new(dispatcher.clone()),
|
||||||
|
self.secret_store.clone(),
|
||||||
|
self.logger.clone(),
|
||||||
|
self.settings.clone(),
|
||||||
|
signer,
|
||||||
|
self.dapps_interface.clone(),
|
||||||
|
self.dapps_port,
|
||||||
|
).to_delegate());
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
//add_signing_methods!(EthSigning, handler, self);
|
||||||
|
//add_signing_methods!(ParitySigning, handler, self);
|
||||||
|
},
|
||||||
|
Api::ParityAccounts => {
|
||||||
|
handler.extend_with(ParityAccountsClient::new(&self.secret_store).to_delegate());
|
||||||
|
},
|
||||||
|
Api::ParitySet => {
|
||||||
|
handler.extend_with(light::ParitySetClient::new(
|
||||||
|
self.sync.clone(),
|
||||||
|
self.fetch.clone(),
|
||||||
|
).to_delegate())
|
||||||
|
},
|
||||||
|
Api::Traces => {
|
||||||
|
handler.extend_with(light::TracesClient.to_delegate())
|
||||||
|
},
|
||||||
|
Api::Rpc => {
|
||||||
|
let modules = to_modules(&apis);
|
||||||
|
handler.extend_with(RpcClient::new(modules).to_delegate());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ApiSet {
|
impl ApiSet {
|
||||||
pub fn list_apis(&self) -> HashSet<Api> {
|
pub fn list_apis(&self) -> HashSet<Api> {
|
||||||
let mut safe_list = vec![Api::Web3, Api::Net, Api::Eth, Api::Parity, Api::Traces, Api::Rpc]
|
let mut safe_list = vec![Api::Web3, Api::Net, Api::Eth, Api::Parity, Api::Traces, Api::Rpc]
|
||||||
|
@ -207,7 +207,6 @@ pub fn fetch_gas_price_corpus(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Dispatcher for light clients -- fetches default gas price, next nonce, etc. from network.
|
/// Dispatcher for light clients -- fetches default gas price, next nonce, etc. from network.
|
||||||
/// Light client `ETH` RPC.
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct LightDispatcher {
|
pub struct LightDispatcher {
|
||||||
/// Sync service.
|
/// Sync service.
|
||||||
|
@ -23,7 +23,10 @@ pub mod eth;
|
|||||||
pub mod parity;
|
pub mod parity;
|
||||||
pub mod parity_set;
|
pub mod parity_set;
|
||||||
pub mod trace;
|
pub mod trace;
|
||||||
|
pub mod net;
|
||||||
|
|
||||||
pub use self::eth::EthClient;
|
pub use self::eth::EthClient;
|
||||||
pub use self::parity::ParityClient;
|
pub use self::parity::ParityClient;
|
||||||
pub use self::parity_set::ParitySetClient;
|
pub use self::parity_set::ParitySetClient;
|
||||||
|
pub use self::net::NetClient;
|
||||||
|
pub use self::trace::TracesClient;
|
||||||
|
49
rpc/src/v1/impls/light/net.rs
Normal file
49
rpc/src/v1/impls/light/net.rs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity.
|
||||||
|
|
||||||
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
|
||||||
|
// Parity is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Net rpc implementation.
|
||||||
|
use std::sync::Arc;
|
||||||
|
use jsonrpc_core::Error;
|
||||||
|
use ethsync::LightSyncProvider;
|
||||||
|
use v1::traits::Net;
|
||||||
|
|
||||||
|
/// Net rpc implementation.
|
||||||
|
pub struct NetClient<S: ?Sized> {
|
||||||
|
sync: Arc<S>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S: ?Sized> NetClient<S> where S: LightSyncProvider {
|
||||||
|
/// Creates new NetClient.
|
||||||
|
pub fn new(sync: Arc<S>) -> Self {
|
||||||
|
NetClient {
|
||||||
|
sync: sync,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S: ?Sized + Sync + Send + 'static> Net for NetClient<S> where S: LightSyncProvider {
|
||||||
|
fn version(&self) -> Result<String, Error> {
|
||||||
|
Ok(format!("{}", self.sync.network_id()).to_owned())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn peer_count(&self) -> Result<String, Error> {
|
||||||
|
Ok(format!("0x{:x}", self.sync.peer_numbers().connected as u64).to_owned())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_listening(&self) -> Result<bool, Error> {
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
}
|
@ -21,7 +21,7 @@ use ethsync::SyncProvider;
|
|||||||
use v1::traits::Net;
|
use v1::traits::Net;
|
||||||
|
|
||||||
/// Net rpc implementation.
|
/// Net rpc implementation.
|
||||||
pub struct NetClient<S: ?Sized> where S: SyncProvider {
|
pub struct NetClient<S: ?Sized> {
|
||||||
sync: Weak<S>
|
sync: Weak<S>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,6 +642,9 @@ pub trait LightSyncProvider {
|
|||||||
/// Get peers information
|
/// Get peers information
|
||||||
fn peers(&self) -> Vec<PeerInfo>;
|
fn peers(&self) -> Vec<PeerInfo>;
|
||||||
|
|
||||||
|
/// Get network id.
|
||||||
|
fn network_id(&self) -> u64;
|
||||||
|
|
||||||
/// Get the enode if available.
|
/// Get the enode if available.
|
||||||
fn enode(&self) -> Option<String>;
|
fn enode(&self) -> Option<String>;
|
||||||
|
|
||||||
@ -666,6 +669,7 @@ pub struct LightSync {
|
|||||||
proto: Arc<LightProtocol>,
|
proto: Arc<LightProtocol>,
|
||||||
network: NetworkService,
|
network: NetworkService,
|
||||||
subprotocol_name: [u8; 3],
|
subprotocol_name: [u8; 3],
|
||||||
|
network_id: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LightSync {
|
impl LightSync {
|
||||||
@ -701,6 +705,7 @@ impl LightSync {
|
|||||||
proto: light_proto,
|
proto: light_proto,
|
||||||
network: service,
|
network: service,
|
||||||
subprotocol_name: params.subprotocol_name,
|
subprotocol_name: params.subprotocol_name,
|
||||||
|
network_id: params.network_id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,6 +801,10 @@ impl LightSyncProvider for LightSync {
|
|||||||
self.network.external_url()
|
self.network.external_url()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn network_id(&self) -> u64 {
|
||||||
|
self.network_id
|
||||||
|
}
|
||||||
|
|
||||||
fn transactions_stats(&self) -> BTreeMap<H256, TransactionStats> {
|
fn transactions_stats(&self) -> BTreeMap<H256, TransactionStats> {
|
||||||
Default::default() // TODO
|
Default::default() // TODO
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user