Changeset View
Changeset View
Standalone View
Standalone View
test/functional/mempool_resurrect.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2014-2019 The Bitcoin Core developers | # Copyright (c) 2014-2019 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test resurrection of mined transactions when the blockchain is re-organized.""" | """Test resurrection of mined transactions when the blockchain is re-organized.""" | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import assert_equal, create_tx | from test_framework.blocktools import create_raw_transaction | ||||
from test_framework.util import assert_equal | |||||
# Create one-input, one-output, no-fee transaction: | # Create one-input, one-output, no-fee transaction: | ||||
class MempoolCoinbaseTest(BitcoinTestFramework): | class MempoolCoinbaseTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.extra_args = [["-checkmempool"]] | self.extra_args = [["-checkmempool"]] | ||||
def run_test(self): | def run_test(self): | ||||
node0_address = self.nodes[0].getnewaddress() | node0_address = self.nodes[0].getnewaddress() | ||||
# Spend block 1/2/3's coinbase transactions | # Spend block 1/2/3's coinbase transactions | ||||
# Mine a block. | # Mine a block. | ||||
# Create three more transactions, spending the spends | # Create three more transactions, spending the spends | ||||
# Mine another block. | # Mine another block. | ||||
# ... make sure all the transactions are confirmed | # ... make sure all the transactions are confirmed | ||||
# Invalidate both blocks | # Invalidate both blocks | ||||
# ... make sure all the transactions are put back in the mempool | # ... make sure all the transactions are put back in the mempool | ||||
# Mine a new block | # Mine a new block | ||||
# ... make sure all the transactions are confirmed again. | # ... make sure all the transactions are confirmed again. | ||||
b = [self.nodes[0].getblockhash(n) for n in range(1, 4)] | b = [self.nodes[0].getblockhash(n) for n in range(1, 4)] | ||||
coinbase_txids = [self.nodes[0].getblock(h)['tx'][0] for h in b] | coinbase_txids = [self.nodes[0].getblock(h)['tx'][0] for h in b] | ||||
spends1_raw = [create_tx(self.nodes[0], txid, node0_address, 49.99) | spends1_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, 49.99) | ||||
for txid in coinbase_txids] | for txid in coinbase_txids] | ||||
spends1_id = [self.nodes[0].sendrawtransaction(tx) | spends1_id = [self.nodes[0].sendrawtransaction(tx) | ||||
for tx in spends1_raw] | for tx in spends1_raw] | ||||
blocks = [] | blocks = [] | ||||
blocks.extend(self.nodes[0].generate(1)) | blocks.extend(self.nodes[0].generate(1)) | ||||
spends2_raw = [create_tx(self.nodes[0], txid, node0_address, 49.98) | spends2_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, 49.98) | ||||
for txid in spends1_id] | for txid in spends1_id] | ||||
spends2_id = [self.nodes[0].sendrawtransaction(tx) | spends2_id = [self.nodes[0].sendrawtransaction(tx) | ||||
for tx in spends2_raw] | for tx in spends2_raw] | ||||
blocks.extend(self.nodes[0].generate(1)) | blocks.extend(self.nodes[0].generate(1)) | ||||
# mempool should be empty, all txns confirmed | # mempool should be empty, all txns confirmed | ||||
assert_equal(set(self.nodes[0].getrawmempool()), set()) | assert_equal(set(self.nodes[0].getrawmempool()), set()) | ||||
Show All 27 Lines |