removed EthEngine alias (#10805)
This commit is contained in:
parent
cff1bc88fa
commit
7f02a08741
@ -21,7 +21,7 @@ use std::sync::Arc;
|
|||||||
use common_types::encoded;
|
use common_types::encoded;
|
||||||
use common_types::header::Header;
|
use common_types::header::Header;
|
||||||
use common_types::receipt::Receipt;
|
use common_types::receipt::Receipt;
|
||||||
use ethcore::engines::{EthEngine, StateDependentProof};
|
use ethcore::engines::{Engine, StateDependentProof};
|
||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
use futures::future::IntoFuture;
|
use futures::future::IntoFuture;
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ pub trait ChainDataFetcher: Send + Sync + 'static {
|
|||||||
fn epoch_transition(
|
fn epoch_transition(
|
||||||
&self,
|
&self,
|
||||||
_hash: H256,
|
_hash: H256,
|
||||||
_engine: Arc<EthEngine>,
|
_engine: Arc<Engine>,
|
||||||
_checker: Arc<StateDependentProof>
|
_checker: Arc<StateDependentProof>
|
||||||
) -> Self::Transition;
|
) -> Self::Transition;
|
||||||
}
|
}
|
||||||
@ -76,7 +76,7 @@ impl ChainDataFetcher for Unavailable {
|
|||||||
fn epoch_transition(
|
fn epoch_transition(
|
||||||
&self,
|
&self,
|
||||||
_hash: H256,
|
_hash: H256,
|
||||||
_engine: Arc<EthEngine>,
|
_engine: Arc<Engine>,
|
||||||
_checker: Arc<StateDependentProof>
|
_checker: Arc<StateDependentProof>
|
||||||
) -> Self::Transition {
|
) -> Self::Transition {
|
||||||
Err("fetching epoch transition proofs unavailable")
|
Err("fetching epoch transition proofs unavailable")
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
use std::sync::{Weak, Arc};
|
use std::sync::{Weak, Arc};
|
||||||
|
|
||||||
use ethcore::client::{ClientReport, EnvInfo, ClientIoMessage};
|
use ethcore::client::{ClientReport, EnvInfo, ClientIoMessage};
|
||||||
use ethcore::engines::{epoch, EthEngine, EpochChange, EpochTransition, Proof};
|
use ethcore::engines::{epoch, Engine, EpochChange, EpochTransition, Proof};
|
||||||
use ethcore::error::{Error, EthcoreResult};
|
use ethcore::error::{Error, EthcoreResult};
|
||||||
use ethcore::verification::queue::{self, HeaderQueue};
|
use ethcore::verification::queue::{self, HeaderQueue};
|
||||||
use ethcore::spec::{Spec, SpecHardcodedSync};
|
use ethcore::spec::{Spec, SpecHardcodedSync};
|
||||||
@ -114,7 +114,7 @@ pub trait LightChainClient: Send + Sync {
|
|||||||
fn env_info(&self, id: BlockId) -> Option<EnvInfo>;
|
fn env_info(&self, id: BlockId) -> Option<EnvInfo>;
|
||||||
|
|
||||||
/// Get a handle to the consensus engine.
|
/// Get a handle to the consensus engine.
|
||||||
fn engine(&self) -> &Arc<EthEngine>;
|
fn engine(&self) -> &Arc<Engine>;
|
||||||
|
|
||||||
/// Query whether a block is known.
|
/// Query whether a block is known.
|
||||||
fn is_known(&self, hash: &H256) -> bool;
|
fn is_known(&self, hash: &H256) -> bool;
|
||||||
@ -159,7 +159,7 @@ impl<T: LightChainClient> AsLightClient for T {
|
|||||||
/// Light client implementation.
|
/// Light client implementation.
|
||||||
pub struct Client<T> {
|
pub struct Client<T> {
|
||||||
queue: HeaderQueue,
|
queue: HeaderQueue,
|
||||||
engine: Arc<EthEngine>,
|
engine: Arc<Engine>,
|
||||||
chain: HeaderChain,
|
chain: HeaderChain,
|
||||||
report: RwLock<ClientReport>,
|
report: RwLock<ClientReport>,
|
||||||
import_lock: Mutex<()>,
|
import_lock: Mutex<()>,
|
||||||
@ -375,7 +375,7 @@ impl<T: ChainDataFetcher> Client<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get a handle to the verification engine.
|
/// Get a handle to the verification engine.
|
||||||
pub fn engine(&self) -> &Arc<EthEngine> {
|
pub fn engine(&self) -> &Arc<Engine> {
|
||||||
&self.engine
|
&self.engine
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,7 +578,7 @@ impl<T: ChainDataFetcher> LightChainClient for Client<T> {
|
|||||||
Client::env_info(self, id)
|
Client::env_info(self, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn engine(&self) -> &Arc<EthEngine> {
|
fn engine(&self) -> &Arc<Engine> {
|
||||||
Client::engine(self)
|
Client::engine(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ use common_types::basic_account::BasicAccount;
|
|||||||
use common_types::encoded;
|
use common_types::encoded;
|
||||||
use common_types::receipt::Receipt;
|
use common_types::receipt::Receipt;
|
||||||
use common_types::transaction::SignedTransaction;
|
use common_types::transaction::SignedTransaction;
|
||||||
use ethcore::engines::{EthEngine, StateDependentProof};
|
use ethcore::engines::{Engine, StateDependentProof};
|
||||||
use ethcore::state::{self, ProvedExecution};
|
use ethcore::state::{self, ProvedExecution};
|
||||||
use ethereum_types::{H256, U256, Address};
|
use ethereum_types::{H256, U256, Address};
|
||||||
use ethtrie::{TrieError, TrieDB};
|
use ethtrie::{TrieError, TrieDB};
|
||||||
@ -1037,7 +1037,7 @@ pub struct TransactionProof {
|
|||||||
// TODO: it's not really possible to provide this if the header is unknown.
|
// TODO: it's not really possible to provide this if the header is unknown.
|
||||||
pub env_info: EnvInfo,
|
pub env_info: EnvInfo,
|
||||||
/// Consensus engine.
|
/// Consensus engine.
|
||||||
pub engine: Arc<EthEngine>,
|
pub engine: Arc<Engine>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TransactionProof {
|
impl TransactionProof {
|
||||||
@ -1080,7 +1080,7 @@ pub struct Signal {
|
|||||||
/// Block hash and number to fetch proof for.
|
/// Block hash and number to fetch proof for.
|
||||||
pub hash: H256,
|
pub hash: H256,
|
||||||
/// Consensus engine, used to check the proof.
|
/// Consensus engine, used to check the proof.
|
||||||
pub engine: Arc<EthEngine>,
|
pub engine: Arc<Engine>,
|
||||||
/// Special checker for the proof.
|
/// Special checker for the proof.
|
||||||
pub proof_check: Arc<StateDependentProof>,
|
pub proof_check: Arc<StateDependentProof>,
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ use std::sync::Arc;
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ethereum_types::{H256, U256, Address, Bloom};
|
use ethereum_types::{H256, U256, Address, Bloom};
|
||||||
|
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::{Error, BlockError};
|
use error::{Error, BlockError};
|
||||||
use factory::Factories;
|
use factory::Factories;
|
||||||
use state_db::StateDB;
|
use state_db::StateDB;
|
||||||
@ -61,7 +61,7 @@ use types::receipt::{Receipt, TransactionOutcome};
|
|||||||
/// maintain the system `state()`. We also archive execution receipts in preparation for later block creation.
|
/// maintain the system `state()`. We also archive execution receipts in preparation for later block creation.
|
||||||
pub struct OpenBlock<'x> {
|
pub struct OpenBlock<'x> {
|
||||||
block: ExecutedBlock,
|
block: ExecutedBlock,
|
||||||
engine: &'x dyn EthEngine,
|
engine: &'x dyn Engine,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Just like `OpenBlock`, except that we've applied `Engine::on_close_block`, finished up the non-seal header fields,
|
/// Just like `OpenBlock`, except that we've applied `Engine::on_close_block`, finished up the non-seal header fields,
|
||||||
@ -163,7 +163,7 @@ pub trait Drain {
|
|||||||
impl<'x> OpenBlock<'x> {
|
impl<'x> OpenBlock<'x> {
|
||||||
/// Create a new `OpenBlock` ready for transaction pushing.
|
/// Create a new `OpenBlock` ready for transaction pushing.
|
||||||
pub fn new<'a, I: IntoIterator<Item = ExtendedHeader>>(
|
pub fn new<'a, I: IntoIterator<Item = ExtendedHeader>>(
|
||||||
engine: &'x dyn EthEngine,
|
engine: &'x dyn Engine,
|
||||||
factories: Factories,
|
factories: Factories,
|
||||||
tracing: bool,
|
tracing: bool,
|
||||||
db: StateDB,
|
db: StateDB,
|
||||||
@ -374,7 +374,7 @@ impl ClosedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Given an engine reference, reopen the `ClosedBlock` into an `OpenBlock`.
|
/// Given an engine reference, reopen the `ClosedBlock` into an `OpenBlock`.
|
||||||
pub fn reopen(self, engine: &dyn EthEngine) -> OpenBlock {
|
pub fn reopen(self, engine: &dyn Engine) -> OpenBlock {
|
||||||
// revert rewards (i.e. set state back at last transaction's state).
|
// revert rewards (i.e. set state back at last transaction's state).
|
||||||
let mut block = self.block;
|
let mut block = self.block;
|
||||||
block.state = self.unclosed_state;
|
block.state = self.unclosed_state;
|
||||||
@ -404,7 +404,7 @@ impl LockedBlock {
|
|||||||
/// Provide a valid seal in order to turn this into a `SealedBlock`.
|
/// Provide a valid seal in order to turn this into a `SealedBlock`.
|
||||||
///
|
///
|
||||||
/// NOTE: This does not check the validity of `seal` with the engine.
|
/// NOTE: This does not check the validity of `seal` with the engine.
|
||||||
pub fn seal(self, engine: &dyn EthEngine, seal: Vec<Bytes>) -> Result<SealedBlock, Error> {
|
pub fn seal(self, engine: &dyn Engine, seal: Vec<Bytes>) -> Result<SealedBlock, Error> {
|
||||||
let expected_seal_fields = engine.seal_fields(&self.header);
|
let expected_seal_fields = engine.seal_fields(&self.header);
|
||||||
let mut s = self;
|
let mut s = self;
|
||||||
if seal.len() != expected_seal_fields {
|
if seal.len() != expected_seal_fields {
|
||||||
@ -429,7 +429,7 @@ impl LockedBlock {
|
|||||||
/// TODO(https://github.com/paritytech/parity-ethereum/issues/10407): This is currently only used in POW chain call paths, we should really merge it with seal() above.
|
/// TODO(https://github.com/paritytech/parity-ethereum/issues/10407): This is currently only used in POW chain call paths, we should really merge it with seal() above.
|
||||||
pub fn try_seal(
|
pub fn try_seal(
|
||||||
self,
|
self,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
seal: Vec<Bytes>,
|
seal: Vec<Bytes>,
|
||||||
) -> Result<SealedBlock, Error> {
|
) -> Result<SealedBlock, Error> {
|
||||||
let mut s = self;
|
let mut s = self;
|
||||||
@ -472,7 +472,7 @@ pub(crate) fn enact(
|
|||||||
header: Header,
|
header: Header,
|
||||||
transactions: Vec<SignedTransaction>,
|
transactions: Vec<SignedTransaction>,
|
||||||
uncles: Vec<Header>,
|
uncles: Vec<Header>,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
tracing: bool,
|
tracing: bool,
|
||||||
db: StateDB,
|
db: StateDB,
|
||||||
parent: &Header,
|
parent: &Header,
|
||||||
@ -525,7 +525,7 @@ pub(crate) fn enact(
|
|||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
||||||
pub fn enact_verified(
|
pub fn enact_verified(
|
||||||
block: PreverifiedBlock,
|
block: PreverifiedBlock,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
tracing: bool,
|
tracing: bool,
|
||||||
db: StateDB,
|
db: StateDB,
|
||||||
parent: &Header,
|
parent: &Header,
|
||||||
@ -554,7 +554,7 @@ pub fn enact_verified(
|
|||||||
mod tests {
|
mod tests {
|
||||||
use test_helpers::get_temp_state_db;
|
use test_helpers::get_temp_state_db;
|
||||||
use super::*;
|
use super::*;
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use vm::LastHashes;
|
use vm::LastHashes;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use factory::Factories;
|
use factory::Factories;
|
||||||
@ -571,7 +571,7 @@ mod tests {
|
|||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
||||||
fn enact_bytes(
|
fn enact_bytes(
|
||||||
block_bytes: Vec<u8>,
|
block_bytes: Vec<u8>,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
tracing: bool,
|
tracing: bool,
|
||||||
db: StateDB,
|
db: StateDB,
|
||||||
parent: &Header,
|
parent: &Header,
|
||||||
@ -624,7 +624,7 @@ mod tests {
|
|||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header. Seal the block aferwards
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header. Seal the block aferwards
|
||||||
fn enact_and_seal(
|
fn enact_and_seal(
|
||||||
block_bytes: Vec<u8>,
|
block_bytes: Vec<u8>,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
tracing: bool,
|
tracing: bool,
|
||||||
db: StateDB,
|
db: StateDB,
|
||||||
parent: &Header,
|
parent: &Header,
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use engines::{EthEngine, EpochVerifier};
|
use engines::{Engine, EpochVerifier};
|
||||||
|
|
||||||
use blockchain::BlockChain;
|
use blockchain::BlockChain;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
@ -32,12 +32,12 @@ const HEAVY_VERIFY_RATE: f32 = 0.02;
|
|||||||
/// epoch.
|
/// epoch.
|
||||||
pub struct AncientVerifier {
|
pub struct AncientVerifier {
|
||||||
cur_verifier: RwLock<Option<Box<dyn EpochVerifier>>>,
|
cur_verifier: RwLock<Option<Box<dyn EpochVerifier>>>,
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AncientVerifier {
|
impl AncientVerifier {
|
||||||
/// Create a new ancient block verifier with the given engine.
|
/// Create a new ancient block verifier with the given engine.
|
||||||
pub fn new(engine: Arc<dyn EthEngine>) -> Self {
|
pub fn new(engine: Arc<dyn Engine>) -> Self {
|
||||||
AncientVerifier {
|
AncientVerifier {
|
||||||
cur_verifier: RwLock::new(None),
|
cur_verifier: RwLock::new(None),
|
||||||
engine,
|
engine,
|
||||||
|
@ -60,7 +60,7 @@ use client::{
|
|||||||
IoClient, BadBlocks,
|
IoClient, BadBlocks,
|
||||||
};
|
};
|
||||||
use client::bad_blocks;
|
use client::bad_blocks;
|
||||||
use engines::{MAX_UNCLE_AGE, EthEngine, EpochTransition, ForkChoice, EngineError, SealingState};
|
use engines::{MAX_UNCLE_AGE, Engine, EpochTransition, ForkChoice, EngineError, SealingState};
|
||||||
use engines::epoch::PendingTransition;
|
use engines::epoch::PendingTransition;
|
||||||
use error::{
|
use error::{
|
||||||
ImportError, ExecutionError, CallError, BlockError,
|
ImportError, ExecutionError, CallError, BlockError,
|
||||||
@ -165,7 +165,7 @@ struct Importer {
|
|||||||
pub ancient_verifier: AncientVerifier,
|
pub ancient_verifier: AncientVerifier,
|
||||||
|
|
||||||
/// Ethereum engine to be used during import
|
/// Ethereum engine to be used during import
|
||||||
pub engine: Arc<dyn EthEngine>,
|
pub engine: Arc<dyn Engine>,
|
||||||
|
|
||||||
/// A lru cache of recently detected bad blocks
|
/// A lru cache of recently detected bad blocks
|
||||||
pub bad_blocks: bad_blocks::BadBlocks,
|
pub bad_blocks: bad_blocks::BadBlocks,
|
||||||
@ -187,7 +187,7 @@ pub struct Client {
|
|||||||
|
|
||||||
chain: RwLock<Arc<BlockChain>>,
|
chain: RwLock<Arc<BlockChain>>,
|
||||||
tracedb: RwLock<TraceDB<BlockChain>>,
|
tracedb: RwLock<TraceDB<BlockChain>>,
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
|
|
||||||
/// Client configuration
|
/// Client configuration
|
||||||
config: ClientConfig,
|
config: ClientConfig,
|
||||||
@ -245,7 +245,7 @@ pub struct Client {
|
|||||||
impl Importer {
|
impl Importer {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
config: &ClientConfig,
|
config: &ClientConfig,
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
message_channel: IoChannel<ClientIoMessage>,
|
message_channel: IoChannel<ClientIoMessage>,
|
||||||
miner: Arc<Miner>,
|
miner: Arc<Miner>,
|
||||||
) -> Result<Importer, ::error::Error> {
|
) -> Result<Importer, ::error::Error> {
|
||||||
@ -857,7 +857,7 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns engine reference.
|
/// Returns engine reference.
|
||||||
pub fn engine(&self) -> &dyn EthEngine {
|
pub fn engine(&self) -> &dyn Engine {
|
||||||
&*self.engine
|
&*self.engine
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1661,7 +1661,7 @@ impl Call for Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl EngineInfo for Client {
|
impl EngineInfo for Client {
|
||||||
fn engine(&self) -> &dyn EthEngine {
|
fn engine(&self) -> &dyn Engine {
|
||||||
Client::engine(self)
|
Client::engine(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ use client::{
|
|||||||
Call, StateClient, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, IoClient,
|
Call, StateClient, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, IoClient,
|
||||||
BadBlocks
|
BadBlocks
|
||||||
};
|
};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::{Error, EthcoreResult};
|
use error::{Error, EthcoreResult};
|
||||||
use executed::CallError;
|
use executed::CallError;
|
||||||
use executive::Executed;
|
use executive::Executed;
|
||||||
@ -627,7 +627,7 @@ impl StateClient for TestBlockChainClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl EngineInfo for TestBlockChainClient {
|
impl EngineInfo for TestBlockChainClient {
|
||||||
fn engine(&self) -> &dyn EthEngine {
|
fn engine(&self) -> &dyn Engine {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ use vm::LastHashes;
|
|||||||
|
|
||||||
use block::{OpenBlock, SealedBlock, ClosedBlock};
|
use block::{OpenBlock, SealedBlock, ClosedBlock};
|
||||||
use client::Mode;
|
use client::Mode;
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::{Error, EthcoreResult};
|
use error::{Error, EthcoreResult};
|
||||||
use executed::CallError;
|
use executed::CallError;
|
||||||
use executive::Executed;
|
use executive::Executed;
|
||||||
@ -184,7 +184,7 @@ pub trait Call {
|
|||||||
/// Provides `engine` method
|
/// Provides `engine` method
|
||||||
pub trait EngineInfo {
|
pub trait EngineInfo {
|
||||||
/// Get underlying engine object
|
/// Get underlying engine object
|
||||||
fn engine(&self) -> &dyn EthEngine;
|
fn engine(&self) -> &dyn Engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// IO operations that should off-load heavy work to another thread.
|
/// IO operations that should off-load heavy work to another thread.
|
||||||
|
@ -1636,7 +1636,7 @@ mod tests {
|
|||||||
};
|
};
|
||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use types::transaction::{Action, Transaction};
|
use types::transaction::{Action, Transaction};
|
||||||
use engines::{Seal, Engine, EngineError, EthEngine};
|
use engines::{Seal, Engine, EngineError};
|
||||||
use engines::validator_set::{TestSet, SimpleList};
|
use engines::validator_set::{TestSet, SimpleList};
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use super::{AuthorityRoundParams, AuthorityRound, EmptyStep, SealedEmptyStep, calculate_score};
|
use super::{AuthorityRoundParams, AuthorityRound, EmptyStep, SealedEmptyStep, calculate_score};
|
||||||
@ -1942,14 +1942,14 @@ mod tests {
|
|||||||
(spec, tap, accounts)
|
(spec, tap, accounts)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn empty_step(engine: &dyn EthEngine, step: u64, parent_hash: &H256) -> EmptyStep {
|
fn empty_step(engine: &dyn Engine, step: u64, parent_hash: &H256) -> EmptyStep {
|
||||||
let empty_step_rlp = super::empty_step_rlp(step, parent_hash);
|
let empty_step_rlp = super::empty_step_rlp(step, parent_hash);
|
||||||
let signature = engine.sign(keccak(&empty_step_rlp)).unwrap().into();
|
let signature = engine.sign(keccak(&empty_step_rlp)).unwrap().into();
|
||||||
let parent_hash = parent_hash.clone();
|
let parent_hash = parent_hash.clone();
|
||||||
EmptyStep { step, signature, parent_hash }
|
EmptyStep { step, signature, parent_hash }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sealed_empty_step(engine: &dyn EthEngine, step: u64, parent_hash: &H256) -> SealedEmptyStep {
|
fn sealed_empty_step(engine: &dyn Engine, step: u64, parent_hash: &H256) -> SealedEmptyStep {
|
||||||
let empty_step_rlp = super::empty_step_rlp(step, parent_hash);
|
let empty_step_rlp = super::empty_step_rlp(step, parent_hash);
|
||||||
let signature = engine.sign(keccak(&empty_step_rlp)).unwrap().into();
|
let signature = engine.sign(keccak(&empty_step_rlp)).unwrap().into();
|
||||||
SealedEmptyStep { signature, step }
|
SealedEmptyStep { signature, step }
|
||||||
|
@ -475,22 +475,7 @@ pub trait Engine: Sync + Send {
|
|||||||
fn executive_author(&self, header: &Header) -> Result<Address, Error> {
|
fn executive_author(&self, header: &Header) -> Result<Address, Error> {
|
||||||
Ok(*header.author())
|
Ok(*header.author())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// Check whether a given block is the best block based on the default total difficulty rule.
|
|
||||||
pub fn total_difficulty_fork_choice(new: &ExtendedHeader, best: &ExtendedHeader) -> ForkChoice {
|
|
||||||
if new.total_score() > best.total_score() {
|
|
||||||
ForkChoice::New
|
|
||||||
} else {
|
|
||||||
ForkChoice::Old
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Common type alias for an engine coupled with an Ethereum-like state machine.
|
|
||||||
// TODO: make this a _trait_ alias when those exist.
|
|
||||||
// fortunately the effect is largely the same since engines are mostly used
|
|
||||||
// via trait objects.
|
|
||||||
pub trait EthEngine: Engine {
|
|
||||||
/// Get the general parameters of the chain.
|
/// Get the general parameters of the chain.
|
||||||
fn params(&self) -> &CommonParams {
|
fn params(&self) -> &CommonParams {
|
||||||
self.machine().params()
|
self.machine().params()
|
||||||
@ -569,8 +554,14 @@ pub trait EthEngine: Engine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// convenience wrappers for existing functions.
|
/// Check whether a given block is the best block based on the default total difficulty rule.
|
||||||
impl<T> EthEngine for T where T: Engine { }
|
pub fn total_difficulty_fork_choice(new: &ExtendedHeader, best: &ExtendedHeader) -> ForkChoice {
|
||||||
|
if new.total_score() > best.total_score() {
|
||||||
|
ForkChoice::New
|
||||||
|
} else {
|
||||||
|
ForkChoice::Old
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Verifier for all blocks within an epoch with self-contained state.
|
/// Verifier for all blocks within an epoch with self-contained state.
|
||||||
pub trait EpochVerifier: Send + Sync {
|
pub trait EpochVerifier: Send + Sync {
|
||||||
|
@ -53,7 +53,7 @@ use client::{
|
|||||||
BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId
|
BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId
|
||||||
};
|
};
|
||||||
use client::{BlockId, ClientIoMessage};
|
use client::{BlockId, ClientIoMessage};
|
||||||
use engines::{EthEngine, Seal, SealingState, EngineSigner};
|
use engines::{Engine, Seal, SealingState, EngineSigner};
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use executed::ExecutionError;
|
use executed::ExecutionError;
|
||||||
use executive::contract_address;
|
use executive::contract_address;
|
||||||
@ -245,7 +245,7 @@ pub struct Miner {
|
|||||||
options: MinerOptions,
|
options: MinerOptions,
|
||||||
// TODO [ToDr] Arc is only required because of price updater
|
// TODO [ToDr] Arc is only required because of price updater
|
||||||
transaction_queue: Arc<TransactionQueue>,
|
transaction_queue: Arc<TransactionQueue>,
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
accounts: Arc<dyn LocalAccounts>,
|
accounts: Arc<dyn LocalAccounts>,
|
||||||
io_channel: RwLock<Option<IoChannel<ClientIoMessage>>>,
|
io_channel: RwLock<Option<IoChannel<ClientIoMessage>>>,
|
||||||
service_transaction_checker: Option<ServiceTransactionChecker>,
|
service_transaction_checker: Option<ServiceTransactionChecker>,
|
||||||
|
@ -37,7 +37,7 @@ use parking_lot::RwLock;
|
|||||||
|
|
||||||
use call_contract::CallContract;
|
use call_contract::CallContract;
|
||||||
use client::{TransactionId, BlockInfo, Nonce};
|
use client::{TransactionId, BlockInfo, Nonce};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use miner;
|
use miner;
|
||||||
use transaction_ext::Transaction;
|
use transaction_ext::Transaction;
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ impl NonceCache {
|
|||||||
pub struct PoolClient<'a, C: 'a> {
|
pub struct PoolClient<'a, C: 'a> {
|
||||||
chain: &'a C,
|
chain: &'a C,
|
||||||
cached_nonces: CachedNonceClient<'a, C>,
|
cached_nonces: CachedNonceClient<'a, C>,
|
||||||
engine: &'a dyn EthEngine,
|
engine: &'a dyn Engine,
|
||||||
accounts: &'a dyn LocalAccounts,
|
accounts: &'a dyn LocalAccounts,
|
||||||
best_block_header: Header,
|
best_block_header: Header,
|
||||||
service_transaction_checker: Option<&'a ServiceTransactionChecker>,
|
service_transaction_checker: Option<&'a ServiceTransactionChecker>,
|
||||||
@ -98,7 +98,7 @@ impl<'a, C: 'a> PoolClient<'a, C> where
|
|||||||
pub fn new(
|
pub fn new(
|
||||||
chain: &'a C,
|
chain: &'a C,
|
||||||
cache: &'a NonceCache,
|
cache: &'a NonceCache,
|
||||||
engine: &'a dyn EthEngine,
|
engine: &'a dyn Engine,
|
||||||
accounts: &'a dyn LocalAccounts,
|
accounts: &'a dyn LocalAccounts,
|
||||||
service_transaction_checker: Option<&'a ServiceTransactionChecker>,
|
service_transaction_checker: Option<&'a ServiceTransactionChecker>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
@ -24,7 +24,7 @@ use super::{SnapshotComponents, Rebuilder, ChunkSink};
|
|||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use engines::{EthEngine, EpochVerifier, EpochTransition};
|
use engines::{Engine, EpochVerifier, EpochTransition};
|
||||||
use snapshot::{Error, ManifestData, Progress};
|
use snapshot::{Error, ManifestData, Progress};
|
||||||
|
|
||||||
use blockchain::{BlockChain, BlockChainDB, BlockProvider};
|
use blockchain::{BlockChain, BlockChainDB, BlockProvider};
|
||||||
@ -184,7 +184,7 @@ impl ChunkRebuilder {
|
|||||||
&mut self,
|
&mut self,
|
||||||
last_verifier: &mut Option<Box<dyn EpochVerifier>>,
|
last_verifier: &mut Option<Box<dyn EpochVerifier>>,
|
||||||
transition_rlp: Rlp,
|
transition_rlp: Rlp,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
) -> Result<Verified, ::error::Error> {
|
) -> Result<Verified, ::error::Error> {
|
||||||
use engines::ConstructedVerifier;
|
use engines::ConstructedVerifier;
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ impl Rebuilder for ChunkRebuilder {
|
|||||||
fn feed(
|
fn feed(
|
||||||
&mut self,
|
&mut self,
|
||||||
chunk: &[u8],
|
chunk: &[u8],
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
abort_flag: &AtomicBool,
|
abort_flag: &AtomicBool,
|
||||||
) -> Result<(), ::error::Error> {
|
) -> Result<(), ::error::Error> {
|
||||||
let rlp = Rlp::new(chunk);
|
let rlp = Rlp::new(chunk);
|
||||||
@ -348,7 +348,7 @@ impl Rebuilder for ChunkRebuilder {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn finalize(&mut self, _engine: &dyn EthEngine) -> Result<(), ::error::Error> {
|
fn finalize(&mut self, _engine: &dyn Engine) -> Result<(), ::error::Error> {
|
||||||
if !self.had_genesis {
|
if !self.had_genesis {
|
||||||
return Err(Error::WrongChunkFormat("No genesis transition included.".into()).into());
|
return Err(Error::WrongChunkFormat("No genesis transition included.".into()).into());
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ use std::sync::atomic::AtomicBool;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use blockchain::{BlockChain, BlockChainDB};
|
use blockchain::{BlockChain, BlockChainDB};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use snapshot::{Error, ManifestData, Progress};
|
use snapshot::{Error, ManifestData, Progress};
|
||||||
|
|
||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
@ -83,7 +83,7 @@ pub trait Rebuilder: Send {
|
|||||||
fn feed(
|
fn feed(
|
||||||
&mut self,
|
&mut self,
|
||||||
chunk: &[u8],
|
chunk: &[u8],
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
abort_flag: &AtomicBool,
|
abort_flag: &AtomicBool,
|
||||||
) -> Result<(), ::error::Error>;
|
) -> Result<(), ::error::Error>;
|
||||||
|
|
||||||
@ -92,5 +92,5 @@ pub trait Rebuilder: Send {
|
|||||||
///
|
///
|
||||||
/// This should apply the necessary "glue" between chunks,
|
/// This should apply the necessary "glue" between chunks,
|
||||||
/// and verify against the restored state.
|
/// and verify against the restored state.
|
||||||
fn finalize(&mut self, engine: &dyn EthEngine) -> Result<(), ::error::Error>;
|
fn finalize(&mut self, engine: &dyn Engine) -> Result<(), ::error::Error>;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use blockchain::{BlockChain, BlockChainDB, BlockProvider};
|
use blockchain::{BlockChain, BlockChainDB, BlockProvider};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use snapshot::{Error, ManifestData, Progress};
|
use snapshot::{Error, ManifestData, Progress};
|
||||||
use snapshot::block::AbridgedBlock;
|
use snapshot::block::AbridgedBlock;
|
||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
@ -224,7 +224,7 @@ impl PowRebuilder {
|
|||||||
impl Rebuilder for PowRebuilder {
|
impl Rebuilder for PowRebuilder {
|
||||||
/// Feed the rebuilder an uncompressed block chunk.
|
/// Feed the rebuilder an uncompressed block chunk.
|
||||||
/// Returns the number of blocks fed or any errors.
|
/// Returns the number of blocks fed or any errors.
|
||||||
fn feed(&mut self, chunk: &[u8], engine: &dyn EthEngine, abort_flag: &AtomicBool) -> Result<(), ::error::Error> {
|
fn feed(&mut self, chunk: &[u8], engine: &dyn Engine, abort_flag: &AtomicBool) -> Result<(), ::error::Error> {
|
||||||
use snapshot::verify_old_block;
|
use snapshot::verify_old_block;
|
||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
use triehash::ordered_trie_root;
|
use triehash::ordered_trie_root;
|
||||||
@ -298,7 +298,7 @@ impl Rebuilder for PowRebuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Glue together any disconnected chunks and check that the chain is complete.
|
/// Glue together any disconnected chunks and check that the chain is complete.
|
||||||
fn finalize(&mut self, _: &dyn EthEngine) -> Result<(), ::error::Error> {
|
fn finalize(&mut self, _: &dyn Engine) -> Result<(), ::error::Error> {
|
||||||
let mut batch = self.db.transaction();
|
let mut batch = self.db.transaction();
|
||||||
|
|
||||||
for (first_num, first_hash) in self.disconnected.drain(..) {
|
for (first_num, first_hash) in self.disconnected.drain(..) {
|
||||||
|
@ -27,7 +27,7 @@ use hash::{keccak, KECCAK_NULL_RLP, KECCAK_EMPTY};
|
|||||||
|
|
||||||
use account_db::{AccountDB, AccountDBMut};
|
use account_db::{AccountDB, AccountDBMut};
|
||||||
use blockchain::{BlockChain, BlockProvider};
|
use blockchain::{BlockChain, BlockProvider};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use types::ids::BlockId;
|
use types::ids::BlockId;
|
||||||
|
|
||||||
@ -578,7 +578,7 @@ const POW_VERIFY_RATE: f32 = 0.02;
|
|||||||
/// Verify an old block with the given header, engine, blockchain, body. If `always` is set, it will perform
|
/// Verify an old block with the given header, engine, blockchain, body. If `always` is set, it will perform
|
||||||
/// the fullest verification possible. If not, it will take a random sample to determine whether it will
|
/// the fullest verification possible. If not, it will take a random sample to determine whether it will
|
||||||
/// do heavy or light verification.
|
/// do heavy or light verification.
|
||||||
pub fn verify_old_block(rng: &mut OsRng, header: &Header, engine: &dyn EthEngine, chain: &BlockChain, always: bool) -> Result<(), ::error::Error> {
|
pub fn verify_old_block(rng: &mut OsRng, header: &Header, engine: &dyn Engine, chain: &BlockChain, always: bool) -> Result<(), ::error::Error> {
|
||||||
engine.verify_block_basic(header)?;
|
engine.verify_block_basic(header)?;
|
||||||
|
|
||||||
if always || rng.gen::<f32>() <= POW_VERIFY_RATE {
|
if always || rng.gen::<f32>() <= POW_VERIFY_RATE {
|
||||||
|
@ -29,7 +29,7 @@ use super::io::{SnapshotReader, LooseReader, SnapshotWriter, LooseWriter};
|
|||||||
|
|
||||||
use blockchain::{BlockChain, BlockChainDB, BlockChainDBHandler};
|
use blockchain::{BlockChain, BlockChainDB, BlockChainDBHandler};
|
||||||
use client::{BlockInfo, BlockChainClient, Client, ChainInfo, ClientIoMessage};
|
use client::{BlockInfo, BlockChainClient, Client, ChainInfo, ClientIoMessage};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use snapshot::{Error as SnapshotError};
|
use snapshot::{Error as SnapshotError};
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
@ -91,7 +91,7 @@ struct RestorationParams<'a> {
|
|||||||
writer: Option<LooseWriter>, // writer for recovered snapshot.
|
writer: Option<LooseWriter>, // writer for recovered snapshot.
|
||||||
genesis: &'a [u8], // genesis block of the chain.
|
genesis: &'a [u8], // genesis block of the chain.
|
||||||
guard: Guard, // guard for the restoration directory.
|
guard: Guard, // guard for the restoration directory.
|
||||||
engine: &'a dyn EthEngine,
|
engine: &'a dyn Engine,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Restoration {
|
impl Restoration {
|
||||||
@ -149,7 +149,7 @@ impl Restoration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// feeds a block chunk
|
// feeds a block chunk
|
||||||
fn feed_blocks(&mut self, hash: H256, chunk: &[u8], engine: &dyn EthEngine, flag: &AtomicBool) -> Result<(), Error> {
|
fn feed_blocks(&mut self, hash: H256, chunk: &[u8], engine: &dyn Engine, flag: &AtomicBool) -> Result<(), Error> {
|
||||||
if self.block_chunks_left.contains(&hash) {
|
if self.block_chunks_left.contains(&hash) {
|
||||||
let expected_len = snappy::decompressed_len(chunk)?;
|
let expected_len = snappy::decompressed_len(chunk)?;
|
||||||
if expected_len > MAX_CHUNK_SIZE {
|
if expected_len > MAX_CHUNK_SIZE {
|
||||||
@ -170,7 +170,7 @@ impl Restoration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// finish up restoration.
|
// finish up restoration.
|
||||||
fn finalize(mut self, engine: &dyn EthEngine) -> Result<(), Error> {
|
fn finalize(mut self, engine: &dyn Engine) -> Result<(), Error> {
|
||||||
use trie::TrieError;
|
use trie::TrieError;
|
||||||
|
|
||||||
if !self.is_done() { return Ok(()) }
|
if !self.is_done() { return Ok(()) }
|
||||||
@ -211,7 +211,7 @@ pub trait SnapshotClient: BlockChainClient + BlockInfo + DatabaseRestore {}
|
|||||||
/// Snapshot service parameters.
|
/// Snapshot service parameters.
|
||||||
pub struct ServiceParams {
|
pub struct ServiceParams {
|
||||||
/// The consensus engine this is built on.
|
/// The consensus engine this is built on.
|
||||||
pub engine: Arc<dyn EthEngine>,
|
pub engine: Arc<dyn Engine>,
|
||||||
/// The chain's genesis block.
|
/// The chain's genesis block.
|
||||||
pub genesis_block: Bytes,
|
pub genesis_block: Bytes,
|
||||||
/// State pruning algorithm.
|
/// State pruning algorithm.
|
||||||
@ -237,7 +237,7 @@ pub struct Service {
|
|||||||
pruning: Algorithm,
|
pruning: Algorithm,
|
||||||
status: Mutex<RestorationStatus>,
|
status: Mutex<RestorationStatus>,
|
||||||
reader: RwLock<Option<LooseReader>>,
|
reader: RwLock<Option<LooseReader>>,
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
genesis_block: Bytes,
|
genesis_block: Bytes,
|
||||||
state_chunks: AtomicUsize,
|
state_chunks: AtomicUsize,
|
||||||
block_chunks: AtomicUsize,
|
block_chunks: AtomicUsize,
|
||||||
|
@ -26,7 +26,7 @@ use account_db::AccountDBMut;
|
|||||||
use types::basic_account::BasicAccount;
|
use types::basic_account::BasicAccount;
|
||||||
use blockchain::{BlockChain, BlockChainDB};
|
use blockchain::{BlockChain, BlockChainDB};
|
||||||
use client::{Client, ChainInfo};
|
use client::{Client, ChainInfo};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use snapshot::{StateRebuilder};
|
use snapshot::{StateRebuilder};
|
||||||
use snapshot::io::{SnapshotReader, PackedWriter, PackedReader};
|
use snapshot::io::{SnapshotReader, PackedWriter, PackedReader};
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ pub fn snap(client: &Client) -> (Box<dyn SnapshotReader>, TempDir) {
|
|||||||
/// write into the given database.
|
/// write into the given database.
|
||||||
pub fn restore(
|
pub fn restore(
|
||||||
db: Arc<dyn BlockChainDB>,
|
db: Arc<dyn BlockChainDB>,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
reader: &dyn SnapshotReader,
|
reader: &dyn SnapshotReader,
|
||||||
genesis: &[u8],
|
genesis: &[u8],
|
||||||
) -> Result<(), ::error::Error> {
|
) -> Result<(), ::error::Error> {
|
||||||
|
@ -35,7 +35,7 @@ use vm::{EnvInfo, CallType, ActionValue, ActionParams, ParamsType};
|
|||||||
|
|
||||||
use builtin::Builtin;
|
use builtin::Builtin;
|
||||||
use engines::{
|
use engines::{
|
||||||
EthEngine, NullEngine, InstantSeal, InstantSealParams, BasicAuthority, Clique,
|
Engine, NullEngine, InstantSeal, InstantSealParams, BasicAuthority, Clique,
|
||||||
AuthorityRound, DEFAULT_BLOCKHASH_CONTRACT
|
AuthorityRound, DEFAULT_BLOCKHASH_CONTRACT
|
||||||
};
|
};
|
||||||
use error::Error;
|
use error::Error;
|
||||||
@ -382,7 +382,7 @@ pub struct Spec {
|
|||||||
/// User friendly spec name
|
/// User friendly spec name
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// What engine are we using for this?
|
/// What engine are we using for this?
|
||||||
pub engine: Arc<dyn EthEngine>,
|
pub engine: Arc<dyn Engine>,
|
||||||
/// Name of the subdir inside the main data dir to use for chain data and settings.
|
/// Name of the subdir inside the main data dir to use for chain data and settings.
|
||||||
pub data_dir: String,
|
pub data_dir: String,
|
||||||
|
|
||||||
@ -601,7 +601,7 @@ impl Spec {
|
|||||||
engine_spec: ethjson::spec::Engine,
|
engine_spec: ethjson::spec::Engine,
|
||||||
params: CommonParams,
|
params: CommonParams,
|
||||||
builtins: BTreeMap<Address, Builtin>,
|
builtins: BTreeMap<Address, Builtin>,
|
||||||
) -> Arc<dyn EthEngine> {
|
) -> Arc<dyn Engine> {
|
||||||
let machine = Self::machine(&engine_spec, params, builtins);
|
let machine = Self::machine(&engine_spec, params, builtins);
|
||||||
|
|
||||||
match engine_spec {
|
match engine_spec {
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
use call_contract::CallContract;
|
use call_contract::CallContract;
|
||||||
use client::BlockInfo;
|
use client::BlockInfo;
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use super::Verifier;
|
use super::Verifier;
|
||||||
@ -32,7 +32,7 @@ impl<C: BlockInfo + CallContract> Verifier<C> for CanonVerifier {
|
|||||||
&self,
|
&self,
|
||||||
header: &Header,
|
header: &Header,
|
||||||
parent: &Header,
|
parent: &Header,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
do_full: Option<verification::FullFamilyParams<C>>,
|
do_full: Option<verification::FullFamilyParams<C>>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
verification::verify_block_family(header, parent, engine, do_full)
|
verification::verify_block_family(header, parent, engine, do_full)
|
||||||
@ -42,7 +42,7 @@ impl<C: BlockInfo + CallContract> Verifier<C> for CanonVerifier {
|
|||||||
verification::verify_block_final(expected, got)
|
verification::verify_block_final(expected, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn verify_block_external(&self, header: &Header, engine: &dyn EthEngine) -> Result<(), Error> {
|
fn verify_block_external(&self, header: &Header, engine: &dyn Engine) -> Result<(), Error> {
|
||||||
engine.verify_block_external(header)
|
engine.verify_block_external(header)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
use call_contract::CallContract;
|
use call_contract::CallContract;
|
||||||
use client::BlockInfo;
|
use client::BlockInfo;
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use super::{verification, Verifier};
|
use super::{verification, Verifier};
|
||||||
@ -32,7 +32,7 @@ impl<C: BlockInfo + CallContract> Verifier<C> for NoopVerifier {
|
|||||||
&self,
|
&self,
|
||||||
_: &Header,
|
_: &Header,
|
||||||
_t: &Header,
|
_t: &Header,
|
||||||
_: &dyn EthEngine,
|
_: &dyn Engine,
|
||||||
_: Option<verification::FullFamilyParams<C>>
|
_: Option<verification::FullFamilyParams<C>>
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -42,7 +42,7 @@ impl<C: BlockInfo + CallContract> Verifier<C> for NoopVerifier {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn verify_block_external(&self, _header: &Header, _engine: &dyn EthEngine) -> Result<(), Error> {
|
fn verify_block_external(&self, _header: &Header, _engine: &dyn Engine) -> Result<(), Error> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
//! Definition of valid items for the verification queue.
|
//! Definition of valid items for the verification queue.
|
||||||
|
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
|
|
||||||
use parity_util_mem::MallocSizeOf;
|
use parity_util_mem::MallocSizeOf;
|
||||||
@ -58,17 +58,17 @@ pub trait Kind: 'static + Sized + Send + Sync {
|
|||||||
type Verified: Sized + Send + BlockLike + MallocSizeOf;
|
type Verified: Sized + Send + BlockLike + MallocSizeOf;
|
||||||
|
|
||||||
/// Attempt to create the `Unverified` item from the input.
|
/// Attempt to create the `Unverified` item from the input.
|
||||||
fn create(input: Self::Input, engine: &dyn EthEngine, check_seal: bool) -> Result<Self::Unverified, (Self::Input, Error)>;
|
fn create(input: Self::Input, engine: &dyn Engine, check_seal: bool) -> Result<Self::Unverified, (Self::Input, Error)>;
|
||||||
|
|
||||||
/// Attempt to verify the `Unverified` item using the given engine.
|
/// Attempt to verify the `Unverified` item using the given engine.
|
||||||
fn verify(unverified: Self::Unverified, engine: &dyn EthEngine, check_seal: bool) -> Result<Self::Verified, Error>;
|
fn verify(unverified: Self::Unverified, engine: &dyn Engine, check_seal: bool) -> Result<Self::Verified, Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The blocks verification module.
|
/// The blocks verification module.
|
||||||
pub mod blocks {
|
pub mod blocks {
|
||||||
use super::{Kind, BlockLike};
|
use super::{Kind, BlockLike};
|
||||||
|
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::{Error, BlockError};
|
use error::{Error, BlockError};
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use verification::{PreverifiedBlock, verify_block_basic, verify_block_unordered};
|
use verification::{PreverifiedBlock, verify_block_basic, verify_block_unordered};
|
||||||
@ -86,7 +86,7 @@ pub mod blocks {
|
|||||||
type Unverified = Unverified;
|
type Unverified = Unverified;
|
||||||
type Verified = PreverifiedBlock;
|
type Verified = PreverifiedBlock;
|
||||||
|
|
||||||
fn create(input: Self::Input, engine: &dyn EthEngine, check_seal: bool) -> Result<Self::Unverified, (Self::Input, Error)> {
|
fn create(input: Self::Input, engine: &dyn Engine, check_seal: bool) -> Result<Self::Unverified, (Self::Input, Error)> {
|
||||||
match verify_block_basic(&input, engine, check_seal) {
|
match verify_block_basic(&input, engine, check_seal) {
|
||||||
Ok(()) => Ok(input),
|
Ok(()) => Ok(input),
|
||||||
Err(Error::Block(BlockError::TemporarilyInvalid(oob))) => {
|
Err(Error::Block(BlockError::TemporarilyInvalid(oob))) => {
|
||||||
@ -100,7 +100,7 @@ pub mod blocks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn verify(un: Self::Unverified, engine: &dyn EthEngine, check_seal: bool) -> Result<Self::Verified, Error> {
|
fn verify(un: Self::Unverified, engine: &dyn Engine, check_seal: bool) -> Result<Self::Verified, Error> {
|
||||||
let hash = un.hash();
|
let hash = un.hash();
|
||||||
match verify_block_unordered(un, engine, check_seal) {
|
match verify_block_unordered(un, engine, check_seal) {
|
||||||
Ok(verified) => Ok(verified),
|
Ok(verified) => Ok(verified),
|
||||||
@ -179,7 +179,7 @@ pub mod blocks {
|
|||||||
pub mod headers {
|
pub mod headers {
|
||||||
use super::{Kind, BlockLike};
|
use super::{Kind, BlockLike};
|
||||||
|
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use verification::verify_header_params;
|
use verification::verify_header_params;
|
||||||
@ -200,14 +200,14 @@ pub mod headers {
|
|||||||
type Unverified = Header;
|
type Unverified = Header;
|
||||||
type Verified = Header;
|
type Verified = Header;
|
||||||
|
|
||||||
fn create(input: Self::Input, engine: &dyn EthEngine, check_seal: bool) -> Result<Self::Unverified, (Self::Input, Error)> {
|
fn create(input: Self::Input, engine: &dyn Engine, check_seal: bool) -> Result<Self::Unverified, (Self::Input, Error)> {
|
||||||
match verify_header_params(&input, engine, true, check_seal) {
|
match verify_header_params(&input, engine, true, check_seal) {
|
||||||
Ok(_) => Ok(input),
|
Ok(_) => Ok(input),
|
||||||
Err(err) => Err((input, err))
|
Err(err) => Err((input, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn verify(unverified: Self::Unverified, engine: &dyn EthEngine, check_seal: bool) -> Result<Self::Verified, Error> {
|
fn verify(unverified: Self::Unverified, engine: &dyn Engine, check_seal: bool) -> Result<Self::Verified, Error> {
|
||||||
match check_seal {
|
match check_seal {
|
||||||
true => engine.verify_block_unordered(&unverified,).map(|_| unverified),
|
true => engine.verify_block_unordered(&unverified,).map(|_| unverified),
|
||||||
false => Ok(unverified),
|
false => Ok(unverified),
|
||||||
|
@ -27,7 +27,7 @@ use ethereum_types::{H256, U256};
|
|||||||
use parking_lot::{Condvar, Mutex, RwLock};
|
use parking_lot::{Condvar, Mutex, RwLock};
|
||||||
use io::*;
|
use io::*;
|
||||||
use error::{BlockError, ImportError, Error};
|
use error::{BlockError, ImportError, Error};
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use client::ClientIoMessage;
|
use client::ClientIoMessage;
|
||||||
use len_caching_lock::LenCachingMutex;
|
use len_caching_lock::LenCachingMutex;
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ struct Sizes {
|
|||||||
/// A queue of items to be verified. Sits between network or other I/O and the `BlockChain`.
|
/// A queue of items to be verified. Sits between network or other I/O and the `BlockChain`.
|
||||||
/// Keeps them in the same order as inserted, minus invalid items.
|
/// Keeps them in the same order as inserted, minus invalid items.
|
||||||
pub struct VerificationQueue<K: Kind> {
|
pub struct VerificationQueue<K: Kind> {
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
more_to_verify: Arc<Condvar>,
|
more_to_verify: Arc<Condvar>,
|
||||||
verification: Arc<Verification<K>>,
|
verification: Arc<Verification<K>>,
|
||||||
deleting: Arc<AtomicBool>,
|
deleting: Arc<AtomicBool>,
|
||||||
@ -201,7 +201,7 @@ struct Verification<K: Kind> {
|
|||||||
|
|
||||||
impl<K: Kind> VerificationQueue<K> {
|
impl<K: Kind> VerificationQueue<K> {
|
||||||
/// Creates a new queue instance.
|
/// Creates a new queue instance.
|
||||||
pub fn new(config: Config, engine: Arc<dyn EthEngine>, message_channel: IoChannel<ClientIoMessage>, check_seal: bool) -> Self {
|
pub fn new(config: Config, engine: Arc<dyn Engine>, message_channel: IoChannel<ClientIoMessage>, check_seal: bool) -> Self {
|
||||||
let verification = Arc::new(Verification {
|
let verification = Arc::new(Verification {
|
||||||
unverified: LenCachingMutex::new(VecDeque::new()),
|
unverified: LenCachingMutex::new(VecDeque::new()),
|
||||||
verifying: LenCachingMutex::new(VecDeque::new()),
|
verifying: LenCachingMutex::new(VecDeque::new()),
|
||||||
@ -288,7 +288,7 @@ impl<K: Kind> VerificationQueue<K> {
|
|||||||
|
|
||||||
fn verify(
|
fn verify(
|
||||||
verification: Arc<Verification<K>>,
|
verification: Arc<Verification<K>>,
|
||||||
engine: Arc<dyn EthEngine>,
|
engine: Arc<dyn Engine>,
|
||||||
wait: Arc<Condvar>,
|
wait: Arc<Condvar>,
|
||||||
ready: Arc<QueueSignal>,
|
ready: Arc<QueueSignal>,
|
||||||
empty: Arc<Condvar>,
|
empty: Arc<Condvar>,
|
||||||
|
@ -34,7 +34,7 @@ use unexpected::{Mismatch, OutOfBounds};
|
|||||||
use blockchain::*;
|
use blockchain::*;
|
||||||
use call_contract::CallContract;
|
use call_contract::CallContract;
|
||||||
use client::BlockInfo;
|
use client::BlockInfo;
|
||||||
use engines::{EthEngine, MAX_UNCLE_AGE};
|
use engines::{Engine, MAX_UNCLE_AGE};
|
||||||
use error::{BlockError, Error};
|
use error::{BlockError, Error};
|
||||||
use types::{BlockNumber, header::Header};
|
use types::{BlockNumber, header::Header};
|
||||||
use types::transaction::SignedTransaction;
|
use types::transaction::SignedTransaction;
|
||||||
@ -56,7 +56,7 @@ pub struct PreverifiedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Phase 1 quick block verification. Only does checks that are cheap. Operates on a single block
|
/// Phase 1 quick block verification. Only does checks that are cheap. Operates on a single block
|
||||||
pub fn verify_block_basic(block: &Unverified, engine: &dyn EthEngine, check_seal: bool) -> Result<(), Error> {
|
pub fn verify_block_basic(block: &Unverified, engine: &dyn Engine, check_seal: bool) -> Result<(), Error> {
|
||||||
verify_header_params(&block.header, engine, true, check_seal)?;
|
verify_header_params(&block.header, engine, true, check_seal)?;
|
||||||
verify_block_integrity(block)?;
|
verify_block_integrity(block)?;
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ pub fn verify_block_basic(block: &Unverified, engine: &dyn EthEngine, check_seal
|
|||||||
/// Phase 2 verification. Perform costly checks such as transaction signatures and block nonce for ethash.
|
/// Phase 2 verification. Perform costly checks such as transaction signatures and block nonce for ethash.
|
||||||
/// Still operates on a individual block
|
/// Still operates on a individual block
|
||||||
/// Returns a `PreverifiedBlock` structure populated with transactions
|
/// Returns a `PreverifiedBlock` structure populated with transactions
|
||||||
pub fn verify_block_unordered(block: Unverified, engine: &dyn EthEngine, check_seal: bool) -> Result<PreverifiedBlock, Error> {
|
pub fn verify_block_unordered(block: Unverified, engine: &dyn Engine, check_seal: bool) -> Result<PreverifiedBlock, Error> {
|
||||||
let header = block.header;
|
let header = block.header;
|
||||||
if check_seal {
|
if check_seal {
|
||||||
engine.verify_block_unordered(&header)?;
|
engine.verify_block_unordered(&header)?;
|
||||||
@ -130,7 +130,7 @@ pub struct FullFamilyParams<'a, C: BlockInfo + CallContract + 'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Phase 3 verification. Check block information against parent and uncles.
|
/// Phase 3 verification. Check block information against parent and uncles.
|
||||||
pub fn verify_block_family<C: BlockInfo + CallContract>(header: &Header, parent: &Header, engine: &dyn EthEngine, do_full: Option<FullFamilyParams<C>>) -> Result<(), Error> {
|
pub fn verify_block_family<C: BlockInfo + CallContract>(header: &Header, parent: &Header, engine: &dyn Engine, do_full: Option<FullFamilyParams<C>>) -> Result<(), Error> {
|
||||||
// TODO: verify timestamp
|
// TODO: verify timestamp
|
||||||
verify_parent(&header, &parent, engine)?;
|
verify_parent(&header, &parent, engine)?;
|
||||||
engine.verify_block_family(&header, &parent)?;
|
engine.verify_block_family(&header, &parent)?;
|
||||||
@ -151,7 +151,7 @@ pub fn verify_block_family<C: BlockInfo + CallContract>(header: &Header, parent:
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn verify_uncles(block: &PreverifiedBlock, bc: &dyn BlockProvider, engine: &dyn EthEngine) -> Result<(), Error> {
|
fn verify_uncles(block: &PreverifiedBlock, bc: &dyn BlockProvider, engine: &dyn Engine) -> Result<(), Error> {
|
||||||
let header = &block.header;
|
let header = &block.header;
|
||||||
let num_uncles = block.uncles.len();
|
let num_uncles = block.uncles.len();
|
||||||
let max_uncles = engine.maximum_uncle_count(header.number());
|
let max_uncles = engine.maximum_uncle_count(header.number());
|
||||||
@ -259,7 +259,7 @@ pub fn verify_block_final(expected: &Header, got: &Header) -> Result<(), Error>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Check basic header parameters.
|
/// Check basic header parameters.
|
||||||
pub fn verify_header_params(header: &Header, engine: &dyn EthEngine, is_full: bool, check_seal: bool) -> Result<(), Error> {
|
pub fn verify_header_params(header: &Header, engine: &dyn Engine, is_full: bool, check_seal: bool) -> Result<(), Error> {
|
||||||
if check_seal {
|
if check_seal {
|
||||||
let expected_seal_fields = engine.seal_fields(header);
|
let expected_seal_fields = engine.seal_fields(header);
|
||||||
if header.seal().len() != expected_seal_fields {
|
if header.seal().len() != expected_seal_fields {
|
||||||
@ -318,7 +318,7 @@ pub fn verify_header_params(header: &Header, engine: &dyn EthEngine, is_full: bo
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Check header parameters agains parent header.
|
/// Check header parameters agains parent header.
|
||||||
fn verify_parent(header: &Header, parent: &Header, engine: &dyn EthEngine) -> Result<(), Error> {
|
fn verify_parent(header: &Header, parent: &Header, engine: &dyn Engine) -> Result<(), Error> {
|
||||||
assert!(header.parent_hash().is_zero() || &parent.hash() == header.parent_hash(),
|
assert!(header.parent_hash().is_zero() || &parent.hash() == header.parent_hash(),
|
||||||
"Parent hash should already have been verified; qed");
|
"Parent hash should already have been verified; qed");
|
||||||
|
|
||||||
@ -381,7 +381,7 @@ mod tests {
|
|||||||
use blockchain::{BlockDetails, TransactionAddress, BlockReceipts};
|
use blockchain::{BlockDetails, TransactionAddress, BlockReceipts};
|
||||||
use types::encoded;
|
use types::encoded;
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::BlockError::*;
|
use error::BlockError::*;
|
||||||
use ethkey::{Random, Generator};
|
use ethkey::{Random, Generator};
|
||||||
use spec::{CommonParams, Spec};
|
use spec::{CommonParams, Spec};
|
||||||
@ -508,12 +508,12 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn basic_test(bytes: &[u8], engine: &dyn EthEngine) -> Result<(), Error> {
|
fn basic_test(bytes: &[u8], engine: &dyn Engine) -> Result<(), Error> {
|
||||||
let unverified = Unverified::from_rlp(bytes.to_vec())?;
|
let unverified = Unverified::from_rlp(bytes.to_vec())?;
|
||||||
verify_block_basic(&unverified, engine, true)
|
verify_block_basic(&unverified, engine, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn family_test<BC>(bytes: &[u8], engine: &dyn EthEngine, bc: &BC) -> Result<(), Error> where BC: BlockProvider {
|
fn family_test<BC>(bytes: &[u8], engine: &dyn Engine, bc: &BC) -> Result<(), Error> where BC: BlockProvider {
|
||||||
let block = Unverified::from_rlp(bytes.to_vec()).unwrap();
|
let block = Unverified::from_rlp(bytes.to_vec()).unwrap();
|
||||||
let header = block.header;
|
let header = block.header;
|
||||||
let transactions: Vec<_> = block.transactions
|
let transactions: Vec<_> = block.transactions
|
||||||
@ -545,7 +545,7 @@ mod tests {
|
|||||||
verify_block_family(&block.header, &parent, engine, Some(full_params))
|
verify_block_family(&block.header, &parent, engine, Some(full_params))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unordered_test(bytes: &[u8], engine: &dyn EthEngine) -> Result<(), Error> {
|
fn unordered_test(bytes: &[u8], engine: &dyn Engine) -> Result<(), Error> {
|
||||||
let un = Unverified::from_rlp(bytes.to_vec())?;
|
let un = Unverified::from_rlp(bytes.to_vec())?;
|
||||||
verify_block_unordered(un, engine, false)?;
|
verify_block_unordered(un, engine, false)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
use call_contract::CallContract;
|
use call_contract::CallContract;
|
||||||
use client::BlockInfo;
|
use client::BlockInfo;
|
||||||
use engines::EthEngine;
|
use engines::Engine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
use super::verification;
|
use super::verification;
|
||||||
@ -32,12 +32,12 @@ pub trait Verifier<C>: Send + Sync
|
|||||||
&self,
|
&self,
|
||||||
header: &Header,
|
header: &Header,
|
||||||
parent: &Header,
|
parent: &Header,
|
||||||
engine: &dyn EthEngine,
|
engine: &dyn Engine,
|
||||||
do_full: Option<verification::FullFamilyParams<C>>
|
do_full: Option<verification::FullFamilyParams<C>>
|
||||||
) -> Result<(), Error>;
|
) -> Result<(), Error>;
|
||||||
|
|
||||||
/// Do a final verification check for an enacted header vs its expected counterpart.
|
/// Do a final verification check for an enacted header vs its expected counterpart.
|
||||||
fn verify_block_final(&self, expected: &Header, got: &Header) -> Result<(), Error>;
|
fn verify_block_final(&self, expected: &Header, got: &Header) -> Result<(), Error>;
|
||||||
/// Verify a block, inspecting external state.
|
/// Verify a block, inspecting external state.
|
||||||
fn verify_block_external(&self, header: &Header, engine: &dyn EthEngine) -> Result<(), Error>;
|
fn verify_block_external(&self, header: &Header, engine: &dyn Engine) -> Result<(), Error>;
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
use std::sync::{Arc, Weak};
|
use std::sync::{Arc, Weak};
|
||||||
|
|
||||||
use ethcore::engines::{EthEngine, StateDependentProof};
|
use ethcore::engines::{Engine, StateDependentProof};
|
||||||
use sync::{LightSync, LightNetworkDispatcher};
|
use sync::{LightSync, LightNetworkDispatcher};
|
||||||
use types::encoded;
|
use types::encoded;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
@ -81,7 +81,7 @@ impl ChainDataFetcher for EpochFetch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Fetch epoch transition proof at given header.
|
/// Fetch epoch transition proof at given header.
|
||||||
fn epoch_transition(&self, hash: H256, engine: Arc<EthEngine>, checker: Arc<StateDependentProof>)
|
fn epoch_transition(&self, hash: H256, engine: Arc<Engine>, checker: Arc<StateDependentProof>)
|
||||||
-> Self::Transition
|
-> Self::Transition
|
||||||
{
|
{
|
||||||
self.request(request::Signal {
|
self.request(request::Signal {
|
||||||
|
@ -737,7 +737,7 @@ where
|
|||||||
tx: EthTransaction,
|
tx: EthTransaction,
|
||||||
hdr: encoded::Header,
|
hdr: encoded::Header,
|
||||||
env_info: ::vm::EnvInfo,
|
env_info: ::vm::EnvInfo,
|
||||||
engine: Arc<::ethcore::engines::EthEngine>,
|
engine: Arc<::ethcore::engines::Engine>,
|
||||||
on_demand: Arc<OD>,
|
on_demand: Arc<OD>,
|
||||||
sync: Arc<S>,
|
sync: Arc<S>,
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap};
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ethcore::block::SealedBlock;
|
use ethcore::block::SealedBlock;
|
||||||
use ethcore::client::{Nonce, PrepareOpenBlock, StateClient, EngineInfo};
|
use ethcore::client::{Nonce, PrepareOpenBlock, StateClient, EngineInfo};
|
||||||
use ethcore::engines::{EthEngine, signer::EngineSigner};
|
use ethcore::engines::{Engine, signer::EngineSigner};
|
||||||
use ethcore::error::Error;
|
use ethcore::error::Error;
|
||||||
use ethcore::miner::{self, MinerService, AuthoringParams};
|
use ethcore::miner::{self, MinerService, AuthoringParams};
|
||||||
use ethereum_types::{H256, U256, Address};
|
use ethereum_types::{H256, U256, Address};
|
||||||
@ -99,7 +99,7 @@ impl StateClient for TestMinerService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl EngineInfo for TestMinerService {
|
impl EngineInfo for TestMinerService {
|
||||||
fn engine(&self) -> &EthEngine {
|
fn engine(&self) -> &Engine {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user