mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 10:38:42 +01:00
test: fix "tx-size-small" errors after default address change
Addresses #17043, affects RBF and BIP68 functional tests. The "tx-size-small" policy rule rejects transactions with a non-witness size of smaller than 82 bytes (see src/validation.cpp:MemPoolAccept::PreChecks(...)), which corresponds to a transaction with 1 segwit input and 1 P2WPKH output. Through the default address change, the created test transactions have segwit inputs now and sending to short scriptPubKeys might violate this rule. By bumping the dummy scriptPubKey size to 22 bytes (= the size of a P2WPKH scriptPubKey), on all occurences the problem is solved. The dummy scriptPubKey has the format: 21 <21-byte-long string of 'a' or 1s> former commit messages, now squashed: test: rbf, bip68: use constant DUMMY_P2WPKH_SCRIPT for bumped scriptPubKey test: rbf, bip68: use constant DUMMY_P2WPKH_SCRIPT for dummy scriptPubKeys (b'a' * 35) test: rbf, bip68: comment DUMMY_P2WPKH_SCRIPT constant, put into common (new) module
This commit is contained in:
parent
08ed87e887
commit
32d665c265
@ -8,7 +8,6 @@ import time
|
|||||||
|
|
||||||
from test_framework.blocktools import create_block, create_coinbase, add_witness_commitment
|
from test_framework.blocktools import create_block, create_coinbase, add_witness_commitment
|
||||||
from test_framework.messages import COIN, COutPoint, CTransaction, CTxIn, CTxOut, FromHex, ToHex
|
from test_framework.messages import COIN, COutPoint, CTransaction, CTxIn, CTxOut, FromHex, ToHex
|
||||||
from test_framework.script import CScript
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
@ -17,6 +16,7 @@ from test_framework.util import (
|
|||||||
satoshi_round,
|
satoshi_round,
|
||||||
softfork_active,
|
softfork_active,
|
||||||
)
|
)
|
||||||
|
from test_framework.script_util import DUMMY_P2WPKH_SCRIPT
|
||||||
|
|
||||||
SEQUENCE_LOCKTIME_DISABLE_FLAG = (1<<31)
|
SEQUENCE_LOCKTIME_DISABLE_FLAG = (1<<31)
|
||||||
SEQUENCE_LOCKTIME_TYPE_FLAG = (1<<22) # this means use time (0 means height)
|
SEQUENCE_LOCKTIME_TYPE_FLAG = (1<<22) # this means use time (0 means height)
|
||||||
@ -29,10 +29,9 @@ NOT_FINAL_ERROR = "non-BIP68-final (code 64)"
|
|||||||
class BIP68Test(BitcoinTestFramework):
|
class BIP68Test(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
# TODO remove output type argument and fix resulting "tx-size-small" errors
|
|
||||||
self.extra_args = [
|
self.extra_args = [
|
||||||
["-acceptnonstdtxn=1", "-addresstype=p2sh-segwit"],
|
["-acceptnonstdtxn=1"],
|
||||||
["-acceptnonstdtxn=0", "-addresstype=p2sh-segwit"],
|
["-acceptnonstdtxn=0"],
|
||||||
]
|
]
|
||||||
|
|
||||||
def skip_test_if_missing_module(self):
|
def skip_test_if_missing_module(self):
|
||||||
@ -85,7 +84,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
# input to mature.
|
# input to mature.
|
||||||
sequence_value = SEQUENCE_LOCKTIME_DISABLE_FLAG | 1
|
sequence_value = SEQUENCE_LOCKTIME_DISABLE_FLAG | 1
|
||||||
tx1.vin = [CTxIn(COutPoint(int(utxo["txid"], 16), utxo["vout"]), nSequence=sequence_value)]
|
tx1.vin = [CTxIn(COutPoint(int(utxo["txid"], 16), utxo["vout"]), nSequence=sequence_value)]
|
||||||
tx1.vout = [CTxOut(value, CScript([b'a']))]
|
tx1.vout = [CTxOut(value, DUMMY_P2WPKH_SCRIPT)]
|
||||||
|
|
||||||
tx1_signed = self.nodes[0].signrawtransactionwithwallet(ToHex(tx1))["hex"]
|
tx1_signed = self.nodes[0].signrawtransactionwithwallet(ToHex(tx1))["hex"]
|
||||||
tx1_id = self.nodes[0].sendrawtransaction(tx1_signed)
|
tx1_id = self.nodes[0].sendrawtransaction(tx1_signed)
|
||||||
@ -97,7 +96,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
tx2.nVersion = 2
|
tx2.nVersion = 2
|
||||||
sequence_value = sequence_value & 0x7fffffff
|
sequence_value = sequence_value & 0x7fffffff
|
||||||
tx2.vin = [CTxIn(COutPoint(tx1_id, 0), nSequence=sequence_value)]
|
tx2.vin = [CTxIn(COutPoint(tx1_id, 0), nSequence=sequence_value)]
|
||||||
tx2.vout = [CTxOut(int(value - self.relayfee * COIN), CScript([b'a' * 35]))]
|
tx2.vout = [CTxOut(int(value - self.relayfee * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx2.rehash()
|
tx2.rehash()
|
||||||
|
|
||||||
assert_raises_rpc_error(-26, NOT_FINAL_ERROR, self.nodes[0].sendrawtransaction, ToHex(tx2))
|
assert_raises_rpc_error(-26, NOT_FINAL_ERROR, self.nodes[0].sendrawtransaction, ToHex(tx2))
|
||||||
@ -192,7 +191,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
value += utxos[j]["amount"]*COIN
|
value += utxos[j]["amount"]*COIN
|
||||||
# Overestimate the size of the tx - signatures should be less than 120 bytes, and leave 50 for the output
|
# Overestimate the size of the tx - signatures should be less than 120 bytes, and leave 50 for the output
|
||||||
tx_size = len(ToHex(tx))//2 + 120*num_inputs + 50
|
tx_size = len(ToHex(tx))//2 + 120*num_inputs + 50
|
||||||
tx.vout.append(CTxOut(int(value-self.relayfee*tx_size*COIN/1000), CScript([b'a'])))
|
tx.vout.append(CTxOut(int(value-self.relayfee*tx_size*COIN/1000), DUMMY_P2WPKH_SCRIPT))
|
||||||
rawtx = self.nodes[0].signrawtransactionwithwallet(ToHex(tx))["hex"]
|
rawtx = self.nodes[0].signrawtransactionwithwallet(ToHex(tx))["hex"]
|
||||||
|
|
||||||
if (using_sequence_locks and not should_pass):
|
if (using_sequence_locks and not should_pass):
|
||||||
@ -221,7 +220,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
tx2 = CTransaction()
|
tx2 = CTransaction()
|
||||||
tx2.nVersion = 2
|
tx2.nVersion = 2
|
||||||
tx2.vin = [CTxIn(COutPoint(tx1.sha256, 0), nSequence=0)]
|
tx2.vin = [CTxIn(COutPoint(tx1.sha256, 0), nSequence=0)]
|
||||||
tx2.vout = [CTxOut(int(tx1.vout[0].nValue - self.relayfee*COIN), CScript([b'a']))]
|
tx2.vout = [CTxOut(int(tx1.vout[0].nValue - self.relayfee*COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx2_raw = self.nodes[0].signrawtransactionwithwallet(ToHex(tx2))["hex"]
|
tx2_raw = self.nodes[0].signrawtransactionwithwallet(ToHex(tx2))["hex"]
|
||||||
tx2 = FromHex(tx2, tx2_raw)
|
tx2 = FromHex(tx2, tx2_raw)
|
||||||
tx2.rehash()
|
tx2.rehash()
|
||||||
@ -239,7 +238,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
tx = CTransaction()
|
tx = CTransaction()
|
||||||
tx.nVersion = 2
|
tx.nVersion = 2
|
||||||
tx.vin = [CTxIn(COutPoint(orig_tx.sha256, 0), nSequence=sequence_value)]
|
tx.vin = [CTxIn(COutPoint(orig_tx.sha256, 0), nSequence=sequence_value)]
|
||||||
tx.vout = [CTxOut(int(orig_tx.vout[0].nValue - relayfee * COIN), CScript([b'a' * 35]))]
|
tx.vout = [CTxOut(int(orig_tx.vout[0].nValue - relayfee * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx.rehash()
|
tx.rehash()
|
||||||
|
|
||||||
if (orig_tx.hash in node.getrawmempool()):
|
if (orig_tx.hash in node.getrawmempool()):
|
||||||
@ -352,7 +351,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
tx2 = CTransaction()
|
tx2 = CTransaction()
|
||||||
tx2.nVersion = 1
|
tx2.nVersion = 1
|
||||||
tx2.vin = [CTxIn(COutPoint(tx1.sha256, 0), nSequence=0)]
|
tx2.vin = [CTxIn(COutPoint(tx1.sha256, 0), nSequence=0)]
|
||||||
tx2.vout = [CTxOut(int(tx1.vout[0].nValue - self.relayfee*COIN), CScript([b'a']))]
|
tx2.vout = [CTxOut(int(tx1.vout[0].nValue - self.relayfee*COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
|
|
||||||
# sign tx2
|
# sign tx2
|
||||||
tx2_raw = self.nodes[0].signrawtransactionwithwallet(ToHex(tx2))["hex"]
|
tx2_raw = self.nodes[0].signrawtransactionwithwallet(ToHex(tx2))["hex"]
|
||||||
@ -367,7 +366,7 @@ class BIP68Test(BitcoinTestFramework):
|
|||||||
tx3 = CTransaction()
|
tx3 = CTransaction()
|
||||||
tx3.nVersion = 2
|
tx3.nVersion = 2
|
||||||
tx3.vin = [CTxIn(COutPoint(tx2.sha256, 0), nSequence=sequence_value)]
|
tx3.vin = [CTxIn(COutPoint(tx2.sha256, 0), nSequence=sequence_value)]
|
||||||
tx3.vout = [CTxOut(int(tx2.vout[0].nValue - self.relayfee * COIN), CScript([b'a' * 35]))]
|
tx3.vout = [CTxOut(int(tx2.vout[0].nValue - self.relayfee * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx3.rehash()
|
tx3.rehash()
|
||||||
|
|
||||||
assert_raises_rpc_error(-26, NOT_FINAL_ERROR, self.nodes[0].sendrawtransaction, ToHex(tx3))
|
assert_raises_rpc_error(-26, NOT_FINAL_ERROR, self.nodes[0].sendrawtransaction, ToHex(tx3))
|
||||||
|
@ -10,13 +10,14 @@ from test_framework.messages import COIN, COutPoint, CTransaction, CTxIn, CTxOut
|
|||||||
from test_framework.script import CScript, OP_DROP
|
from test_framework.script import CScript, OP_DROP
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal, assert_raises_rpc_error, satoshi_round
|
from test_framework.util import assert_equal, assert_raises_rpc_error, satoshi_round
|
||||||
|
from test_framework.script_util import DUMMY_P2WPKH_SCRIPT
|
||||||
|
|
||||||
MAX_REPLACEMENT_LIMIT = 100
|
MAX_REPLACEMENT_LIMIT = 100
|
||||||
|
|
||||||
def txToHex(tx):
|
def txToHex(tx):
|
||||||
return tx.serialize().hex()
|
return tx.serialize().hex()
|
||||||
|
|
||||||
def make_utxo(node, amount, confirmed=True, scriptPubKey=CScript([1])):
|
def make_utxo(node, amount, confirmed=True, scriptPubKey=DUMMY_P2WPKH_SCRIPT):
|
||||||
"""Create a txout with a given amount and scriptPubKey
|
"""Create a txout with a given amount and scriptPubKey
|
||||||
|
|
||||||
Mines coins as needed.
|
Mines coins as needed.
|
||||||
@ -65,7 +66,6 @@ def make_utxo(node, amount, confirmed=True, scriptPubKey=CScript([1])):
|
|||||||
class ReplaceByFeeTest(BitcoinTestFramework):
|
class ReplaceByFeeTest(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
# TODO remove output type argument and fix resulting "tx-size-small" errors
|
|
||||||
self.extra_args = [
|
self.extra_args = [
|
||||||
[
|
[
|
||||||
"-acceptnonstdtxn=1",
|
"-acceptnonstdtxn=1",
|
||||||
@ -74,7 +74,6 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
"-limitancestorsize=101",
|
"-limitancestorsize=101",
|
||||||
"-limitdescendantcount=200",
|
"-limitdescendantcount=200",
|
||||||
"-limitdescendantsize=101",
|
"-limitdescendantsize=101",
|
||||||
"-addresstype=p2sh-segwit",
|
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -133,7 +132,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx1a = CTransaction()
|
tx1a = CTransaction()
|
||||||
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
tx1a.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1a_hex = txToHex(tx1a)
|
tx1a_hex = txToHex(tx1a)
|
||||||
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
||||||
|
|
||||||
@ -142,7 +141,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Should fail because we haven't changed the fee
|
# Should fail because we haven't changed the fee
|
||||||
tx1b = CTransaction()
|
tx1b = CTransaction()
|
||||||
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
tx1b.vout = [CTxOut(1 * COIN, CScript([b'b' * 35]))]
|
tx1b.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT + b'a')]
|
||||||
tx1b_hex = txToHex(tx1b)
|
tx1b_hex = txToHex(tx1b)
|
||||||
|
|
||||||
# This will raise an exception due to insufficient fee
|
# This will raise an exception due to insufficient fee
|
||||||
@ -151,7 +150,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Extra 0.1 BTC fee
|
# Extra 0.1 BTC fee
|
||||||
tx1b = CTransaction()
|
tx1b = CTransaction()
|
||||||
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
tx1b.vout = [CTxOut(int(0.9 * COIN), CScript([b'b' * 35]))]
|
tx1b.vout = [CTxOut(int(0.9 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1b_hex = txToHex(tx1b)
|
tx1b_hex = txToHex(tx1b)
|
||||||
# Works when enabled
|
# Works when enabled
|
||||||
tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, 0)
|
tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, 0)
|
||||||
@ -186,7 +185,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# child fees - 40 BTC - so this attempt is rejected.
|
# child fees - 40 BTC - so this attempt is rejected.
|
||||||
dbl_tx = CTransaction()
|
dbl_tx = CTransaction()
|
||||||
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
dbl_tx.vout = [CTxOut(initial_nValue - 30 * COIN, CScript([1] * 35))]
|
dbl_tx.vout = [CTxOut(initial_nValue - 30 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
dbl_tx_hex = txToHex(dbl_tx)
|
dbl_tx_hex = txToHex(dbl_tx)
|
||||||
|
|
||||||
# This will raise an exception due to insufficient fee
|
# This will raise an exception due to insufficient fee
|
||||||
@ -195,7 +194,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Accepted with sufficient fee
|
# Accepted with sufficient fee
|
||||||
dbl_tx = CTransaction()
|
dbl_tx = CTransaction()
|
||||||
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
dbl_tx.vout = [CTxOut(1 * COIN, CScript([1] * 35))]
|
dbl_tx.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
dbl_tx_hex = txToHex(dbl_tx)
|
dbl_tx_hex = txToHex(dbl_tx)
|
||||||
self.nodes[0].sendrawtransaction(dbl_tx_hex, 0)
|
self.nodes[0].sendrawtransaction(dbl_tx_hex, 0)
|
||||||
|
|
||||||
@ -248,7 +247,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Attempt double-spend, will fail because too little fee paid
|
# Attempt double-spend, will fail because too little fee paid
|
||||||
dbl_tx = CTransaction()
|
dbl_tx = CTransaction()
|
||||||
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
dbl_tx.vout = [CTxOut(initial_nValue - fee * n, CScript([1] * 35))]
|
dbl_tx.vout = [CTxOut(initial_nValue - fee * n, DUMMY_P2WPKH_SCRIPT)]
|
||||||
dbl_tx_hex = txToHex(dbl_tx)
|
dbl_tx_hex = txToHex(dbl_tx)
|
||||||
# This will raise an exception due to insufficient fee
|
# This will raise an exception due to insufficient fee
|
||||||
assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0)
|
assert_raises_rpc_error(-26, "insufficient fee", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0)
|
||||||
@ -256,7 +255,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# 1 BTC fee is enough
|
# 1 BTC fee is enough
|
||||||
dbl_tx = CTransaction()
|
dbl_tx = CTransaction()
|
||||||
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
dbl_tx.vout = [CTxOut(initial_nValue - fee * n - 1 * COIN, CScript([1] * 35))]
|
dbl_tx.vout = [CTxOut(initial_nValue - fee * n - 1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
dbl_tx_hex = txToHex(dbl_tx)
|
dbl_tx_hex = txToHex(dbl_tx)
|
||||||
self.nodes[0].sendrawtransaction(dbl_tx_hex, 0)
|
self.nodes[0].sendrawtransaction(dbl_tx_hex, 0)
|
||||||
|
|
||||||
@ -276,7 +275,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
dbl_tx = CTransaction()
|
dbl_tx = CTransaction()
|
||||||
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
dbl_tx.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
dbl_tx.vout = [CTxOut(initial_nValue - 2 * fee * n, CScript([1] * 35))]
|
dbl_tx.vout = [CTxOut(initial_nValue - 2 * fee * n, DUMMY_P2WPKH_SCRIPT)]
|
||||||
dbl_tx_hex = txToHex(dbl_tx)
|
dbl_tx_hex = txToHex(dbl_tx)
|
||||||
# This will raise an exception
|
# This will raise an exception
|
||||||
assert_raises_rpc_error(-26, "too many potential replacements", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0)
|
assert_raises_rpc_error(-26, "too many potential replacements", self.nodes[0].sendrawtransaction, dbl_tx_hex, 0)
|
||||||
@ -291,7 +290,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx1a = CTransaction()
|
tx1a = CTransaction()
|
||||||
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
tx1a.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1a_hex = txToHex(tx1a)
|
tx1a_hex = txToHex(tx1a)
|
||||||
self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
||||||
|
|
||||||
@ -312,7 +311,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx1a = CTransaction()
|
tx1a = CTransaction()
|
||||||
tx1a.vin = [CTxIn(utxo1, nSequence=0)]
|
tx1a.vin = [CTxIn(utxo1, nSequence=0)]
|
||||||
tx1a.vout = [CTxOut(int(1.1 * COIN), CScript([b'a' * 35]))]
|
tx1a.vout = [CTxOut(int(1.1 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1a_hex = txToHex(tx1a)
|
tx1a_hex = txToHex(tx1a)
|
||||||
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
||||||
|
|
||||||
@ -331,7 +330,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Spend tx1a's output to test the indirect case.
|
# Spend tx1a's output to test the indirect case.
|
||||||
tx1b = CTransaction()
|
tx1b = CTransaction()
|
||||||
tx1b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)]
|
tx1b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)]
|
||||||
tx1b.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx1b.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1b_hex = txToHex(tx1b)
|
tx1b_hex = txToHex(tx1b)
|
||||||
tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, 0)
|
tx1b_txid = self.nodes[0].sendrawtransaction(tx1b_hex, 0)
|
||||||
tx1b_txid = int(tx1b_txid, 16)
|
tx1b_txid = int(tx1b_txid, 16)
|
||||||
@ -352,7 +351,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx1 = CTransaction()
|
tx1 = CTransaction()
|
||||||
tx1.vin = [CTxIn(confirmed_utxo)]
|
tx1.vin = [CTxIn(confirmed_utxo)]
|
||||||
tx1.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx1.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1_hex = txToHex(tx1)
|
tx1_hex = txToHex(tx1)
|
||||||
self.nodes[0].sendrawtransaction(tx1_hex, 0)
|
self.nodes[0].sendrawtransaction(tx1_hex, 0)
|
||||||
|
|
||||||
@ -391,7 +390,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
for i in range(MAX_REPLACEMENT_LIMIT+1):
|
for i in range(MAX_REPLACEMENT_LIMIT+1):
|
||||||
tx_i = CTransaction()
|
tx_i = CTransaction()
|
||||||
tx_i.vin = [CTxIn(COutPoint(txid, i), nSequence=0)]
|
tx_i.vin = [CTxIn(COutPoint(txid, i), nSequence=0)]
|
||||||
tx_i.vout = [CTxOut(split_value - fee, CScript([b'a' * 35]))]
|
tx_i.vout = [CTxOut(split_value - fee, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx_i_hex = txToHex(tx_i)
|
tx_i_hex = txToHex(tx_i)
|
||||||
self.nodes[0].sendrawtransaction(tx_i_hex, 0)
|
self.nodes[0].sendrawtransaction(tx_i_hex, 0)
|
||||||
|
|
||||||
@ -424,7 +423,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Create a non-opting in transaction
|
# Create a non-opting in transaction
|
||||||
tx1a = CTransaction()
|
tx1a = CTransaction()
|
||||||
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0xffffffff)]
|
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0xffffffff)]
|
||||||
tx1a.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1a_hex = txToHex(tx1a)
|
tx1a_hex = txToHex(tx1a)
|
||||||
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
||||||
|
|
||||||
@ -434,7 +433,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Shouldn't be able to double-spend
|
# Shouldn't be able to double-spend
|
||||||
tx1b = CTransaction()
|
tx1b = CTransaction()
|
||||||
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
tx1b.vout = [CTxOut(int(0.9 * COIN), CScript([b'b' * 35]))]
|
tx1b.vout = [CTxOut(int(0.9 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1b_hex = txToHex(tx1b)
|
tx1b_hex = txToHex(tx1b)
|
||||||
|
|
||||||
# This will raise an exception
|
# This will raise an exception
|
||||||
@ -445,14 +444,14 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
# Create a different non-opting in transaction
|
# Create a different non-opting in transaction
|
||||||
tx2a = CTransaction()
|
tx2a = CTransaction()
|
||||||
tx2a.vin = [CTxIn(tx1_outpoint, nSequence=0xfffffffe)]
|
tx2a.vin = [CTxIn(tx1_outpoint, nSequence=0xfffffffe)]
|
||||||
tx2a.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx2a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx2a_hex = txToHex(tx2a)
|
tx2a_hex = txToHex(tx2a)
|
||||||
tx2a_txid = self.nodes[0].sendrawtransaction(tx2a_hex, 0)
|
tx2a_txid = self.nodes[0].sendrawtransaction(tx2a_hex, 0)
|
||||||
|
|
||||||
# Still shouldn't be able to double-spend
|
# Still shouldn't be able to double-spend
|
||||||
tx2b = CTransaction()
|
tx2b = CTransaction()
|
||||||
tx2b.vin = [CTxIn(tx1_outpoint, nSequence=0)]
|
tx2b.vin = [CTxIn(tx1_outpoint, nSequence=0)]
|
||||||
tx2b.vout = [CTxOut(int(0.9 * COIN), CScript([b'b' * 35]))]
|
tx2b.vout = [CTxOut(int(0.9 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx2b_hex = txToHex(tx2b)
|
tx2b_hex = txToHex(tx2b)
|
||||||
|
|
||||||
# This will raise an exception
|
# This will raise an exception
|
||||||
@ -478,12 +477,12 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx3b = CTransaction()
|
tx3b = CTransaction()
|
||||||
tx3b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)]
|
tx3b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)]
|
||||||
tx3b.vout = [CTxOut(int(0.5 * COIN), CScript([b'e' * 35]))]
|
tx3b.vout = [CTxOut(int(0.5 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx3b_hex = txToHex(tx3b)
|
tx3b_hex = txToHex(tx3b)
|
||||||
|
|
||||||
tx3c = CTransaction()
|
tx3c = CTransaction()
|
||||||
tx3c.vin = [CTxIn(COutPoint(tx2a_txid, 0), nSequence=0)]
|
tx3c.vin = [CTxIn(COutPoint(tx2a_txid, 0), nSequence=0)]
|
||||||
tx3c.vout = [CTxOut(int(0.5 * COIN), CScript([b'f' * 35]))]
|
tx3c.vout = [CTxOut(int(0.5 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx3c_hex = txToHex(tx3c)
|
tx3c_hex = txToHex(tx3c)
|
||||||
|
|
||||||
self.nodes[0].sendrawtransaction(tx3b_hex, 0)
|
self.nodes[0].sendrawtransaction(tx3b_hex, 0)
|
||||||
@ -500,7 +499,7 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx1a = CTransaction()
|
tx1a = CTransaction()
|
||||||
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||||
tx1a.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx1a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx1a_hex = txToHex(tx1a)
|
tx1a_hex = txToHex(tx1a)
|
||||||
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, 0)
|
||||||
|
|
||||||
@ -526,14 +525,14 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
tx2a = CTransaction()
|
tx2a = CTransaction()
|
||||||
tx2a.vin = [CTxIn(tx1_outpoint, nSequence=0)]
|
tx2a.vin = [CTxIn(tx1_outpoint, nSequence=0)]
|
||||||
tx2a.vout = [CTxOut(1 * COIN, CScript([b'a' * 35]))]
|
tx2a.vout = [CTxOut(1 * COIN, DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx2a_hex = txToHex(tx2a)
|
tx2a_hex = txToHex(tx2a)
|
||||||
self.nodes[0].sendrawtransaction(tx2a_hex, 0)
|
self.nodes[0].sendrawtransaction(tx2a_hex, 0)
|
||||||
|
|
||||||
# Lower fee, but we'll prioritise it
|
# Lower fee, but we'll prioritise it
|
||||||
tx2b = CTransaction()
|
tx2b = CTransaction()
|
||||||
tx2b.vin = [CTxIn(tx1_outpoint, nSequence=0)]
|
tx2b.vin = [CTxIn(tx1_outpoint, nSequence=0)]
|
||||||
tx2b.vout = [CTxOut(int(1.01 * COIN), CScript([b'a' * 35]))]
|
tx2b.vout = [CTxOut(int(1.01 * COIN), DUMMY_P2WPKH_SCRIPT)]
|
||||||
tx2b.rehash()
|
tx2b.rehash()
|
||||||
tx2b_hex = txToHex(tx2b)
|
tx2b_hex = txToHex(tx2b)
|
||||||
|
|
||||||
|
25
test/functional/test_framework/script_util.py
Executable file
25
test/functional/test_framework/script_util.py
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2019 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
"""Useful Script constants and utils."""
|
||||||
|
from test_framework.script import CScript
|
||||||
|
|
||||||
|
# To prevent a "tx-size-small" policy rule error, a transaction has to have a
|
||||||
|
# non-witness size of at least 82 bytes (MIN_STANDARD_TX_NONWITNESS_SIZE in
|
||||||
|
# src/policy/policy.h). Considering a Tx with the smallest possible single
|
||||||
|
# input (blank, empty scriptSig), and with an output omitting the scriptPubKey,
|
||||||
|
# we get to a minimum size of 60 bytes:
|
||||||
|
#
|
||||||
|
# Tx Skeleton: 4 [Version] + 1 [InCount] + 1 [OutCount] + 4 [LockTime] = 10 bytes
|
||||||
|
# Blank Input: 32 [PrevTxHash] + 4 [Index] + 1 [scriptSigLen] + 4 [SeqNo] = 41 bytes
|
||||||
|
# Output: 8 [Amount] + 1 [scriptPubKeyLen] = 9 bytes
|
||||||
|
#
|
||||||
|
# Hence, the scriptPubKey of the single output has to have a size of at
|
||||||
|
# least 22 bytes, which corresponds to the size of a P2WPKH scriptPubKey.
|
||||||
|
# The following script constant consists of a single push of 21 bytes of 'a':
|
||||||
|
# <PUSH_21> <21-bytes of 'a'>
|
||||||
|
# resulting in a 22-byte size. It should be used whenever (small) fake
|
||||||
|
# scriptPubKeys are needed, to guarantee that the minimum transaction size is
|
||||||
|
# met.
|
||||||
|
DUMMY_P2WPKH_SCRIPT = CScript([b'a' * 21])
|
Loading…
Reference in New Issue
Block a user