From 2409eb293c75b417c3dcaf690e48ce2047ae9c7d Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 5 Dec 2016 15:15:28 +0100 Subject: [PATCH 1/2] share one chain verifier --- sync/src/lib.rs | 8 +++++--- sync/src/synchronization_client.rs | 13 +++++-------- sync/src/synchronization_verifier.rs | 5 ++--- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/sync/src/lib.rs b/sync/src/lib.rs index 8dd68875..00338074 100644 --- a/sync/src/lib.rs +++ b/sync/src/lib.rs @@ -47,6 +47,7 @@ use std::sync::Arc; use parking_lot::RwLock; use tokio_core::reactor::Handle; use network::Magic; +use verification::ChainVerifier; /// Sync errors. #[derive(Debug)] @@ -81,11 +82,12 @@ pub fn create_sync_connection_factory(handle: &Handle, network: Magic, db: db::S threads_num: 4, }; - let sync_chain = Arc::new(RwLock::new(SyncChain::new(db))); + let sync_chain = Arc::new(RwLock::new(SyncChain::new(db.clone()))); + let chain_verifier = Arc::new(ChainVerifier::new(db, network)); let sync_executor = SyncExecutor::new(sync_chain.clone()); let sync_server = Arc::new(SynchronizationServer::new(sync_chain.clone(), sync_executor.clone())); - let sync_client_core = SynchronizationClientCore::new(sync_client_config, handle, sync_executor.clone(), sync_chain.clone(), network); - let verifier = AsyncVerifier::new(network, sync_chain, sync_client_core.clone()); + let sync_client_core = SynchronizationClientCore::new(sync_client_config, handle, sync_executor.clone(), sync_chain.clone(), chain_verifier.clone()); + let verifier = AsyncVerifier::new(chain_verifier, sync_chain, sync_client_core.clone()); let sync_client = SynchronizationClient::new(sync_client_core, verifier); let sync_node = Arc::new(SyncNode::new(sync_server, sync_client, sync_executor)); SyncConnectionFactory::with_local_node(sync_node) diff --git a/sync/src/synchronization_client.rs b/sync/src/synchronization_client.rs index 6c3a1a35..b110b0fc 100644 --- a/sync/src/synchronization_client.rs +++ b/sync/src/synchronization_client.rs @@ -30,7 +30,6 @@ use compact_block_builder::build_compact_block; use hash_queue::HashPosition; use miner::transaction_fee_rate; use verification::ChainVerifier; -use network::Magic; use time; use std::time::Duration; @@ -298,8 +297,8 @@ pub struct SynchronizationClientCore { orphaned_blocks_pool: OrphanBlocksPool, /// Orphaned transactions pool. orphaned_transactions_pool: OrphanTransactionsPool, - /// Network config - network: Magic, + /// Chain verifier + chain_verifier: Arc, /// Verify block headers? verify_headers: bool, /// Verifying blocks by peer @@ -655,7 +654,6 @@ impl ClientCore for SynchronizationClientCore where T: TaskExecutor { // validate blocks headers before scheduling let chain = self.chain.read(); - let verifier = ChainVerifier::new(chain.storage(), self.network); let mut block_header_provider = MessageBlockHeadersProvider::new(&*chain); let mut blocks_hashes: Vec = Vec::with_capacity(blocks_headers.len()); let mut prev_block_hash = header0.previous_header_hash.clone(); @@ -669,7 +667,7 @@ impl ClientCore for SynchronizationClientCore where T: TaskExecutor { // verify header if self.verify_headers { - if let Err(error) = verifier.verify_block_header(&block_header_provider, &block_header_hash, &block_header) { + if let Err(error) = self.chain_verifier.verify_block_header(&block_header_provider, &block_header_hash, &block_header) { warn!(target: "sync", "Error verifying header {:?} from peer#{} `headers` message: {:?}", block_header_hash.to_reversed_str(), peer_index, error); return; } @@ -1088,7 +1086,7 @@ impl VerificationSink for SynchronizationClientCore where T: TaskExecutor impl SynchronizationClientCore where T: TaskExecutor { /// Create new synchronization client core - pub fn new(config: Config, handle: &Handle, executor: Arc>, chain: ChainRef, network: Magic) -> Arc> { + pub fn new(config: Config, handle: &Handle, executor: Arc>, chain: ChainRef, chain_verifier: Arc) -> Arc> { let sync = Arc::new(Mutex::new( SynchronizationClientCore { state: State::Saturated, @@ -1099,7 +1097,7 @@ impl SynchronizationClientCore where T: TaskExecutor { chain: chain.clone(), orphaned_blocks_pool: OrphanBlocksPool::new(), orphaned_transactions_pool: OrphanTransactionsPool::new(), - network: network, + chain_verifier: chain_verifier, verify_headers: true, verifying_blocks_by_peer: HashMap::new(), verifying_blocks_futures: HashMap::new(), @@ -1683,7 +1681,6 @@ pub mod tests { use synchronization_verifier::tests::DummyVerifier; use synchronization_server::ServerTaskIndex; use primitives::hash::H256; - use network::Magic; use p2p::event_loop; use test_data; use db::{self, BlockHeaderProvider}; diff --git a/sync/src/synchronization_verifier.rs b/sync/src/synchronization_verifier.rs index eccf71f1..c2b2ae95 100644 --- a/sync/src/synchronization_verifier.rs +++ b/sync/src/synchronization_verifier.rs @@ -60,9 +60,8 @@ struct EmptyTransactionOutputProvider { impl AsyncVerifier { /// Create new async verifier - pub fn new(network: Magic, chain: ChainRef, sink: Arc>) -> Self { + pub fn new(verifier: Arc, chain: ChainRef, sink: Arc>) -> Self { let (verification_work_sender, verification_work_receiver) = channel(); - let verifier = ChainVerifier::new(chain.read().storage(), network); AsyncVerifier { verification_work_sender: verification_work_sender, verification_worker_thread: Some(thread::Builder::new() @@ -75,7 +74,7 @@ impl AsyncVerifier { } /// Thread procedure for handling verification tasks - fn verification_worker_proc(sink: Arc>, chain: ChainRef, verifier: ChainVerifier, work_receiver: Receiver) { + fn verification_worker_proc(sink: Arc>, chain: ChainRef, verifier: Arc, work_receiver: Receiver) { while let Ok(task) = work_receiver.recv() { match task { VerificationTask::Stop => break, From 8a54d9168f04e24a5b04c700c1012ad6ea4289dc Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 5 Dec 2016 16:03:13 +0100 Subject: [PATCH 2/2] fix tests --- sync/src/local_node.rs | 4 +++- sync/src/synchronization_client.rs | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/sync/src/local_node.rs b/sync/src/local_node.rs index 0743056e..3b84192c 100644 --- a/sync/src/local_node.rs +++ b/sync/src/local_node.rs @@ -274,6 +274,7 @@ mod tests { use synchronization_verifier::tests::DummyVerifier; use tokio_core::reactor::{Core, Handle}; use primitives::bytes::Bytes; + use verification::ChainVerifier; struct DummyOutboundSyncConnection; @@ -315,7 +316,8 @@ mod tests { let executor = DummyTaskExecutor::new(); let server = Arc::new(DummyServer::new()); let config = Config { threads_num: 1, close_connection_on_bad_block: true }; - let client_core = SynchronizationClientCore::new(config, &handle, executor.clone(), chain.clone(), Magic::Mainnet); + let chain_verifier = Arc::new(ChainVerifier::new(chain.read().storage(), Magic::Mainnet)); + let client_core = SynchronizationClientCore::new(config, &handle, executor.clone(), chain.clone(), chain_verifier); let mut verifier = DummyVerifier::default(); verifier.set_sink(client_core.clone()); let client = SynchronizationClient::new(client_core, verifier); diff --git a/sync/src/synchronization_client.rs b/sync/src/synchronization_client.rs index b110b0fc..c1a24af7 100644 --- a/sync/src/synchronization_client.rs +++ b/sync/src/synchronization_client.rs @@ -1671,6 +1671,7 @@ pub mod tests { use parking_lot::{Mutex, RwLock}; use tokio_core::reactor::{Core, Handle}; use chain::{Block, Transaction}; + use network::Magic; use message::common::{InventoryVector, InventoryType}; use message::types; use super::{Client, Config, SynchronizationClient, SynchronizationClientCore, BlockAnnouncementType, MessageBlockHeadersProvider}; @@ -1681,6 +1682,7 @@ pub mod tests { use synchronization_verifier::tests::DummyVerifier; use synchronization_server::ServerTaskIndex; use primitives::hash::H256; + use verification::ChainVerifier; use p2p::event_loop; use test_data; use db::{self, BlockHeaderProvider}; @@ -1702,7 +1704,8 @@ pub mod tests { let executor = DummyTaskExecutor::new(); let config = Config { threads_num: 1, close_connection_on_bad_block: true }; - let client_core = SynchronizationClientCore::new(config, &handle, executor.clone(), chain.clone(), Magic::Testnet); + let chain_verifier = Arc::new(ChainVerifier::new(storage.clone(), Magic::Testnet)); + let client_core = SynchronizationClientCore::new(config, &handle, executor.clone(), chain.clone(), chain_verifier); { client_core.lock().verify_headers(false); } @@ -2737,5 +2740,5 @@ pub mod tests { let tasks = executor.lock().take_tasks(); assert_eq!(tasks, vec![Task::Close(0)]); - } + } }