]> Git Repo - VerusCoin.git/commitdiff
Fix InvalidateBlock to add chainActive.Tip to setBlockIndexCandidates
authorAlex Morcos <[email protected]>
Thu, 12 Mar 2015 20:03:23 +0000 (16:03 -0400)
committerAlex Morcos <[email protected]>
Fri, 13 Mar 2015 17:11:11 +0000 (13:11 -0400)
qa/rpc-tests/invalidateblock.py
src/main.cpp

index a8bfbe6e6c7f2ca1e3fb0acfc9933ab840dc4934..ccfcf00e30e286498700e8396b0351ddf6073752 100755 (executable)
@@ -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()
index 9b4bb431283dee97de6a8a9e167f4f7ca62c60e8..5207f608969831d289fefe85d34d4bdb6bec4367 100644 (file)
@@ -2310,7 +2310,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++;
This page took 0.03146 seconds and 4 git commands to generate.