Browse Source

Merge pull request #5890

cd3d67c Fix InvalidateBlock to add chainActive.Tip to setBlockIndexCandidates (Alex Morcos)
0.13
Wladimir J. van der Laan 10 years ago
parent
commit
22cfe23196
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 29
      qa/rpc-tests/invalidateblock.py
  2. 2
      src/main.cpp

29
qa/rpc-tests/invalidateblock.py

@ -16,15 +16,17 @@ class InvalidateTest(BitcoinTestFramework):
def setup_chain(self): def setup_chain(self):
print("Initializing test directory "+self.options.tmpdir) 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): def setup_network(self):
self.nodes = [] self.nodes = []
self.is_network_split = False self.is_network_split = False
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"])) 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(1, self.options.tmpdir, ["-debug"]))
self.nodes.append(start_node(2, self.options.tmpdir, ["-debug"]))
def run_test(self): def run_test(self):
print "Make sure we repopulate setBlockIndexCandidates after InvalidateBlock:"
print "Mine 4 blocks on Node 0" print "Mine 4 blocks on Node 0"
self.nodes[0].setgenerate(True, 4) self.nodes[0].setgenerate(True, 4)
assert(self.nodes[0].getblockcount() == 4) assert(self.nodes[0].getblockcount() == 4)
@ -36,7 +38,7 @@ class InvalidateTest(BitcoinTestFramework):
print "Connect nodes to force a reorg" print "Connect nodes to force a reorg"
connect_nodes_bi(self.nodes,0,1) connect_nodes_bi(self.nodes,0,1)
sync_blocks(self.nodes) sync_blocks(self.nodes[0:2])
assert(self.nodes[0].getblockcount() == 6) assert(self.nodes[0].getblockcount() == 6)
badhash = self.nodes[1].getblockhash(2) badhash = self.nodes[1].getblockhash(2)
@ -47,5 +49,28 @@ class InvalidateTest(BitcoinTestFramework):
if (newheight != 4 or newhash != besthash): if (newheight != 4 or newhash != besthash):
raise AssertionError("Wrong tip for node0, hash %s, height %d"%(newhash,newheight)) 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__': if __name__ == '__main__':
InvalidateTest().main() InvalidateTest().main()

2
src/main.cpp

@ -2320,7 +2320,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) {
// add them again. // add them again.
BlockMap::iterator it = mapBlockIndex.begin(); BlockMap::iterator it = mapBlockIndex.begin();
while (it != mapBlockIndex.end()) { 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); setBlockIndexCandidates.insert(it->second);
} }
it++; it++;

Loading…
Cancel
Save