Move all light client work to own crate

This commit is contained in:
Robert Habermeier 2016-11-04 19:40:11 +01:00
parent 5cabb3008f
commit c1a6dbe75f
10 changed files with 75 additions and 126 deletions

15
ethcore/light/Cargo.toml Normal file
View 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" }

View File

@ -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()
}

View File

@ -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;

View File

@ -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!()
}

View File

@ -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>;

View File

@ -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};

View File

@ -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>;
}

View File

@ -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;

View File

@ -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,
}

View File

@ -51,7 +51,6 @@ mod blocks;
mod block_sync;
mod sync_io;
mod snapshot;
mod light;
#[cfg(test)]
mod tests;