mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 02:33:24 -03:00
[test] remove or move tests using -segwitheight=-1
This commit is contained in:
parent
4129134e84
commit
eba5b1cd64
4 changed files with 75 additions and 79 deletions
52
test/functional/feature_presegwit_node_upgrade.py
Executable file
52
test/functional/feature_presegwit_node_upgrade.py
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2017-2020 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
"""Test a pre-segwit node upgrading to segwit consensus"""
|
||||||
|
|
||||||
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.util import (
|
||||||
|
assert_equal,
|
||||||
|
softfork_active,
|
||||||
|
)
|
||||||
|
|
||||||
|
class SegwitUpgradeTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
self.num_nodes = 1
|
||||||
|
self.extra_args = [["-segwitheight=10"]]
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
|
"""A pre-segwit node with insufficiently validated blocks needs to redownload blocks"""
|
||||||
|
|
||||||
|
self.log.info("Testing upgrade behaviour for pre-segwit node to segwit rules")
|
||||||
|
node = self.nodes[0]
|
||||||
|
|
||||||
|
# Node hasn't been used or connected yet
|
||||||
|
assert_equal(node.getblockcount(), 0)
|
||||||
|
|
||||||
|
assert not softfork_active(node, "segwit")
|
||||||
|
|
||||||
|
# Generate 8 blocks without witness data
|
||||||
|
node.generate(8)
|
||||||
|
assert_equal(node.getblockcount(), 8)
|
||||||
|
|
||||||
|
self.stop_node(0)
|
||||||
|
# Restarting the node (with segwit activation height set to 5) should result in a shutdown
|
||||||
|
# because the blockchain consists of 3 insufficiently validated blocks per segwit consensus rules.
|
||||||
|
node.assert_start_raises_init_error(
|
||||||
|
extra_args=["-segwitheight=5"],
|
||||||
|
expected_msg=": Witness data for blocks after height 5 requires validation. Please restart with -reindex..\nPlease restart with -reindex or -reindex-chainstate to recover.")
|
||||||
|
|
||||||
|
# As directed, the user restarts the node with -reindex
|
||||||
|
self.start_node(0, extra_args=["-reindex", "-segwitheight=5"])
|
||||||
|
|
||||||
|
# With the segwit consensus rules, the node is able to validate only up to block 4
|
||||||
|
assert_equal(node.getblockcount(), 4)
|
||||||
|
|
||||||
|
# The upgraded node should now have segwit activated
|
||||||
|
assert softfork_active(node, "segwit")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
SegwitUpgradeTest().main()
|
|
@ -13,6 +13,7 @@ from decimal import Decimal
|
||||||
|
|
||||||
from test_framework.blocktools import (
|
from test_framework.blocktools import (
|
||||||
create_coinbase,
|
create_coinbase,
|
||||||
|
get_witness_script,
|
||||||
NORMAL_GBT_REQUEST_PARAMS,
|
NORMAL_GBT_REQUEST_PARAMS,
|
||||||
TIME_GENESIS_BLOCK,
|
TIME_GENESIS_BLOCK,
|
||||||
)
|
)
|
||||||
|
@ -20,6 +21,7 @@ from test_framework.messages import (
|
||||||
CBlock,
|
CBlock,
|
||||||
CBlockHeader,
|
CBlockHeader,
|
||||||
BLOCK_HEADER_SIZE,
|
BLOCK_HEADER_SIZE,
|
||||||
|
ser_uint256,
|
||||||
)
|
)
|
||||||
from test_framework.p2p import P2PDataStore
|
from test_framework.p2p import P2PDataStore
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
@ -49,6 +51,9 @@ class MiningTest(BitcoinTestFramework):
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.supports_cli = False
|
self.supports_cli = False
|
||||||
|
|
||||||
|
def skip_test_if_missing_module(self):
|
||||||
|
self.skip_if_no_wallet()
|
||||||
|
|
||||||
def mine_chain(self):
|
def mine_chain(self):
|
||||||
self.log.info('Create some old blocks')
|
self.log.info('Create some old blocks')
|
||||||
for t in range(TIME_GENESIS_BLOCK, TIME_GENESIS_BLOCK + 200 * 600, 600):
|
for t in range(TIME_GENESIS_BLOCK, TIME_GENESIS_BLOCK + 200 * 600, 600):
|
||||||
|
@ -89,7 +94,21 @@ class MiningTest(BitcoinTestFramework):
|
||||||
assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334'))
|
assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334'))
|
||||||
assert_equal(mining_info['pooledtx'], 0)
|
assert_equal(mining_info['pooledtx'], 0)
|
||||||
|
|
||||||
# Mine a block to leave initial block download
|
self.log.info("getblocktemplate: Test default witness commitment")
|
||||||
|
txid = int(node.sendtoaddress(node.getnewaddress(), 1), 16)
|
||||||
|
tmpl = node.getblocktemplate(NORMAL_GBT_REQUEST_PARAMS)
|
||||||
|
|
||||||
|
# Check that default_witness_commitment is present.
|
||||||
|
assert 'default_witness_commitment' in tmpl
|
||||||
|
witness_commitment = tmpl['default_witness_commitment']
|
||||||
|
|
||||||
|
# Check that default_witness_commitment is correct.
|
||||||
|
witness_root = CBlock.get_merkle_root([ser_uint256(0),
|
||||||
|
ser_uint256(txid)])
|
||||||
|
script = get_witness_script(witness_root, 0)
|
||||||
|
assert_equal(witness_commitment, script.hex())
|
||||||
|
|
||||||
|
# Mine a block to leave initial block download and clear the mempool
|
||||||
node.generatetoaddress(1, node.get_deterministic_priv_key().address)
|
node.generatetoaddress(1, node.get_deterministic_priv_key().address)
|
||||||
tmpl = node.getblocktemplate(NORMAL_GBT_REQUEST_PARAMS)
|
tmpl = node.getblocktemplate(NORMAL_GBT_REQUEST_PARAMS)
|
||||||
self.log.info("getblocktemplate: Test capability advertised")
|
self.log.info("getblocktemplate: Test capability advertised")
|
||||||
|
|
|
@ -9,11 +9,10 @@ import random
|
||||||
import struct
|
import struct
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from test_framework.blocktools import create_block, create_coinbase, add_witness_commitment, get_witness_script, WITNESS_COMMITMENT_HEADER
|
from test_framework.blocktools import create_block, create_coinbase, add_witness_commitment, WITNESS_COMMITMENT_HEADER
|
||||||
from test_framework.key import ECKey
|
from test_framework.key import ECKey
|
||||||
from test_framework.messages import (
|
from test_framework.messages import (
|
||||||
BIP125_SEQUENCE_NUMBER,
|
BIP125_SEQUENCE_NUMBER,
|
||||||
CBlock,
|
|
||||||
CBlockHeader,
|
CBlockHeader,
|
||||||
CInv,
|
CInv,
|
||||||
COutPoint,
|
COutPoint,
|
||||||
|
@ -209,24 +208,17 @@ class TestP2PConn(P2PInterface):
|
||||||
class SegWitTest(BitcoinTestFramework):
|
class SegWitTest(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 2
|
||||||
# This test tests SegWit both pre and post-activation, so use the normal BIP9 activation.
|
# This test tests SegWit both pre and post-activation, so use the normal BIP9 activation.
|
||||||
self.extra_args = [
|
self.extra_args = [
|
||||||
["-acceptnonstdtxn=1", "-segwitheight={}".format(SEGWIT_HEIGHT), "-whitelist=noban@127.0.0.1"],
|
["-acceptnonstdtxn=1", "-segwitheight={}".format(SEGWIT_HEIGHT), "-whitelist=noban@127.0.0.1"],
|
||||||
["-acceptnonstdtxn=0", "-segwitheight={}".format(SEGWIT_HEIGHT)],
|
["-acceptnonstdtxn=0", "-segwitheight={}".format(SEGWIT_HEIGHT)],
|
||||||
["-acceptnonstdtxn=1", "-segwitheight=-1"],
|
|
||||||
]
|
]
|
||||||
self.supports_cli = False
|
self.supports_cli = False
|
||||||
|
|
||||||
def skip_test_if_missing_module(self):
|
def skip_test_if_missing_module(self):
|
||||||
self.skip_if_no_wallet()
|
self.skip_if_no_wallet()
|
||||||
|
|
||||||
def setup_network(self):
|
|
||||||
self.setup_nodes()
|
|
||||||
self.connect_nodes(0, 1)
|
|
||||||
self.connect_nodes(0, 2)
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
# Helper functions
|
# Helper functions
|
||||||
|
|
||||||
def build_next_block(self, version=4):
|
def build_next_block(self, version=4):
|
||||||
|
@ -267,7 +259,6 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
self.test_non_witness_transaction()
|
self.test_non_witness_transaction()
|
||||||
self.test_v0_outputs_arent_spendable()
|
self.test_v0_outputs_arent_spendable()
|
||||||
self.test_block_relay()
|
self.test_block_relay()
|
||||||
self.test_getblocktemplate_before_lockin()
|
|
||||||
self.test_unnecessary_witness_before_segwit_activation()
|
self.test_unnecessary_witness_before_segwit_activation()
|
||||||
self.test_witness_tx_relay_before_segwit_activation()
|
self.test_witness_tx_relay_before_segwit_activation()
|
||||||
self.test_standardness_v0()
|
self.test_standardness_v0()
|
||||||
|
@ -295,7 +286,6 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
self.test_signature_version_1()
|
self.test_signature_version_1()
|
||||||
self.test_non_standard_witness_blinding()
|
self.test_non_standard_witness_blinding()
|
||||||
self.test_non_standard_witness()
|
self.test_non_standard_witness()
|
||||||
self.test_upgrade_after_activation()
|
|
||||||
self.test_witness_sigops()
|
self.test_witness_sigops()
|
||||||
self.test_superfluous_witness()
|
self.test_superfluous_witness()
|
||||||
self.test_wtxid_relay()
|
self.test_wtxid_relay()
|
||||||
|
@ -485,11 +475,6 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
witness, and so can't be spent before segwit activation (the point at which
|
witness, and so can't be spent before segwit activation (the point at which
|
||||||
blocks are permitted to contain witnesses)."""
|
blocks are permitted to contain witnesses)."""
|
||||||
|
|
||||||
# node2 doesn't need to be connected for this test.
|
|
||||||
# (If it's connected, node0 may propagate an invalid block to it over
|
|
||||||
# compact blocks and the nodes would have inconsistent tips.)
|
|
||||||
self.disconnect_nodes(0, 2)
|
|
||||||
|
|
||||||
# Create two outputs, a p2wsh and p2sh-p2wsh
|
# Create two outputs, a p2wsh and p2sh-p2wsh
|
||||||
witness_program = CScript([OP_TRUE])
|
witness_program = CScript([OP_TRUE])
|
||||||
witness_hash = sha256(witness_program)
|
witness_hash = sha256(witness_program)
|
||||||
|
@ -550,37 +535,9 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
# TODO: support multiple acceptable reject reasons.
|
# TODO: support multiple acceptable reject reasons.
|
||||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False, with_witness=False)
|
test_witness_block(self.nodes[0], self.test_node, block, accepted=False, with_witness=False)
|
||||||
|
|
||||||
self.connect_nodes(0, 2)
|
|
||||||
|
|
||||||
self.utxo.pop(0)
|
self.utxo.pop(0)
|
||||||
self.utxo.append(UTXO(txid, 2, value))
|
self.utxo.append(UTXO(txid, 2, value))
|
||||||
|
|
||||||
@subtest # type: ignore
|
|
||||||
def test_getblocktemplate_before_lockin(self):
|
|
||||||
txid = int(self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1), 16)
|
|
||||||
|
|
||||||
for node in [self.nodes[0], self.nodes[2]]:
|
|
||||||
gbt_results = node.getblocktemplate({"rules": ["segwit"]})
|
|
||||||
if node == self.nodes[2]:
|
|
||||||
# If this is a non-segwit node, we should not get a witness
|
|
||||||
# commitment.
|
|
||||||
assert 'default_witness_commitment' not in gbt_results
|
|
||||||
else:
|
|
||||||
# For segwit-aware nodes, check the witness
|
|
||||||
# commitment is correct.
|
|
||||||
assert 'default_witness_commitment' in gbt_results
|
|
||||||
witness_commitment = gbt_results['default_witness_commitment']
|
|
||||||
|
|
||||||
# Check that default_witness_commitment is present.
|
|
||||||
witness_root = CBlock.get_merkle_root([ser_uint256(0),
|
|
||||||
ser_uint256(txid)])
|
|
||||||
script = get_witness_script(witness_root, 0)
|
|
||||||
assert_equal(witness_commitment, script.hex())
|
|
||||||
|
|
||||||
# Clear out the mempool
|
|
||||||
self.nodes[0].generate(1)
|
|
||||||
self.sync_blocks()
|
|
||||||
|
|
||||||
@subtest # type: ignore
|
@subtest # type: ignore
|
||||||
def test_witness_tx_relay_before_segwit_activation(self):
|
def test_witness_tx_relay_before_segwit_activation(self):
|
||||||
|
|
||||||
|
@ -1952,39 +1909,6 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
|
|
||||||
self.utxo.pop(0)
|
self.utxo.pop(0)
|
||||||
|
|
||||||
@subtest # type: ignore
|
|
||||||
def test_upgrade_after_activation(self):
|
|
||||||
"""Test the behavior of starting up a segwit-aware node after the softfork has activated."""
|
|
||||||
|
|
||||||
# All nodes are caught up and node 2 is a pre-segwit node that will soon upgrade.
|
|
||||||
for n in range(2):
|
|
||||||
assert_equal(self.nodes[n].getblockcount(), self.nodes[2].getblockcount())
|
|
||||||
assert softfork_active(self.nodes[n], "segwit")
|
|
||||||
assert SEGWIT_HEIGHT < self.nodes[2].getblockcount()
|
|
||||||
assert 'segwit' not in self.nodes[2].getblockchaininfo()['softforks']
|
|
||||||
|
|
||||||
# Restarting node 2 should result in a shutdown because the blockchain consists of
|
|
||||||
# insufficiently validated blocks per segwit consensus rules.
|
|
||||||
self.stop_node(2)
|
|
||||||
self.nodes[2].assert_start_raises_init_error(
|
|
||||||
extra_args=[f"-segwitheight={SEGWIT_HEIGHT}"],
|
|
||||||
expected_msg=f": Witness data for blocks after height {SEGWIT_HEIGHT} requires validation. Please restart with -reindex..\nPlease restart with -reindex or -reindex-chainstate to recover.",
|
|
||||||
)
|
|
||||||
|
|
||||||
# As directed, the user restarts the node with -reindex
|
|
||||||
self.start_node(2, extra_args=["-reindex", f"-segwitheight={SEGWIT_HEIGHT}"])
|
|
||||||
|
|
||||||
# With the segwit consensus rules, the node is able to validate only up to SEGWIT_HEIGHT - 1
|
|
||||||
assert_equal(self.nodes[2].getblockcount(), SEGWIT_HEIGHT - 1)
|
|
||||||
self.connect_nodes(0, 2)
|
|
||||||
|
|
||||||
# We reconnect more than 100 blocks, give it plenty of time
|
|
||||||
# sync_blocks() also verifies the best block hash is the same for all nodes
|
|
||||||
self.sync_blocks(timeout=240)
|
|
||||||
|
|
||||||
# The upgraded node should now have segwit activated
|
|
||||||
assert softfork_active(self.nodes[2], "segwit")
|
|
||||||
|
|
||||||
@subtest # type: ignore
|
@subtest # type: ignore
|
||||||
def test_witness_sigops(self):
|
def test_witness_sigops(self):
|
||||||
"""Test sigop counting is correct inside witnesses."""
|
"""Test sigop counting is correct inside witnesses."""
|
||||||
|
|
|
@ -292,6 +292,7 @@ BASE_SCRIPTS = [
|
||||||
'feature_blocksdir.py',
|
'feature_blocksdir.py',
|
||||||
'wallet_startup.py',
|
'wallet_startup.py',
|
||||||
'feature_config_args.py',
|
'feature_config_args.py',
|
||||||
|
'feature_presegwit_node_upgrade.py',
|
||||||
'feature_settings.py',
|
'feature_settings.py',
|
||||||
'rpc_getdescriptorinfo.py',
|
'rpc_getdescriptorinfo.py',
|
||||||
'rpc_addresses_deprecation.py',
|
'rpc_addresses_deprecation.py',
|
||||||
|
|
Loading…
Add table
Reference in a new issue