partial implementation of provider for client types
This commit is contained in:
parent
60a8728121
commit
ebff010d16
@ -17,8 +17,11 @@
|
|||||||
//! A provider for the LES protocol. This is typically a full node, who can
|
//! A provider for the LES protocol. This is typically a full node, who can
|
||||||
//! give as much data as necessary to its peers.
|
//! give as much data as necessary to its peers.
|
||||||
|
|
||||||
|
use ethcore::client::BlockChainClient;
|
||||||
use ethcore::transaction::SignedTransaction;
|
use ethcore::transaction::SignedTransaction;
|
||||||
use ethcore::blockchain_info::BlockChainInfo;
|
use ethcore::blockchain_info::BlockChainInfo;
|
||||||
|
|
||||||
|
use rlp::EMPTY_LIST_RLP;
|
||||||
use util::{Bytes, H256};
|
use util::{Bytes, H256};
|
||||||
|
|
||||||
use request;
|
use request;
|
||||||
@ -36,8 +39,9 @@ pub trait Provider: Send + Sync {
|
|||||||
/// Find the depth of a common ancestor between two blocks.
|
/// Find the depth of a common ancestor between two blocks.
|
||||||
fn reorg_depth(&self, a: &H256, b: &H256) -> Option<u64>;
|
fn reorg_depth(&self, a: &H256, b: &H256) -> Option<u64>;
|
||||||
|
|
||||||
/// Earliest state.
|
/// Earliest block where state queries are available.
|
||||||
fn earliest_state(&self) -> Option<u64>;
|
/// All states between this value and
|
||||||
|
fn earliest_state(&self) -> u64;
|
||||||
|
|
||||||
/// Provide a list of headers starting at the requested block,
|
/// Provide a list of headers starting at the requested block,
|
||||||
/// possibly in reverse and skipping `skip` at a time.
|
/// possibly in reverse and skipping `skip` at a time.
|
||||||
@ -69,3 +73,51 @@ pub trait Provider: Send + Sync {
|
|||||||
/// Provide pending transactions.
|
/// Provide pending transactions.
|
||||||
fn pending_transactions(&self) -> Vec<SignedTransaction>;
|
fn pending_transactions(&self) -> Vec<SignedTransaction>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO [rob] move into trait definition file after ethcore crate
|
||||||
|
// is split up. ideally `ethcore-light` will be between `ethcore-blockchain`
|
||||||
|
// and `ethcore-client`
|
||||||
|
impl<T: BlockChainClient + ?Sized> Provider for T {
|
||||||
|
fn chain_info(&self) -> BlockChainInfo {
|
||||||
|
BlockChainClient::chain_info(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reorg_depth(&self, a: &H256, b: &H256) -> Option<u64> {
|
||||||
|
self.tree_route.map(|route| route.index as u64)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn earliest_state(&self) -> u64 {
|
||||||
|
self.pruning_info().earliest_state
|
||||||
|
}
|
||||||
|
|
||||||
|
fn block_headers(&self, req: request::Headers) -> Vec<Bytes> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn block_bodies(&self, req: request::Bodies) -> Vec<Bytes> {
|
||||||
|
req.block_hashes.into_iter()
|
||||||
|
.map(|hash| self.block_body(hash.into()))
|
||||||
|
.map(|body| body.unwrap_or_else(|| EMPTY_LIST_RLP.into()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn receipts(&self, req: request::Receipts) -> Vec<Bytes> {
|
||||||
|
req.block_hashes.into_iter()
|
||||||
|
.map(|hash| self.block_receipts(&hash)
|
||||||
|
.map(|receipts| receips.unwrap_or_else(|| EMPTY_LIST_RLP.into()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn proofs(&self, req: request::StateProofs) -> Vec<Bytes> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn code(&self, req: request::ContractCodes) -> Vec<Bytes>;
|
||||||
|
|
||||||
|
fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes> {
|
||||||
|
// TODO: [rob] implement CHT stuff on `ethcore` side.
|
||||||
|
req.requests.into_iter().map(|_| EMPTY_LIST_RLP.into()).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pending_transactions(&self) -> Vec<SignedTransaction>;
|
||||||
|
}
|
@ -52,7 +52,7 @@ use blockchain::{BlockChain, BlockProvider, TreeRoute, ImportRoute};
|
|||||||
use client::{
|
use client::{
|
||||||
BlockID, TransactionID, UncleID, TraceId, ClientConfig, BlockChainClient,
|
BlockID, TransactionID, UncleID, TraceId, ClientConfig, BlockChainClient,
|
||||||
MiningBlockChainClient, TraceFilter, CallAnalytics, BlockImportError, Mode,
|
MiningBlockChainClient, TraceFilter, CallAnalytics, BlockImportError, Mode,
|
||||||
ChainNotify,
|
ChainNotify, PruningInfo,
|
||||||
};
|
};
|
||||||
use client::Error as ClientError;
|
use client::Error as ClientError;
|
||||||
use env_info::EnvInfo;
|
use env_info::EnvInfo;
|
||||||
@ -1226,6 +1226,13 @@ impl BlockChainClient for Client {
|
|||||||
self.uncle(id)
|
self.uncle(id)
|
||||||
.map(|header| self.engine.extra_info(&decode(&header)))
|
.map(|header| self.engine.extra_info(&decode(&header)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pruning_info(&self) -> PruningInfo {
|
||||||
|
PruningInfo {
|
||||||
|
earliest_chain: self.chain.read().first_block().unwrap_or(1),
|
||||||
|
earliest_state: self.state_db.lock().journal_db().earliest_era().unwrap_or(0),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MiningBlockChainClient for Client {
|
impl MiningBlockChainClient for Client {
|
||||||
|
@ -25,18 +25,21 @@ mod client;
|
|||||||
pub use self::client::*;
|
pub use self::client::*;
|
||||||
pub use self::config::{Mode, ClientConfig, DatabaseCompactionProfile, BlockChainConfig, VMType};
|
pub use self::config::{Mode, ClientConfig, DatabaseCompactionProfile, BlockChainConfig, VMType};
|
||||||
pub use self::error::Error;
|
pub use self::error::Error;
|
||||||
pub use types::ids::*;
|
|
||||||
pub use self::test_client::{TestBlockChainClient, EachBlockWith};
|
pub use self::test_client::{TestBlockChainClient, EachBlockWith};
|
||||||
|
pub use self::chain_notify::ChainNotify;
|
||||||
|
pub use self::traits::{BlockChainClient, MiningBlockChainClient};
|
||||||
|
|
||||||
|
pub use types::ids::*;
|
||||||
pub use types::trace_filter::Filter as TraceFilter;
|
pub use types::trace_filter::Filter as TraceFilter;
|
||||||
|
pub use types::pruning_info::PruningInfo;
|
||||||
|
pub use types::call_analytics::CallAnalytics;
|
||||||
|
|
||||||
pub use executive::{Executed, Executive, TransactOptions};
|
pub use executive::{Executed, Executive, TransactOptions};
|
||||||
pub use env_info::{LastHashes, EnvInfo};
|
pub use env_info::{LastHashes, EnvInfo};
|
||||||
pub use self::chain_notify::ChainNotify;
|
|
||||||
|
|
||||||
pub use types::call_analytics::CallAnalytics;
|
|
||||||
pub use block_import_error::BlockImportError;
|
pub use block_import_error::BlockImportError;
|
||||||
pub use transaction_import::TransactionImportResult;
|
pub use transaction_import::TransactionImportResult;
|
||||||
pub use transaction_import::TransactionImportError;
|
pub use transaction_import::TransactionImportError;
|
||||||
pub use self::traits::{BlockChainClient, MiningBlockChainClient};
|
|
||||||
pub use verification::VerifierType;
|
pub use verification::VerifierType;
|
||||||
|
|
||||||
/// IPC interfaces
|
/// IPC interfaces
|
||||||
|
@ -38,6 +38,7 @@ use evm::{Factory as EvmFactory, VMType, Schedule};
|
|||||||
use miner::{Miner, MinerService, TransactionImportResult};
|
use miner::{Miner, MinerService, TransactionImportResult};
|
||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use types::mode::Mode;
|
use types::mode::Mode;
|
||||||
|
use types::pruning_info::PruningInfo;
|
||||||
use views::BlockView;
|
use views::BlockView;
|
||||||
|
|
||||||
use verification::queue::QueueInfo;
|
use verification::queue::QueueInfo;
|
||||||
@ -650,4 +651,11 @@ impl BlockChainClient for TestBlockChainClient {
|
|||||||
fn mode(&self) -> Mode { Mode::Active }
|
fn mode(&self) -> Mode { Mode::Active }
|
||||||
|
|
||||||
fn set_mode(&self, _: Mode) { unimplemented!(); }
|
fn set_mode(&self, _: Mode) { unimplemented!(); }
|
||||||
|
|
||||||
|
fn pruning_info(&self) -> PruningInfo {
|
||||||
|
PruningInfo {
|
||||||
|
earliest_chain: 1,
|
||||||
|
earlest_state: 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ use types::call_analytics::CallAnalytics;
|
|||||||
use types::blockchain_info::BlockChainInfo;
|
use types::blockchain_info::BlockChainInfo;
|
||||||
use types::block_status::BlockStatus;
|
use types::block_status::BlockStatus;
|
||||||
use types::mode::Mode;
|
use types::mode::Mode;
|
||||||
|
use types::pruning_info::PruningInfo;
|
||||||
|
|
||||||
#[ipc(client_ident="RemoteClient")]
|
#[ipc(client_ident="RemoteClient")]
|
||||||
/// Blockchain database client. Owns and manages a blockchain and a block queue.
|
/// Blockchain database client. Owns and manages a blockchain and a block queue.
|
||||||
@ -241,6 +242,9 @@ pub trait BlockChainClient : Sync + Send {
|
|||||||
|
|
||||||
/// Returns engine-related extra info for `UncleID`.
|
/// Returns engine-related extra info for `UncleID`.
|
||||||
fn uncle_extra_info(&self, id: UncleID) -> Option<BTreeMap<String, String>>;
|
fn uncle_extra_info(&self, id: UncleID) -> Option<BTreeMap<String, String>>;
|
||||||
|
|
||||||
|
/// Returns information about pruning/data availability.
|
||||||
|
fn pruning_info(&self) -> PruningInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extended client interface used for mining
|
/// Extended client interface used for mining
|
||||||
|
30
ethcore/src/types/pruning_info.rs
Normal file
30
ethcore/src/types/pruning_info.rs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// Copyright 2015, 2016 Ethcore (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/>.
|
||||||
|
|
||||||
|
//! Information about portions of the state and chain which the client may serve.
|
||||||
|
//!
|
||||||
|
//! Currently assumes that a client will store everything past a certain point
|
||||||
|
//! or everything. Will be extended in the future to support a definition
|
||||||
|
//! of which portions of the ancient chain and current state trie are stored as well.
|
||||||
|
|
||||||
|
/// Client pruning info. See module-level docs for more details.
|
||||||
|
#[derive(Debug, Clone, Binary)]
|
||||||
|
pub struct PruningInfo {
|
||||||
|
/// The first block which everything can be served after.
|
||||||
|
pub earliest_chain: u64
|
||||||
|
/// The first block where state requests may be served.
|
||||||
|
pub earliest_state: u64
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user