def METHOD_NAME(self):
    p2p0 = self.nodes[0].add_p2p_connection(BaseNode())
    # Build the blockchain
    self.tip = int(self.nodes[0].getbestblockhash(), 16)
    self.block_time = (
        self.nodes[0].getblock(self.nodes[0].getbestblockhash())["time"] + 1
    )
    self.blocks = []
    # Get a pubkey for the coinbase TXO
    coinbase_key = ECKey()
    coinbase_key.generate()
    coinbase_pubkey = coinbase_key.get_pubkey().get_bytes()
    # Create the first block with a coinbase output to our key
    height = 1
    block = create_block(
        self.tip, create_coinbase(height, coinbase_pubkey), self.block_time
    )
    self.blocks.append(block)
    self.block_time += 1
    block.solve()
    # Save the coinbase for later
    self.block1 = block
    self.tip = block.sha256
    height += 1
    # Bury the block 100 deep so the coinbase output is spendable
    for i in range(100):
        block = create_block(self.tip, create_coinbase(height), self.block_time)
        block.solve()
        self.blocks.append(block)
        self.tip = block.sha256
        self.block_time += 1
        height += 1
    # Create a transaction spending the coinbase output with an invalid (null) signature
    tx = CTransaction()
    tx.vin.append(CTxIn(COutPoint(self.block1.vtx[0].sha256, 0), scriptSig=b""))
    tx.vout.append(CTxOut(49 * 100000000, CScript([OP_TRUE])))
    tx.calc_sha256()
    block102 = create_block(self.tip, create_coinbase(height), self.block_time)
    self.block_time += 1
    block102.vtx.extend([tx])
    block102.hashMerkleRoot = block102.calc_merkle_root()
    block102.rehash()
    block102.solve()
    self.blocks.append(block102)
    self.tip = block102.sha256
    self.block_time += 1
    height += 1
    # Bury the assumed valid block 2100 deep
    for i in range(2100):
        block = create_block(self.tip, create_coinbase(height), self.block_time)
        block.nVersion = 4
        block.solve()
        self.blocks.append(block)
        self.tip = block.sha256
        self.block_time += 1
        height += 1
    self.nodes[0].disconnect_p2ps()
    # Start node1 and node2 with assumevalid so they accept a block with a bad signature.
    self.start_node(1, extra_args=["-assumevalid=" + hex(block102.sha256)])
    self.start_node(2, extra_args=["-assumevalid=" + hex(block102.sha256)])
    p2p0 = self.nodes[0].add_p2p_connection(BaseNode())
    p2p1 = self.nodes[1].add_p2p_connection(BaseNode())
    p2p2 = self.nodes[2].add_p2p_connection(BaseNode())
    # send header lists to all three nodes
    p2p0.send_header_for_blocks(self.blocks[0:2000])
    p2p0.send_header_for_blocks(self.blocks[2000:])
    p2p1.send_header_for_blocks(self.blocks[0:2000])
    p2p1.send_header_for_blocks(self.blocks[2000:])
    p2p2.send_header_for_blocks(self.blocks[0:200])
    # Send blocks to node0. Block 102 will be rejected.
    self.send_blocks_until_disconnected(p2p0)
    self.assert_blockchain_height(self.nodes[0], 101)
    # Send all blocks to node1. All blocks will be accepted.
    for i in range(2202):
        p2p1.send_message(msg_block(self.blocks[i]))
    # Syncing 2200 blocks can take a while on slow systems. Give it plenty of time to sync.
    p2p1.sync_with_ping(400)
    assert_equal(
        self.nodes[1].getblock(self.nodes[1].getbestblockhash())["height"], 2202
    )
    # Send blocks to node2. Block 102 will be rejected.
    self.send_blocks_until_disconnected(p2p2)
    self.assert_blockchain_height(self.nodes[2], 101)