From 8875dccd110d8f57da79348115c51588fb1850b7 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Tue, 25 Sep 2018 11:55:24 +0100 Subject: [PATCH] fix bad-block reporting no reason (#9638) --- ethcore/src/client/client.rs | 29 +++++++++++++++------------ ethcore/src/verification/queue/mod.rs | 14 ++++++------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index 4efff53af..85e2d382f 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -294,7 +294,6 @@ impl Importer { continue; } - let raw = block.bytes.clone(); match self.check_and_lock_block(block, client) { Ok(closed_block) => { if self.engine.is_proposal(&header) { @@ -312,8 +311,8 @@ impl Importer { } }, Err(err) => { - self.bad_blocks.report(raw, format!("{:?}", err)); - invalid_blocks.insert(header.hash()); + self.bad_blocks.report(bytes, format!("{:?}", err)); + invalid_blocks.insert(hash); }, } } @@ -354,7 +353,7 @@ impl Importer { imported } - fn check_and_lock_block(&self, block: PreverifiedBlock, client: &Client) -> Result { + fn check_and_lock_block(&self, block: PreverifiedBlock, client: &Client) -> EthcoreResult { let engine = &*self.engine; let header = block.header.clone(); @@ -362,7 +361,7 @@ impl Importer { let best_block_number = client.chain.read().best_block_number(); if client.pruning_info().earliest_state > header.number() { warn!(target: "client", "Block import failed for #{} ({})\nBlock is ancient (current best block: #{}).", header.number(), header.hash(), best_block_number); - return Err(()); + bail!("Block is ancient"); } // Check if parent is in chain @@ -370,7 +369,7 @@ impl Importer { Some(h) => h, None => { warn!(target: "client", "Block import failed for #{} ({}): Parent not found ({}) ", header.number(), header.hash(), header.parent_hash()); - return Err(()); + bail!("Parent not found"); } }; @@ -389,13 +388,13 @@ impl Importer { if let Err(e) = verify_family_result { warn!(target: "client", "Stage 3 block verification failed for #{} ({})\nError: {:?}", header.number(), header.hash(), e); - return Err(()); + bail!(e); }; let verify_external_result = self.verifier.verify_block_external(&header, engine); if let Err(e) = verify_external_result { warn!(target: "client", "Stage 4 block verification failed for #{} ({})\nError: {:?}", header.number(), header.hash(), e); - return Err(()); + bail!(e); }; // Enact Verified Block @@ -415,9 +414,13 @@ impl Importer { &mut chain.ancestry_with_metadata_iter(*header.parent_hash()), ); - let mut locked_block = enact_result.map_err(|e| { - warn!(target: "client", "Block import failed for #{} ({})\nError: {:?}", header.number(), header.hash(), e); - })?; + let mut locked_block = match enact_result { + Ok(b) => b, + Err(e) => { + warn!(target: "client", "Block import failed for #{} ({})\nError: {:?}", header.number(), header.hash(), e); + bail!(e); + } + }; // Strip receipts for blocks before validate_receipts_transition, // if the expected receipts root header does not match. @@ -431,7 +434,7 @@ impl Importer { // Final Verification if let Err(e) = self.verifier.verify_block_final(&header, locked_block.block().header()) { warn!(target: "client", "Stage 5 block verification failed for #{} ({})\nError: {:?}", header.number(), header.hash(), e); - return Err(()); + bail!(e); } Ok(locked_block) @@ -441,7 +444,7 @@ impl Importer { /// /// The block is guaranteed to be the next best blocks in the /// first block sequence. Does no sealing or transaction validation. - fn import_old_block(&self, unverified: Unverified, receipts_bytes: &[u8], db: &KeyValueDB, chain: &BlockChain) -> Result<(), ::error::Error> { + fn import_old_block(&self, unverified: Unverified, receipts_bytes: &[u8], db: &KeyValueDB, chain: &BlockChain) -> EthcoreResult<()> { let receipts = ::rlp::decode_list(receipts_bytes); let _import_lock = self.import_lock.lock(); diff --git a/ethcore/src/verification/queue/mod.rs b/ethcore/src/verification/queue/mod.rs index 8c65d2ea7..37e2f3f6a 100644 --- a/ethcore/src/verification/queue/mod.rs +++ b/ethcore/src/verification/queue/mod.rs @@ -465,19 +465,19 @@ impl VerificationQueue { /// Add a block to the queue. pub fn import(&self, input: K::Input) -> EthcoreResult { - let h = input.hash(); + let hash = input.hash(); { - if self.processing.read().contains_key(&h) { + if self.processing.read().contains_key(&hash) { bail!(ErrorKind::Import(ImportErrorKind::AlreadyQueued)); } let mut bad = self.verification.bad.lock(); - if bad.contains(&h) { + if bad.contains(&hash) { bail!(ErrorKind::Import(ImportErrorKind::KnownBad)); } if bad.contains(&input.parent_hash()) { - bad.insert(h.clone()); + bad.insert(hash); bail!(ErrorKind::Import(ImportErrorKind::KnownBad)); } } @@ -486,21 +486,21 @@ impl VerificationQueue { Ok(item) => { self.verification.sizes.unverified.fetch_add(item.heap_size_of_children(), AtomicOrdering::SeqCst); - self.processing.write().insert(h.clone(), item.difficulty()); + self.processing.write().insert(hash, item.difficulty()); { let mut td = self.total_difficulty.write(); *td = *td + item.difficulty(); } self.verification.unverified.lock().push_back(item); self.more_to_verify.notify_all(); - Ok(h) + Ok(hash) }, Err(err) => { match err { // Don't mark future blocks as bad. Error(ErrorKind::Block(BlockError::TemporarilyInvalid(_)), _) => {}, _ => { - self.verification.bad.lock().insert(h.clone()); + self.verification.bad.lock().insert(hash); } } Err(err)