From 51001d684b1b26ea5109986b7317ffe24bf71b43 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 11 Oct 2017 16:04:13 -0400 Subject: [PATCH] Accept unrequested blocks with work equal to our tip This is a simple change that makes our accept requirements the same as our request requirements, (ever so slightly) further decoupling our consensus logic from our FindNextBlocksToDownload logic in net_processing. Github-Pull: #11531 Rebased-From: 932f118e6a3779bb3d6c3cc83963cf34ac150e42 --- src/validation.cpp | 8 ++++---- test/functional/p2p-acceptblock.py | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index c52f8bf70..c641cae7e 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3102,7 +3102,7 @@ static bool AcceptBlock(const std::shared_ptr& pblock, CValidation // process an unrequested block if it's new and has enough work to // advance our tip, and isn't too many blocks ahead. bool fAlreadyHave = pindex->nStatus & BLOCK_HAVE_DATA; - bool fHasMoreWork = (chainActive.Tip() ? pindex->nChainWork > chainActive.Tip()->nChainWork : true); + bool fHasMoreOrSameWork = (chainActive.Tip() ? pindex->nChainWork >= chainActive.Tip()->nChainWork : true); // Blocks that are too out-of-order needlessly limit the effectiveness of // pruning, because pruning will not delete block files that contain any // blocks which are too close in height to the tip. Apply this test @@ -3119,9 +3119,9 @@ static bool AcceptBlock(const std::shared_ptr& pblock, CValidation // and unrequested blocks. if (fAlreadyHave) return true; if (!fRequested) { // If we didn't ask for it: - if (pindex->nTx != 0) return true; // This is a previously-processed block that was pruned - if (!fHasMoreWork) return true; // Don't process less-work chains - if (fTooFarAhead) return true; // Block height is too high + if (pindex->nTx != 0) return true; // This is a previously-processed block that was pruned + if (!fHasMoreOrSameWork) return true; // Don't process less-work chains + if (fTooFarAhead) return true; // Block height is too high // Protect against DoS attacks from low-work chains. // If our tip is behind, a peer could try to send us diff --git a/test/functional/p2p-acceptblock.py b/test/functional/p2p-acceptblock.py index 9b2c1a73f..36e0bd9ec 100755 --- a/test/functional/p2p-acceptblock.py +++ b/test/functional/p2p-acceptblock.py @@ -142,8 +142,7 @@ class AcceptBlockTest(BitcoinTestFramework): assert(tip_entry_found) # But this block should be accepted by node since it has equal work. - # TODO: We currently drop this block but likely shouldn't - #self.nodes[0].getblock(block_h2f.hash) + self.nodes[0].getblock(block_h2f.hash) self.log.info("Second height 2 block accepted, but not reorg'ed to") # 4b. Now send another block that builds on the forking chain. @@ -215,7 +214,6 @@ class AcceptBlockTest(BitcoinTestFramework): test_node.wait_for_verack() test_node.send_message(msg_block(block_h1f)) - test_node.send_message(msg_block(block_h2f)) # This should not be required test_node.sync_with_ping() assert_equal(self.nodes[0].getblockcount(), 2) @@ -239,7 +237,6 @@ class AcceptBlockTest(BitcoinTestFramework): # 7. Send the missing block for the third time (now it is requested) test_node.send_message(msg_block(block_h1f)) - test_node.send_message(msg_block(block_h2f)) # This should not be required test_node.sync_with_ping() assert_equal(self.nodes[0].getblockcount(), 290)