Move all light client work to own crate
This commit is contained in:
parent
5cabb3008f
commit
c1a6dbe75f
15
ethcore/light/Cargo.toml
Normal file
15
ethcore/light/Cargo.toml
Normal file
@ -0,0 +1,15 @@
|
||||
[package]
|
||||
description = "Parity LES primitives"
|
||||
homepage = "https://ethcore.io"
|
||||
license = "GPL-3.0"
|
||||
name = "ethcore-light"
|
||||
version = "1.5.0"
|
||||
authors = ["Ethcore <admin@ethcore.io>"]
|
||||
|
||||
[dependencies]
|
||||
log = "0.3"
|
||||
ethcore = { path = ".." }
|
||||
ethcore-util = { path = "../../util" }
|
||||
ethcore-network = { path = "../../util/network" }
|
||||
ethcore-io = { path = "../../util/io" }
|
||||
rlp = { path = "../../util/rlp" }
|
@ -19,22 +19,23 @@
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use engines::Engine;
|
||||
use ids::BlockID;
|
||||
use miner::TransactionQueue;
|
||||
use service::ClientIoMessage;
|
||||
use block_import_error::BlockImportError;
|
||||
use block_status::BlockStatus;
|
||||
use verification::queue::{Config as QueueConfig, HeaderQueue, QueueInfo, Status};
|
||||
use transaction::SignedTransaction;
|
||||
use types::blockchain_info::BlockChainInfo;
|
||||
|
||||
use super::provider::{CHTProofRequest, Provider, ProofRequest};
|
||||
use ethcore::engines::Engine;
|
||||
use ethcore::ids::BlockID;
|
||||
use ethcore::miner::TransactionQueue;
|
||||
use ethcore::service::ClientIoMessage;
|
||||
use ethcore::block_import_error::BlockImportError;
|
||||
use ethcore::block_status::BlockStatus;
|
||||
use ethcore::verification::queue::{Config as QueueConfig, HeaderQueue, QueueInfo, Status};
|
||||
use ethcore::transaction::SignedTransaction;
|
||||
use ethcore::blockchain_info::BlockChainInfo;
|
||||
|
||||
use io::IoChannel;
|
||||
use util::hash::H256;
|
||||
use util::{Bytes, Mutex};
|
||||
|
||||
use provider::Provider;
|
||||
use request;
|
||||
|
||||
/// Light client implementation.
|
||||
pub struct Client {
|
||||
engine: Arc<Engine>,
|
||||
@ -78,27 +79,31 @@ impl Provider for Client {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn block_headers(&self, block: (u64, H256), skip: usize, max: usize, reverse: bool) -> Vec<Bytes> {
|
||||
fn block_headers(&self, _req: request::Headers) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn block_bodies(&self, blocks: Vec<H256>) -> Vec<Bytes> {
|
||||
fn block_bodies(&self, _req: request::Bodies) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn receipts(&self, blocks: Vec<H256>) -> Vec<Bytes> {
|
||||
fn receipts(&self, _req: request::Receipts) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn proofs(&self, requests: Vec<(H256, ProofRequest)>) -> Vec<Bytes> {
|
||||
fn proofs(&self, _req: request::StateProofs) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn code(&self, accounts: Vec<(H256, H256)>) -> Vec<Bytes> {
|
||||
fn code(&self, _req: request::ContractCodes) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn header_proofs(&self, requests: Vec<CHTProofRequest>) -> Vec<Bytes> {
|
||||
fn header_proofs(&self, _req: request::HeaderProofs) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn block_deltas(&self, _req: request::BlockDeltas) -> Vec<Bytes> {
|
||||
Vec::new()
|
||||
}
|
||||
|
@ -28,9 +28,16 @@
|
||||
//! It starts by performing a header-only sync, verifying every header in
|
||||
//! the chain.
|
||||
|
||||
mod client;
|
||||
mod provider;
|
||||
mod sync;
|
||||
pub mod client;
|
||||
pub mod net;
|
||||
pub mod provider;
|
||||
pub mod request;
|
||||
|
||||
pub use self::client::Client;
|
||||
pub use self::provider::{CHTProofRequest, ProofRequest, Provider};
|
||||
extern crate ethcore_util as util;
|
||||
extern crate ethcore_network as network;
|
||||
extern crate ethcore_io as io;
|
||||
extern crate ethcore;
|
||||
extern crate rlp;
|
||||
|
||||
#[macro_use]
|
||||
extern crate log;
|
@ -19,19 +19,17 @@
|
||||
//! This uses a "Provider" to answer requests and syncs to a `Client`.
|
||||
//! See https://github.com/ethcore/parity/wiki/Light-Ethereum-Subprotocol-(LES)
|
||||
|
||||
use ethcore::light::{Client, Provider};
|
||||
use io::TimerToken;
|
||||
use network::{NetworkProtocolHandler, NetworkService, NetworkContext, NetworkError, PeerId};
|
||||
use rlp::{DecoderError, RlpStream, Stream, UntrustedRlp, View};
|
||||
use util::hash::H256;
|
||||
use parking_lot::{Mutex, RwLock};
|
||||
use util::{Mutex, RwLock};
|
||||
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
|
||||
use self::request::Request;
|
||||
|
||||
mod request;
|
||||
use provider::Provider;
|
||||
use request::Request;
|
||||
|
||||
const TIMEOUT: TimerToken = 0;
|
||||
const TIMEOUT_INTERVAL_MS: u64 = 1000;
|
||||
@ -163,7 +161,7 @@ impl LightProtocol {
|
||||
}
|
||||
|
||||
fn send_status(&self, peer: PeerId, io: &NetworkContext) -> Result<(), NetworkError> {
|
||||
let chain_info = self.client.chain_info();
|
||||
let chain_info = self.provider.chain_info();
|
||||
|
||||
// TODO [rob] use optional keys too.
|
||||
let mut stream = RlpStream::new_list(6);
|
||||
@ -210,14 +208,13 @@ impl LightProtocol {
|
||||
fn get_block_headers(&self, peer: &PeerId, io: &NetworkContext, data: UntrustedRlp) {
|
||||
const MAX_HEADERS: usize = 512;
|
||||
|
||||
let req_id: u64 = try_dc!(io, peer, data.val_at(0));
|
||||
let block = try_dc!(io, peer, data.at(1).and_then(|block_list| {
|
||||
(try!(block_list.val_at(0)), try!(block_list.val_at(1))
|
||||
let req_id: u64 = try_dc!(io, *peer, data.val_at(0));
|
||||
let block: (u64, H256) = try_dc!(io, *peer, data.at(1).and_then(|block_list| {
|
||||
Ok((try!(block_list.val_at(0)), try!(block_list.val_at(1))))
|
||||
}));
|
||||
let max = ::std::cmp::min(MAX_HEADERS, try_dc!(io, peer, data.val_at(2)));
|
||||
let reverse = try_dc!(io, peer, data.val_at(3));
|
||||
let max = ::std::cmp::min(MAX_HEADERS, try_dc!(io, *peer, data.val_at(2)));
|
||||
let reverse: bool = try_dc!(io, *peer, data.val_at(3));
|
||||
|
||||
let headers = self.provider.block_headers()
|
||||
unimplemented!()
|
||||
}
|
||||
|
@ -17,21 +17,20 @@
|
||||
//! A provider for the LES protocol. This is typically a full node, who can
|
||||
//! give as much data as necessary to its peers.
|
||||
|
||||
pub use proof_request::{CHTProofRequest, ProofRequest};
|
||||
|
||||
use transaction::SignedTransaction;
|
||||
use blockchain_info::BlockChainInfo;
|
||||
|
||||
use ethcore::transaction::SignedTransaction;
|
||||
use ethcore::blockchain_info::BlockChainInfo;
|
||||
use util::Bytes;
|
||||
use util::hash::H256;
|
||||
|
||||
use request;
|
||||
|
||||
/// Defines the operations that a provider for `LES` must fulfill.
|
||||
///
|
||||
/// These are defined at [1], but may be subject to change.
|
||||
/// Requests which can't be fulfilled should return an empty RLP list.
|
||||
///
|
||||
/// [1]: https://github.com/ethcore/parity/wiki/Light-Ethereum-Subprotocol-(LES)
|
||||
pub trait Provider: Sync {
|
||||
pub trait Provider: Send + Sync {
|
||||
/// Provide current blockchain info.
|
||||
fn chain_info(&self) -> BlockChainInfo;
|
||||
|
||||
@ -40,27 +39,30 @@ pub trait Provider: Sync {
|
||||
///
|
||||
/// The returned vector may have any length in the range [0, `max`], but the
|
||||
/// results within must adhere to the `skip` and `reverse` parameters.
|
||||
fn block_headers(&self, block: (u64, H256), skip: usize, max: usize, reverse: bool) -> Vec<Bytes>;
|
||||
fn block_headers(&self, req: request::Headers) -> Vec<Bytes>;
|
||||
|
||||
/// Provide as many as possible of the requested blocks (minus the headers) encoded
|
||||
/// in RLP format.
|
||||
fn block_bodies(&self, blocks: Vec<H256>) -> Vec<Bytes>;
|
||||
fn block_bodies(&self, req: request::Bodies) -> Vec<Bytes>;
|
||||
|
||||
/// Provide the receipts as many as possible of the requested blocks.
|
||||
/// Returns a vector of RLP-encoded lists of receipts.
|
||||
fn receipts(&self, blocks: Vec<H256>) -> Vec<Bytes>;
|
||||
fn receipts(&self, req: request::Receipts) -> Vec<Bytes>;
|
||||
|
||||
/// Provide a set of merkle proofs, as requested. Each request is a
|
||||
/// block hash and request parameters.
|
||||
///
|
||||
/// Returns a vector to RLP-encoded lists satisfying the requests.
|
||||
fn proofs(&self, requests: Vec<(H256, ProofRequest)>) -> Vec<Bytes>;
|
||||
fn proofs(&self, req: request::StateProofs) -> Vec<Bytes>;
|
||||
|
||||
/// Provide contract code for the specified (block_hash, account_hash) pairs.
|
||||
fn code(&self, accounts: Vec<(H256, H256)>) -> Vec<Bytes>;
|
||||
fn code(&self, req: request::ContractCodes) -> Vec<Bytes>;
|
||||
|
||||
/// Provide header proofs from the Canonical Hash Tries.
|
||||
fn header_proofs(&self, requests: Vec<CHTProofRequest>) -> Vec<Bytes>;
|
||||
fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes>;
|
||||
|
||||
/// Provide block deltas.
|
||||
fn block_deltas(&self, req: request::BlockDeltas) -> Vec<Bytes>;
|
||||
|
||||
/// Provide pending transactions.
|
||||
fn pending_transactions(&self) -> Vec<SignedTransaction>;
|
@ -14,7 +14,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/// LES request types.
|
||||
//! LES request types.
|
||||
|
||||
// TODO: make IPC compatible.
|
||||
|
||||
use ethcore::transaction::Transaction;
|
||||
use util::{Address, H256};
|
@ -1,33 +0,0 @@
|
||||
// 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/>.
|
||||
|
||||
//! A light sync target.
|
||||
|
||||
use block_import_error::BlockImportError;
|
||||
use client::BlockChainInfo;
|
||||
|
||||
use util::hash::H256;
|
||||
|
||||
pub trait Sync {
|
||||
/// Whether syncing is enabled.
|
||||
fn enabled(&self) -> bool;
|
||||
|
||||
/// Current chain info.
|
||||
fn chain_info(&self) -> BlockChainInfo;
|
||||
|
||||
/// Import a header.
|
||||
fn import_header(&self, header_bytes: Vec<u8>) -> Result<H256, BlockImportError>;
|
||||
}
|
@ -33,5 +33,4 @@ pub mod transaction_import;
|
||||
pub mod block_import_error;
|
||||
pub mod restoration_status;
|
||||
pub mod snapshot_manifest;
|
||||
pub mod proof_request;
|
||||
pub mod mode;
|
||||
|
@ -1,44 +0,0 @@
|
||||
// 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/>.
|
||||
|
||||
//! Merkle proof request.
|
||||
use util::hash::H256;
|
||||
|
||||
/// A request for a state merkle proof.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
||||
pub enum ProofRequest {
|
||||
/// Request a proof of the given account's (denoted by sha3(address))
|
||||
/// node in the state trie. Nodes with depth less than the second item
|
||||
/// may be omitted.
|
||||
Account(H256, usize),
|
||||
|
||||
/// Request a proof for a key in the given account's storage trie.
|
||||
/// Both values are hashes of their actual values. Nodes with depth
|
||||
/// less than the third item may be omitted.
|
||||
Storage(H256, H256, usize),
|
||||
}
|
||||
|
||||
/// A request for a Canonical Hash Trie proof for the given block number.
|
||||
/// Nodes with depth less than the second item may be omitted.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
||||
pub struct CHTProofRequest {
|
||||
/// The number of the block the proof is requested for.
|
||||
/// The CHT's number can be deduced from this (`number` / 4096)
|
||||
pub number: u64,
|
||||
|
||||
/// Nodes with depth less than this can be omitted from the proof.
|
||||
pub depth: usize,
|
||||
}
|
@ -51,7 +51,6 @@ mod blocks;
|
||||
mod block_sync;
|
||||
mod sync_io;
|
||||
mod snapshot;
|
||||
mod light;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
Loading…
Reference in New Issue
Block a user