def METHOD_NAME(self):
    self.log.info("Ensure submitblock can in principle reorg to a competing chain")
    self.generate(self.nodes[0], 1, sync_fun=self.no_op)
    assert_equal(self.nodes[0].getblockcount(), 1)
    hashZ = self.generate(self.nodes[1], 2, sync_fun=self.no_op)[-1]
    assert_equal(self.nodes[1].getblockcount(), 2)
    node_sync_via_rpc(self.nodes[0:3])
    assert_equal(self.nodes[0].getbestblockhash(), hashZ)
    self.log.info("Mine blocks A-B-C on Node 0")
    hashC = self.generate(self.nodes[0], 3, sync_fun=self.no_op)[-1]
    assert_equal(self.nodes[0].getblockcount(), 5)
    self.log.info("Mine competing blocks E-F-G on Node 1")
    hashG = self.generate(self.nodes[1], 3, sync_fun=self.no_op)[-1]
    assert_equal(self.nodes[1].getblockcount(), 5)
    assert hashC != hashG
    self.log.info("Connect nodes and check no reorg occurs")
    # Submit competing blocks via RPC so any reorg should occur before we proceed (no way to wait on inaction for p2p sync)
    node_sync_via_rpc(self.nodes[0:2])
    self.connect_nodes(0, 1)
    assert_equal(self.nodes[0].getbestblockhash(), hashC)
    assert_equal(self.nodes[1].getbestblockhash(), hashG)
    self.log.info("Make Node0 prefer block G")
    self.nodes[0].preciousblock(hashG)
    assert_equal(self.nodes[0].getbestblockhash(), hashG)
    self.log.info("Make Node0 prefer block C again")
    self.nodes[0].preciousblock(hashC)
    assert_equal(self.nodes[0].getbestblockhash(), hashC)
    self.log.info("Make Node1 prefer block C")
    self.nodes[1].preciousblock(hashC)
    self.sync_blocks(self.nodes[0:2])  # wait because node 1 may not have downloaded hashC
    assert_equal(self.nodes[1].getbestblockhash(), hashC)
    self.log.info("Make Node1 prefer block G again")
    self.nodes[1].preciousblock(hashG)
    assert_equal(self.nodes[1].getbestblockhash(), hashG)
    self.log.info("Make Node0 prefer block G again")
    self.nodes[0].preciousblock(hashG)
    assert_equal(self.nodes[0].getbestblockhash(), hashG)
    self.log.info("Make Node1 prefer block C again")
    self.nodes[1].preciousblock(hashC)
    assert_equal(self.nodes[1].getbestblockhash(), hashC)
    self.log.info("Mine another block (E-F-G-)H on Node 0 and reorg Node 1")
    self.generate(self.nodes[0], 1, sync_fun=self.no_op)
    assert_equal(self.nodes[0].getblockcount(), 6)
    self.sync_blocks(self.nodes[0:2])
    hashH = self.nodes[0].getbestblockhash()
    assert_equal(self.nodes[1].getbestblockhash(), hashH)
    self.log.info("Node1 should not be able to prefer block C anymore")
    self.nodes[1].preciousblock(hashC)
    assert_equal(self.nodes[1].getbestblockhash(), hashH)
    self.log.info("Mine competing blocks I-J-K-L on Node 2")
    self.generate(self.nodes[2], 4, sync_fun=self.no_op)
    assert_equal(self.nodes[2].getblockcount(), 6)
    hashL = self.nodes[2].getbestblockhash()
    self.log.info("Connect nodes and check no reorg occurs")
    node_sync_via_rpc(self.nodes[1:3])
    self.connect_nodes(1, 2)
    self.connect_nodes(0, 2)
    assert_equal(self.nodes[0].getbestblockhash(), hashH)
    assert_equal(self.nodes[1].getbestblockhash(), hashH)
    assert_equal(self.nodes[2].getbestblockhash(), hashL)
    self.log.info("Make Node1 prefer block L")
    self.nodes[1].preciousblock(hashL)
    assert_equal(self.nodes[1].getbestblockhash(), hashL)
    self.log.info("Make Node2 prefer block H")
    self.nodes[2].preciousblock(hashH)
    assert_equal(self.nodes[2].getbestblockhash(), hashH)