From da2e75299191acd70d4a48bd63c3dcb2cfcc74d2 Mon Sep 17 00:00:00 2001
From: Antioch Peverell <apeverell@protonmail.com>
Date: Thu, 10 Oct 2019 16:46:00 +0100
Subject: [PATCH] skip hydrate if missing kernels, just request full block
 (#3090)

---
 servers/src/common/adapters.rs | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs
index 9d1748dd7..946fb1006 100644
--- a/servers/src/common/adapters.rs
+++ b/servers/src/common/adapters.rs
@@ -189,15 +189,16 @@ impl p2p::ChainAdapter for NetToChainAdapter {
 			};
 
 			debug!(
-				"adapter: txs from tx pool - {}, (unknown kern_ids: {})",
+				"compact_block_received: txs from tx pool - {}, (unknown kern_ids: {})",
 				txs.len(),
 				missing_short_ids.len(),
 			);
 
-			// TODO - 3 scenarios here -
-			// 1) we hydrate a valid block (good to go)
-			// 2) we hydrate an invalid block (txs legit missing from our pool)
-			// 3) we hydrate an invalid block (peer sent us a "bad" compact block) - [TBD]
+			// If we have missing kernels then we know we cannot hydrate this compact block.
+			if missing_short_ids.len() > 0 {
+				self.request_block(&cb.header, peer_info, chain::Options::NONE);
+				return Ok(true);
+			}
 
 			let block = match core::Block::hydrate_from(cb.clone(), txs) {
 				Ok(block) => {