aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Morcos <morcos@chaincode.com>2015-03-12 16:03:23 -0400
committerWladimir J. van der Laan <laanwj@gmail.com>2015-03-24 14:51:36 +0100
commit1d2cdd2ef9091508c42619c94d4a7106b1471a14 (patch)
tree794953d39e8053dc1fa7d29236be82f884731108
parentc9e022b7eee9f77cd33b333d6ff52f711d3bc989 (diff)
downloadbitcoin-1d2cdd2ef9091508c42619c94d4a7106b1471a14.tar.xz
Fix InvalidateBlock to add chainActive.Tip to setBlockIndexCandidates
Rebased-From: cd3d67cf3b0d573d2c387c2ec35e8b52129863d9 Github-Pull: #5890
-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++;