mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-26 23:45:54 +01:00
Merge bitcoin/bitcoin#22818: test: Activate all regtest softforks at height 1, unless overridden
fa4db8671btest: Activate all regtest softforks at height 1, unless overridden (MarcoFalke)faad1e5ffdIntroduce -testactivationheight=name@height setting (MarcoFalke)fadb2ef2fatest: Add extra_args argument to TestChain100Setup constructor (MarcoFalke)faa46986aatest: Remove version argument from build_next_block in p2p_segwit test (MarcoFalke)fa086ef539test: Remove unused ~TestChain100Setup (MarcoFalke) Pull request description: All softforks that are active at the tip of mainnet, should also be active from genesis in regtest. Otherwise their rules might not be enforced in user testing, thus making their testing less useful. To still allow tests to check pre-softfork rules, a runtime argument can change the activation height. ACKs for top commit: laanwj: Code review ACKfa4db8671btheStack: re-ACKfa4db8671bTree-SHA512: 6397d46ff56ebc48c007a4cda633904d6ac085bc76b4ecf83097c546c7eec93ac0c44b88083b2611b9091c8d1fb8ee1e314065de078ef15e922c015de7ade8bf
This commit is contained in:
@@ -41,8 +41,14 @@ class BIP68Test(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 2
|
||||
self.extra_args = [
|
||||
["-acceptnonstdtxn=1"],
|
||||
["-acceptnonstdtxn=0"],
|
||||
[
|
||||
'-testactivationheight=csv@432',
|
||||
"-acceptnonstdtxn=1",
|
||||
],
|
||||
[
|
||||
'-testactivationheight=csv@432',
|
||||
"-acceptnonstdtxn=0",
|
||||
],
|
||||
]
|
||||
|
||||
def skip_test_if_missing_module(self):
|
||||
|
||||
@@ -82,7 +82,10 @@ class FullBlockTest(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 1
|
||||
self.setup_clean_chain = True
|
||||
self.extra_args = [['-acceptnonstdtxn=1']] # This is a consensus block test, we don't care about tx policy
|
||||
self.extra_args = [[
|
||||
'-acceptnonstdtxn=1', # This is a consensus block test, we don't care about tx policy
|
||||
'-testactivationheight=bip34@2',
|
||||
]]
|
||||
|
||||
def run_test(self):
|
||||
node = self.nodes[0] # convenience reference to the node
|
||||
|
||||
@@ -8,7 +8,6 @@ Test that the CHECKLOCKTIMEVERIFY soft-fork activates.
|
||||
"""
|
||||
|
||||
from test_framework.blocktools import (
|
||||
CLTV_HEIGHT,
|
||||
create_block,
|
||||
create_coinbase,
|
||||
)
|
||||
@@ -76,10 +75,14 @@ def cltv_validate(tx, height):
|
||||
cltv_modify_tx(tx, prepend_scriptsig=scheme[0], nsequence=scheme[1], nlocktime=scheme[2])
|
||||
|
||||
|
||||
CLTV_HEIGHT = 111
|
||||
|
||||
|
||||
class BIP65Test(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 1
|
||||
self.extra_args = [[
|
||||
f'-testactivationheight=cltv@{CLTV_HEIGHT}',
|
||||
'-whitelist=noban@127.0.0.1',
|
||||
'-par=1', # Use only one script thread to get the exact reject reason for testing
|
||||
'-acceptnonstdtxn=1', # cltv_invalidate is nonstandard
|
||||
|
||||
@@ -41,7 +41,6 @@ from itertools import product
|
||||
import time
|
||||
|
||||
from test_framework.blocktools import (
|
||||
CSV_ACTIVATION_HEIGHT,
|
||||
create_block,
|
||||
create_coinbase,
|
||||
)
|
||||
@@ -89,12 +88,16 @@ def all_rlt_txs(txs):
|
||||
return [tx['tx'] for tx in txs]
|
||||
|
||||
|
||||
CSV_ACTIVATION_HEIGHT = 432
|
||||
|
||||
|
||||
class BIP68_112_113Test(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 1
|
||||
self.setup_clean_chain = True
|
||||
self.extra_args = [[
|
||||
'-whitelist=noban@127.0.0.1',
|
||||
f'-testactivationheight=csv@{CSV_ACTIVATION_HEIGHT}',
|
||||
'-par=1', # Use only one script thread to get the exact reject reason for testing
|
||||
]]
|
||||
self.supports_cli = False
|
||||
|
||||
@@ -8,7 +8,6 @@ Test the DERSIG soft-fork activation on regtest.
|
||||
"""
|
||||
|
||||
from test_framework.blocktools import (
|
||||
DERSIG_HEIGHT,
|
||||
create_block,
|
||||
create_coinbase,
|
||||
)
|
||||
@@ -42,10 +41,14 @@ def unDERify(tx):
|
||||
tx.vin[0].scriptSig = CScript(newscript)
|
||||
|
||||
|
||||
DERSIG_HEIGHT = 102
|
||||
|
||||
|
||||
class BIP66Test(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 1
|
||||
self.extra_args = [[
|
||||
f'-testactivationheight=dersig@{DERSIG_HEIGHT}',
|
||||
'-whitelist=noban@127.0.0.1',
|
||||
'-par=1', # Use only one script thread to get the exact log msg for testing
|
||||
]]
|
||||
@@ -83,7 +86,6 @@ class BIP66Test(BitcoinTestFramework):
|
||||
tip = self.nodes[0].getbestblockhash()
|
||||
block_time = self.nodes[0].getblockheader(tip)['mediantime'] + 1
|
||||
block = create_block(int(tip, 16), create_coinbase(DERSIG_HEIGHT - 1), block_time)
|
||||
block.nVersion = 2
|
||||
block.vtx.append(spendtx)
|
||||
block.hashMerkleRoot = block.calc_merkle_root()
|
||||
block.rehash()
|
||||
@@ -110,7 +112,7 @@ class BIP66Test(BitcoinTestFramework):
|
||||
peer.sync_with_ping()
|
||||
|
||||
self.log.info("Test that transactions with non-DER signatures cannot appear in a block")
|
||||
block.nVersion = 3
|
||||
block.nVersion = 4
|
||||
|
||||
spendtx = self.create_tx(self.coinbase_txids[1])
|
||||
unDERify(spendtx)
|
||||
@@ -139,7 +141,7 @@ class BIP66Test(BitcoinTestFramework):
|
||||
assert_equal(int(self.nodes[0].getbestblockhash(), 16), tip)
|
||||
peer.sync_with_ping()
|
||||
|
||||
self.log.info("Test that a version 3 block with a DERSIG-compliant transaction is accepted")
|
||||
self.log.info("Test that a block with a DERSIG-compliant transaction is accepted")
|
||||
block.vtx[1] = self.create_tx(self.coinbase_txids[1])
|
||||
block.hashMerkleRoot = block.calc_merkle_root()
|
||||
block.rehash()
|
||||
|
||||
@@ -52,7 +52,7 @@ class NULLDUMMYTest(BitcoinTestFramework):
|
||||
# This script tests NULLDUMMY activation, which is part of the 'segwit' deployment, so we go through
|
||||
# normal segwit activation here (and don't use the default always-on behaviour).
|
||||
self.extra_args = [[
|
||||
f'-segwitheight={COINBASE_MATURITY + 5}',
|
||||
f'-testactivationheight=segwit@{COINBASE_MATURITY + 5}',
|
||||
'-addresstype=legacy',
|
||||
'-par=1', # Use only one script thread to get the exact reject reason for testing
|
||||
]]
|
||||
|
||||
@@ -16,7 +16,7 @@ class SegwitUpgradeTest(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.setup_clean_chain = True
|
||||
self.num_nodes = 1
|
||||
self.extra_args = [["-segwitheight=10"]]
|
||||
self.extra_args = [["-testactivationheight=segwit@10"]]
|
||||
|
||||
def run_test(self):
|
||||
"""A pre-segwit node with insufficiently validated blocks needs to redownload blocks"""
|
||||
@@ -37,14 +37,14 @@ class SegwitUpgradeTest(BitcoinTestFramework):
|
||||
# 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"],
|
||||
extra_args=["-testactivationheight=segwit@5"],
|
||||
expected_msg=": Witness data for blocks after height 5 requires "
|
||||
f"validation. Please restart with -reindex..{os.linesep}"
|
||||
"Please 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"])
|
||||
self.start_node(0, extra_args=["-reindex", "-testactivationheight=segwit@5"])
|
||||
|
||||
# With the segwit consensus rules, the node is able to validate only up to block 4
|
||||
assert_equal(node.getblockcount(), 4)
|
||||
|
||||
@@ -78,18 +78,18 @@ class SegWitTest(BitcoinTestFramework):
|
||||
[
|
||||
"-acceptnonstdtxn=1",
|
||||
"-rpcserialversion=0",
|
||||
"-segwitheight=432",
|
||||
"-testactivationheight=segwit@432",
|
||||
"-addresstype=legacy",
|
||||
],
|
||||
[
|
||||
"-acceptnonstdtxn=1",
|
||||
"-rpcserialversion=1",
|
||||
"-segwitheight=432",
|
||||
"-testactivationheight=segwit@432",
|
||||
"-addresstype=legacy",
|
||||
],
|
||||
[
|
||||
"-acceptnonstdtxn=1",
|
||||
"-segwitheight=432",
|
||||
"-testactivationheight=segwit@432",
|
||||
"-addresstype=legacy",
|
||||
],
|
||||
]
|
||||
|
||||
@@ -84,10 +84,6 @@ from test_framework.util import (
|
||||
assert_raises_rpc_error,
|
||||
)
|
||||
|
||||
# The versionbit bit used to signal activation of SegWit
|
||||
VB_WITNESS_BIT = 1
|
||||
VB_TOP_BITS = 0x20000000
|
||||
|
||||
MAX_SIGOP_COST = 80000
|
||||
|
||||
SEGWIT_HEIGHT = 120
|
||||
@@ -197,8 +193,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
self.num_nodes = 2
|
||||
# This test tests SegWit both pre and post-activation, so use the normal BIP9 activation.
|
||||
self.extra_args = [
|
||||
["-acceptnonstdtxn=1", "-segwitheight={}".format(SEGWIT_HEIGHT), "-whitelist=noban@127.0.0.1"],
|
||||
["-acceptnonstdtxn=0", "-segwitheight={}".format(SEGWIT_HEIGHT)],
|
||||
["-acceptnonstdtxn=1", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}", "-whitelist=noban@127.0.0.1"],
|
||||
["-acceptnonstdtxn=0", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}"],
|
||||
]
|
||||
self.supports_cli = False
|
||||
|
||||
@@ -207,13 +203,13 @@ class SegWitTest(BitcoinTestFramework):
|
||||
|
||||
# Helper functions
|
||||
|
||||
def build_next_block(self, version=4):
|
||||
def build_next_block(self):
|
||||
"""Build a block on top of node0's tip."""
|
||||
tip = self.nodes[0].getbestblockhash()
|
||||
height = self.nodes[0].getblockcount() + 1
|
||||
block_time = self.nodes[0].getblockheader(tip)["mediantime"] + 1
|
||||
block = create_block(int(tip, 16), create_coinbase(height), block_time)
|
||||
block.nVersion = version
|
||||
block.nVersion = 4
|
||||
block.rehash()
|
||||
return block
|
||||
|
||||
@@ -299,7 +295,7 @@ class SegWitTest(BitcoinTestFramework):
|
||||
# Mine a block with an anyone-can-spend coinbase,
|
||||
# let it mature, then try to spend it.
|
||||
|
||||
block = self.build_next_block(version=1)
|
||||
block = self.build_next_block()
|
||||
block.solve()
|
||||
self.test_node.send_and_ping(msg_no_witness_block(block)) # make sure the block was processed
|
||||
txid = block.vtx[0].sha256
|
||||
@@ -337,8 +333,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
tx.rehash()
|
||||
assert tx.sha256 != tx.calc_sha256(with_witness=True)
|
||||
|
||||
# Construct a segwit-signaling block that includes the transaction.
|
||||
block = self.build_next_block(version=(VB_TOP_BITS | (1 << VB_WITNESS_BIT)))
|
||||
# Construct a block that includes the transaction.
|
||||
block = self.build_next_block()
|
||||
self.update_witness_block_with_transactions(block, [tx])
|
||||
# Sending witness data before activation is not allowed (anti-spam
|
||||
# rule).
|
||||
@@ -365,7 +361,7 @@ class SegWitTest(BitcoinTestFramework):
|
||||
# test_node has set NODE_WITNESS, so all getdata requests should be for
|
||||
# witness blocks.
|
||||
# Test announcing a block via inv results in a getdata, and that
|
||||
# announcing a version 4 or random VB block with a header results in a getdata
|
||||
# announcing a block with a header results in a getdata
|
||||
block1 = self.build_next_block()
|
||||
block1.solve()
|
||||
|
||||
@@ -373,19 +369,13 @@ class SegWitTest(BitcoinTestFramework):
|
||||
assert self.test_node.last_message["getdata"].inv[0].type == blocktype
|
||||
test_witness_block(self.nodes[0], self.test_node, block1, True)
|
||||
|
||||
block2 = self.build_next_block(version=4)
|
||||
block2 = self.build_next_block()
|
||||
block2.solve()
|
||||
|
||||
self.test_node.announce_block_and_wait_for_getdata(block2, use_header=True)
|
||||
assert self.test_node.last_message["getdata"].inv[0].type == blocktype
|
||||
test_witness_block(self.nodes[0], self.test_node, block2, True)
|
||||
|
||||
block3 = self.build_next_block(version=(VB_TOP_BITS | (1 << 15)))
|
||||
block3.solve()
|
||||
self.test_node.announce_block_and_wait_for_getdata(block3, use_header=True)
|
||||
assert self.test_node.last_message["getdata"].inv[0].type == blocktype
|
||||
test_witness_block(self.nodes[0], self.test_node, block3, True)
|
||||
|
||||
# Check that we can getdata for witness blocks or regular blocks,
|
||||
# and the right thing happens.
|
||||
if not self.segwit_active:
|
||||
@@ -430,7 +420,7 @@ class SegWitTest(BitcoinTestFramework):
|
||||
assert_equal(rpc_details["weight"], block.get_weight())
|
||||
|
||||
# Upgraded node should not ask for blocks from unupgraded
|
||||
block4 = self.build_next_block(version=4)
|
||||
block4 = self.build_next_block()
|
||||
block4.solve()
|
||||
self.old_node.getdataset = set()
|
||||
|
||||
|
||||
@@ -27,8 +27,6 @@ import subprocess
|
||||
|
||||
from test_framework.address import ADDRESS_BCRT1_P2WSH_OP_TRUE
|
||||
from test_framework.blocktools import (
|
||||
CLTV_HEIGHT,
|
||||
DERSIG_HEIGHT,
|
||||
create_block,
|
||||
create_coinbase,
|
||||
TIME_GENESIS_BLOCK,
|
||||
@@ -142,11 +140,11 @@ class BlockchainTest(BitcoinTestFramework):
|
||||
assert_greater_than(res['size_on_disk'], 0)
|
||||
|
||||
assert_equal(res['softforks'], {
|
||||
'bip34': {'type': 'buried', 'active': True, 'height': 2},
|
||||
'bip66': {'type': 'buried', 'active': True, 'height': DERSIG_HEIGHT},
|
||||
'bip65': {'type': 'buried', 'active': True, 'height': CLTV_HEIGHT},
|
||||
'csv': {'type': 'buried', 'active': False, 'height': 432},
|
||||
'segwit': {'type': 'buried', 'active': True, 'height': 0},
|
||||
'bip34': {'type': 'buried', 'active': True, 'height': 1},
|
||||
'bip66': {'type': 'buried', 'active': True, 'height': 1},
|
||||
'bip65': {'type': 'buried', 'active': True, 'height': 1},
|
||||
'csv': {'type': 'buried', 'active': True, 'height': 1},
|
||||
'segwit': {'type': 'buried', 'active': True, 'height': 1},
|
||||
'testdummy': {
|
||||
'type': 'bip9',
|
||||
'bip9': {
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
from test_framework.blocktools import (
|
||||
COINBASE_MATURITY,
|
||||
CSV_ACTIVATION_HEIGHT,
|
||||
)
|
||||
from test_framework.address import (
|
||||
script_to_p2sh,
|
||||
@@ -18,7 +17,6 @@ from test_framework.util import (
|
||||
assert_equal,
|
||||
assert_raises_rpc_error,
|
||||
find_vout_for_address,
|
||||
generate_to_height,
|
||||
)
|
||||
from test_framework.messages import (
|
||||
CTxInWitness,
|
||||
@@ -273,7 +271,6 @@ class SignRawTransactionsTest(BitcoinTestFramework):
|
||||
getcontext().prec = 8
|
||||
|
||||
# Make sure CSV is active
|
||||
generate_to_height(self, self.nodes[0], CSV_ACTIVATION_HEIGHT)
|
||||
assert self.nodes[0].getblockchaininfo()['softforks']['csv']['active']
|
||||
|
||||
# Create a P2WSH script with CSV
|
||||
|
||||
@@ -53,11 +53,6 @@ TIME_GENESIS_BLOCK = 1296688602
|
||||
# Coinbase transaction outputs can only be spent after this number of new blocks (network rule)
|
||||
COINBASE_MATURITY = 100
|
||||
|
||||
# Soft-fork activation heights
|
||||
DERSIG_HEIGHT = 102 # BIP 66
|
||||
CLTV_HEIGHT = 111 # BIP 65
|
||||
CSV_ACTIVATION_HEIGHT = 432
|
||||
|
||||
# From BIP141
|
||||
WITNESS_COMMITMENT_HEADER = b"\xaa\x21\xa9\xed"
|
||||
|
||||
|
||||
@@ -560,17 +560,6 @@ def mine_large_block(test_framework, node, utxos=None):
|
||||
test_framework.generate(node, 1)
|
||||
|
||||
|
||||
def generate_to_height(test_framework, node, target_height):
|
||||
"""Generates blocks until a given target block height has been reached.
|
||||
To prevent timeouts, only up to 200 blocks are generated per RPC call.
|
||||
Can be used to activate certain soft-forks (e.g. CSV, CLTV)."""
|
||||
current_height = node.getblockcount()
|
||||
while current_height < target_height:
|
||||
nblocks = min(200, target_height - current_height)
|
||||
current_height += len(test_framework.generate(node, nblocks))
|
||||
assert_equal(node.getblockcount(), target_height)
|
||||
|
||||
|
||||
def find_vout_for_address(node, txid, addr):
|
||||
"""
|
||||
Locate the vout index of the given transaction sending to the
|
||||
|
||||
Reference in New Issue
Block a user