light client RPC dependencies
This commit is contained in:
parent
35d9a9815e
commit
73b2dd7a59
@ -55,6 +55,7 @@ pub mod remote {
|
||||
|
||||
mod types;
|
||||
|
||||
pub use self::cache::Cache;
|
||||
pub use self::provider::Provider;
|
||||
pub use self::transaction_queue::TransactionQueue;
|
||||
pub use types::request as request;
|
||||
|
@ -28,12 +28,13 @@ use ethcore::miner::{Miner, ExternalMiner};
|
||||
use ethcore::snapshot::SnapshotService;
|
||||
use ethcore_rpc::{Metadata, NetworkSettings};
|
||||
use ethcore_rpc::informant::{ActivityNotifier, Middleware, RpcStats, ClientNotifier};
|
||||
use ethcore_rpc::dispatch::FullDispatcher;
|
||||
use ethsync::{ManageNetwork, SyncProvider};
|
||||
use ethcore_rpc::dispatch::{FullDispatcher, LightDispatcher};
|
||||
use ethsync::{ManageNetwork, SyncProvider, LightSync};
|
||||
use hash_fetch::fetch::Client as FetchClient;
|
||||
use jsonrpc_core::{MetaIoHandler};
|
||||
use light::{TransactionQueue as LightTransactionQueue, Cache as LightDataCache};
|
||||
use updater::Updater;
|
||||
use util::RotatingLogger;
|
||||
use util::{Mutex, RwLock, RotatingLogger};
|
||||
|
||||
#[derive(Debug, PartialEq, Clone, Eq, Hash)]
|
||||
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 {
|
||||
pub fn list_apis(&self) -> HashSet<Api> {
|
||||
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.
|
||||
/// Light client `ETH` RPC.
|
||||
#[derive(Clone)]
|
||||
pub struct LightDispatcher {
|
||||
/// Sync service.
|
||||
|
@ -23,7 +23,10 @@ pub mod eth;
|
||||
pub mod parity;
|
||||
pub mod parity_set;
|
||||
pub mod trace;
|
||||
pub mod net;
|
||||
|
||||
pub use self::eth::EthClient;
|
||||
pub use self::parity::ParityClient;
|
||||
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;
|
||||
|
||||
/// Net rpc implementation.
|
||||
pub struct NetClient<S: ?Sized> where S: SyncProvider {
|
||||
pub struct NetClient<S: ?Sized> {
|
||||
sync: Weak<S>
|
||||
}
|
||||
|
||||
|
@ -642,6 +642,9 @@ pub trait LightSyncProvider {
|
||||
/// Get peers information
|
||||
fn peers(&self) -> Vec<PeerInfo>;
|
||||
|
||||
/// Get network id.
|
||||
fn network_id(&self) -> u64;
|
||||
|
||||
/// Get the enode if available.
|
||||
fn enode(&self) -> Option<String>;
|
||||
|
||||
@ -666,6 +669,7 @@ pub struct LightSync {
|
||||
proto: Arc<LightProtocol>,
|
||||
network: NetworkService,
|
||||
subprotocol_name: [u8; 3],
|
||||
network_id: u64,
|
||||
}
|
||||
|
||||
impl LightSync {
|
||||
@ -701,6 +705,7 @@ impl LightSync {
|
||||
proto: light_proto,
|
||||
network: service,
|
||||
subprotocol_name: params.subprotocol_name,
|
||||
network_id: params.network_id,
|
||||
})
|
||||
}
|
||||
|
||||
@ -796,6 +801,10 @@ impl LightSyncProvider for LightSync {
|
||||
self.network.external_url()
|
||||
}
|
||||
|
||||
fn network_id(&self) -> u64 {
|
||||
self.network_id
|
||||
}
|
||||
|
||||
fn transactions_stats(&self) -> BTreeMap<H256, TransactionStats> {
|
||||
Default::default() // TODO
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user