mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-12 11:19:08 -05:00
Merge #20292: test: Fix intermittent feature_taproot issue
fab900802d
ci: Bump timeout factor (MarcoFalke)50eb0c2512
Small improvements to the Taproot functional tests (Pieter Wuille)fac865b72d
test: Fix intermittent feature_taproot issue (MarcoFalke)fa1dea19fc
test: Fix deser issue in create_block (MarcoFalke)fa762a3fd4
test: Remove unused unnamed parameter from block.serialize call (MarcoFalke) Pull request description: This fixes three bugs. Also, fix some unrelated code style issues. Please refer to the commit messages for more information. ACKs for top commit: laanwj: Code review ACKfab900802d
Tree-SHA512: 4e22c240cf345710f3b21fc63243126b90014b3656d0865ff87156e958dd1442e6572c6c0a5701dbbe503eee931a0ceb66eeeb3553137f3d1f5afd27a9f9cada
This commit is contained in:
commit
4fd37d0a10
4 changed files with 24 additions and 17 deletions
|
@ -38,7 +38,7 @@ export RUN_SECURITY_TESTS=${RUN_SECURITY_TESTS:-false}
|
||||||
# By how much to scale the test_runner timeouts (option --timeout-factor).
|
# By how much to scale the test_runner timeouts (option --timeout-factor).
|
||||||
# This is needed because some ci machines have slow CPU or disk, so sanitizers
|
# This is needed because some ci machines have slow CPU or disk, so sanitizers
|
||||||
# might be slow or a reindex might be waiting on disk IO.
|
# might be slow or a reindex might be waiting on disk IO.
|
||||||
export TEST_RUNNER_TIMEOUT_FACTOR=${TEST_RUNNER_TIMEOUT_FACTOR:-4}
|
export TEST_RUNNER_TIMEOUT_FACTOR=${TEST_RUNNER_TIMEOUT_FACTOR:-40}
|
||||||
export TEST_RUNNER_ENV=${TEST_RUNNER_ENV:-}
|
export TEST_RUNNER_ENV=${TEST_RUNNER_ENV:-}
|
||||||
export RUN_FUZZ_TESTS=${RUN_FUZZ_TESTS:-false}
|
export RUN_FUZZ_TESTS=${RUN_FUZZ_TESTS:-false}
|
||||||
export EXPECTED_TESTS_DURATION_IN_SECONDS=${EXPECTED_TESTS_DURATION_IN_SECONDS:-1000}
|
export EXPECTED_TESTS_DURATION_IN_SECONDS=${EXPECTED_TESTS_DURATION_IN_SECONDS:-1000}
|
||||||
|
|
|
@ -9,6 +9,7 @@ from test_framework.blocktools import (
|
||||||
create_block,
|
create_block,
|
||||||
add_witness_commitment,
|
add_witness_commitment,
|
||||||
MAX_BLOCK_SIGOPS_WEIGHT,
|
MAX_BLOCK_SIGOPS_WEIGHT,
|
||||||
|
NORMAL_GBT_REQUEST_PARAMS,
|
||||||
WITNESS_SCALE_FACTOR,
|
WITNESS_SCALE_FACTOR,
|
||||||
)
|
)
|
||||||
from test_framework.messages import (
|
from test_framework.messages import (
|
||||||
|
@ -1199,7 +1200,7 @@ class TaprootTest(BitcoinTestFramework):
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
# Node 0 has Taproot inactive, Node 1 active.
|
# Node 0 has Taproot inactive, Node 1 active.
|
||||||
self.extra_args = [["-whitelist=127.0.0.1", "-par=1", "-vbparams=taproot:1:1"], ["-whitelist=127.0.0.1", "-par=1"]]
|
self.extra_args = [["-par=1", "-vbparams=taproot:1:1"], ["-par=1"]]
|
||||||
|
|
||||||
def block_submit(self, node, txs, msg, err_msg, cb_pubkey=None, fees=0, sigops_weight=0, witness=False, accept=False):
|
def block_submit(self, node, txs, msg, err_msg, cb_pubkey=None, fees=0, sigops_weight=0, witness=False, accept=False):
|
||||||
|
|
||||||
|
@ -1218,7 +1219,7 @@ class TaprootTest(BitcoinTestFramework):
|
||||||
witness and add_witness_commitment(block)
|
witness and add_witness_commitment(block)
|
||||||
block.rehash()
|
block.rehash()
|
||||||
block.solve()
|
block.solve()
|
||||||
block_response = node.submitblock(block.serialize(True).hex())
|
block_response = node.submitblock(block.serialize().hex())
|
||||||
if err_msg is not None:
|
if err_msg is not None:
|
||||||
assert block_response is not None and err_msg in block_response, "Missing error message '%s' from block response '%s': %s" % (err_msg, "(None)" if block_response is None else block_response, msg)
|
assert block_response is not None and err_msg in block_response, "Missing error message '%s' from block response '%s': %s" % (err_msg, "(None)" if block_response is None else block_response, msg)
|
||||||
if (accept):
|
if (accept):
|
||||||
|
@ -1436,17 +1437,27 @@ class TaprootTest(BitcoinTestFramework):
|
||||||
self.log.info(" - Done")
|
self.log.info(" - Done")
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.connect_nodes(0, 1)
|
|
||||||
|
|
||||||
# Post-taproot activation tests go first (pre-taproot tests' blocks are invalid post-taproot).
|
# Post-taproot activation tests go first (pre-taproot tests' blocks are invalid post-taproot).
|
||||||
self.log.info("Post-activation tests...")
|
self.log.info("Post-activation tests...")
|
||||||
self.nodes[1].generate(101)
|
self.nodes[1].generate(101)
|
||||||
self.test_spenders(self.nodes[1], spenders_taproot_active(), input_counts=[1, 2, 2, 2, 2, 3])
|
self.test_spenders(self.nodes[1], spenders_taproot_active(), input_counts=[1, 2, 2, 2, 2, 3])
|
||||||
|
|
||||||
# Transfer % of funds to pre-taproot node.
|
# Transfer funds to pre-taproot node.
|
||||||
addr = self.nodes[0].getnewaddress()
|
addr = self.nodes[0].getnewaddress()
|
||||||
self.nodes[1].sendtoaddress(address=addr, amount=int(self.nodes[1].getbalance() * 70000000) / 100000000)
|
rawtx = self.nodes[1].createrawtransaction(
|
||||||
self.nodes[1].generate(1)
|
inputs=[{
|
||||||
|
'txid': i['txid'],
|
||||||
|
'vout': i['vout']
|
||||||
|
} for i in self.nodes[1].listunspent()],
|
||||||
|
outputs={addr: self.nodes[1].getbalance()},
|
||||||
|
)
|
||||||
|
rawtx = self.nodes[1].signrawtransactionwithwallet(rawtx)['hex']
|
||||||
|
# Transaction is too large to fit into the mempool, so put it into a block
|
||||||
|
block = create_block(tmpl=self.nodes[1].getblocktemplate(NORMAL_GBT_REQUEST_PARAMS), txlist=[rawtx])
|
||||||
|
add_witness_commitment(block)
|
||||||
|
block.rehash()
|
||||||
|
block.solve()
|
||||||
|
assert_equal(None, self.nodes[1].submitblock(block.serialize().hex()))
|
||||||
self.sync_blocks()
|
self.sync_blocks()
|
||||||
|
|
||||||
# Pre-taproot activation tests.
|
# Pre-taproot activation tests.
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
"""Utilities for manipulating blocks and transactions."""
|
"""Utilities for manipulating blocks and transactions."""
|
||||||
|
|
||||||
from binascii import a2b_hex
|
from binascii import a2b_hex
|
||||||
import io
|
|
||||||
import struct
|
import struct
|
||||||
import time
|
import time
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -45,7 +44,6 @@ from .script import (
|
||||||
hash160,
|
hash160,
|
||||||
)
|
)
|
||||||
from .util import assert_equal
|
from .util import assert_equal
|
||||||
from io import BytesIO
|
|
||||||
|
|
||||||
WITNESS_SCALE_FACTOR = 4
|
WITNESS_SCALE_FACTOR = 4
|
||||||
MAX_BLOCK_SIGOPS = 20000
|
MAX_BLOCK_SIGOPS = 20000
|
||||||
|
@ -78,9 +76,7 @@ def create_block(hashprev=None, coinbase=None, ntime=None, *, version=None, tmpl
|
||||||
if txlist:
|
if txlist:
|
||||||
for tx in txlist:
|
for tx in txlist:
|
||||||
if not hasattr(tx, 'calc_sha256'):
|
if not hasattr(tx, 'calc_sha256'):
|
||||||
txo = CTransaction()
|
tx = FromHex(CTransaction(), tx)
|
||||||
txo.deserialize(io.BytesIO(tx))
|
|
||||||
tx = txo
|
|
||||||
block.vtx.append(tx)
|
block.vtx.append(tx)
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
block.hashMerkleRoot = block.calc_merkle_root()
|
||||||
block.calc_sha256()
|
block.calc_sha256()
|
||||||
|
@ -166,8 +162,7 @@ def create_transaction(node, txid, to_address, *, amount):
|
||||||
sign for the output that is being spent.
|
sign for the output that is being spent.
|
||||||
"""
|
"""
|
||||||
raw_tx = create_raw_transaction(node, txid, to_address, amount=amount)
|
raw_tx = create_raw_transaction(node, txid, to_address, amount=amount)
|
||||||
tx = CTransaction()
|
tx = FromHex(CTransaction(), raw_tx)
|
||||||
tx.deserialize(BytesIO(hex_str_to_bytes(raw_tx)))
|
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
def create_raw_transaction(node, txid, to_address, *, amount):
|
def create_raw_transaction(node, txid, to_address, *, amount):
|
||||||
|
|
|
@ -10,7 +10,6 @@ import csv
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import sys
|
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from .util import modinv
|
from .util import modinv
|
||||||
|
@ -22,6 +21,7 @@ def TaggedHash(tag, data):
|
||||||
return hashlib.sha256(ss).digest()
|
return hashlib.sha256(ss).digest()
|
||||||
|
|
||||||
def xor_bytes(b0, b1):
|
def xor_bytes(b0, b1):
|
||||||
|
assert len(b0) == len(b1)
|
||||||
return bytes(x ^ y for (x, y) in zip(b0, b1))
|
return bytes(x ^ y for (x, y) in zip(b0, b1))
|
||||||
|
|
||||||
def jacobi_symbol(n, k):
|
def jacobi_symbol(n, k):
|
||||||
|
@ -523,7 +523,8 @@ class TestFrameworkKey(unittest.TestCase):
|
||||||
def test_schnorr_testvectors(self):
|
def test_schnorr_testvectors(self):
|
||||||
"""Implement the BIP340 test vectors (read from bip340_test_vectors.csv)."""
|
"""Implement the BIP340 test vectors (read from bip340_test_vectors.csv)."""
|
||||||
num_tests = 0
|
num_tests = 0
|
||||||
with open(os.path.join(sys.path[0], 'test_framework', 'bip340_test_vectors.csv'), newline='', encoding='utf8') as csvfile:
|
vectors_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'bip340_test_vectors.csv')
|
||||||
|
with open(vectors_file, newline='', encoding='utf8') as csvfile:
|
||||||
reader = csv.reader(csvfile)
|
reader = csv.reader(csvfile)
|
||||||
next(reader)
|
next(reader)
|
||||||
for row in reader:
|
for row in reader:
|
||||||
|
|
Loading…
Add table
Reference in a new issue