aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xqa/rpc-tests/invalidateblock.py29
-rw-r--r--src/main.cpp2
2 files changed, 28 insertions, 3 deletions
diff --git a/qa/rpc-tests/invalidateblock.py b/qa/rpc-tests/invalidateblock.py
index a8bfbe6e6c..ccfcf00e30 100755
--- a/qa/rpc-tests/invalidateblock.py
+++ b/qa/rpc-tests/invalidateblock.py
@@ -16,15 +16,17 @@ class InvalidateTest(BitcoinTestFramework):
def setup_chain(self):
print("Initializing test directory "+self.options.tmpdir)
- initialize_chain_clean(self.options.tmpdir, 2)
+ initialize_chain_clean(self.options.tmpdir, 3)
def setup_network(self):
self.nodes = []
self.is_network_split = False
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"]))
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug"]))
+ self.nodes.append(start_node(2, self.options.tmpdir, ["-debug"]))
def run_test(self):
+ print "Make sure we repopulate setBlockIndexCandidates after InvalidateBlock:"
print "Mine 4 blocks on Node 0"
self.nodes[0].setgenerate(True, 4)
assert(self.nodes[0].getblockcount() == 4)
@@ -36,7 +38,7 @@ class InvalidateTest(BitcoinTestFramework):
print "Connect nodes to force a reorg"
connect_nodes_bi(self.nodes,0,1)
- sync_blocks(self.nodes)
+ sync_blocks(self.nodes[0:2])
assert(self.nodes[0].getblockcount() == 6)
badhash = self.nodes[1].getblockhash(2)
@@ -47,5 +49,28 @@ class InvalidateTest(BitcoinTestFramework):
if (newheight != 4 or newhash != besthash):
raise AssertionError("Wrong tip for node0, hash %s, height %d"%(newhash,newheight))
+ print "\nMake sure we won't reorg to a lower work chain:"
+ connect_nodes_bi(self.nodes,1,2)
+ print "Sync node 2 to node 1 so both have 6 blocks"
+ sync_blocks(self.nodes[1:3])
+ assert(self.nodes[2].getblockcount() == 6)
+ print "Invalidate block 5 on node 1 so its tip is now at 4"
+ self.nodes[1].invalidateblock(self.nodes[1].getblockhash(5))
+ assert(self.nodes[1].getblockcount() == 4)
+ print "Invalidate block 3 on node 2, so its tip is now 2"
+ self.nodes[2].invalidateblock(self.nodes[2].getblockhash(3))
+ assert(self.nodes[2].getblockcount() == 2)
+ print "..and then mine a block"
+ self.nodes[2].setgenerate(True, 1)
+ print "Verify all nodes are at the right height"
+ time.sleep(5)
+ for i in xrange(3):
+ print i,self.nodes[i].getblockcount()
+ assert(self.nodes[2].getblockcount() == 3)
+ assert(self.nodes[0].getblockcount() == 4)
+ node1height = self.nodes[1].getblockcount()
+ if node1height < 4:
+ raise AssertionError("Node 1 reorged to a lower height: %d"%node1height)
+
if __name__ == '__main__':
InvalidateTest().main()
diff --git a/src/main.cpp b/src/main.cpp
index 8bedae6dd8..6418590462 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2228,7 +2228,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) {
// add them again.
BlockMap::iterator it = mapBlockIndex.begin();
while (it != mapBlockIndex.end()) {
- if (it->second->IsValid(BLOCK_VALID_TRANSACTIONS) && it->second->nChainTx && setBlockIndexCandidates.value_comp()(chainActive.Tip(), it->second)) {
+ if (it->second->IsValid(BLOCK_VALID_TRANSACTIONS) && it->second->nChainTx && !setBlockIndexCandidates.value_comp()(it->second, chainActive.Tip())) {
setBlockIndexCandidates.insert(it->second);
}
it++;