|
|
@ -70,7 +70,6 @@ class TestNode(NodeConnCB): |
|
|
|
|
|
|
|
|
|
|
|
def on_reject(self, conn, message): |
|
|
|
def on_reject(self, conn, message): |
|
|
|
self.last_reject = message |
|
|
|
self.last_reject = message |
|
|
|
#print (message) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Syncing helpers |
|
|
|
# Syncing helpers |
|
|
|
def sync(self, test_function, timeout=60): |
|
|
|
def sync(self, test_function, timeout=60): |
|
|
@ -224,7 +223,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
''' Individual tests ''' |
|
|
|
''' Individual tests ''' |
|
|
|
def test_witness_services(self): |
|
|
|
def test_witness_services(self): |
|
|
|
print("\tVerifying NODE_WITNESS service bit") |
|
|
|
self.log.info("Verifying NODE_WITNESS service bit") |
|
|
|
assert((self.test_node.connection.nServices & NODE_WITNESS) != 0) |
|
|
|
assert((self.test_node.connection.nServices & NODE_WITNESS) != 0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -233,7 +232,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
def test_non_witness_transaction(self): |
|
|
|
def test_non_witness_transaction(self): |
|
|
|
# Mine a block with an anyone-can-spend coinbase, |
|
|
|
# Mine a block with an anyone-can-spend coinbase, |
|
|
|
# let it mature, then try to spend it. |
|
|
|
# let it mature, then try to spend it. |
|
|
|
print("\tTesting non-witness transaction") |
|
|
|
self.log.info("Testing non-witness transaction") |
|
|
|
block = self.build_next_block(nVersion=1) |
|
|
|
block = self.build_next_block(nVersion=1) |
|
|
|
block.solve() |
|
|
|
block.solve() |
|
|
|
self.test_node.send_message(msg_block(block)) |
|
|
|
self.test_node.send_message(msg_block(block)) |
|
|
@ -262,7 +261,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
# Verify that blocks with witnesses are rejected before activation. |
|
|
|
# Verify that blocks with witnesses are rejected before activation. |
|
|
|
def test_unnecessary_witness_before_segwit_activation(self): |
|
|
|
def test_unnecessary_witness_before_segwit_activation(self): |
|
|
|
print("\tTesting behavior of unnecessary witnesses") |
|
|
|
self.log.info("Testing behavior of unnecessary witnesses") |
|
|
|
# For now, rely on earlier tests to have created at least one utxo for |
|
|
|
# For now, rely on earlier tests to have created at least one utxo for |
|
|
|
# us to use |
|
|
|
# us to use |
|
|
|
assert(len(self.utxo) > 0) |
|
|
|
assert(len(self.utxo) > 0) |
|
|
@ -389,7 +388,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
# This test can only be run after segwit has activated |
|
|
|
# This test can only be run after segwit has activated |
|
|
|
def test_witness_commitments(self): |
|
|
|
def test_witness_commitments(self): |
|
|
|
print("\tTesting witness commitments") |
|
|
|
self.log.info("Testing witness commitments") |
|
|
|
|
|
|
|
|
|
|
|
# First try a correct witness commitment. |
|
|
|
# First try a correct witness commitment. |
|
|
|
block = self.build_next_block() |
|
|
|
block = self.build_next_block() |
|
|
@ -478,7 +477,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_block_malleability(self): |
|
|
|
def test_block_malleability(self): |
|
|
|
print("\tTesting witness block malleability") |
|
|
|
self.log.info("Testing witness block malleability") |
|
|
|
|
|
|
|
|
|
|
|
# Make sure that a block that has too big a virtual size |
|
|
|
# Make sure that a block that has too big a virtual size |
|
|
|
# because of a too-large coinbase witness is not permanently |
|
|
|
# because of a too-large coinbase witness is not permanently |
|
|
@ -519,7 +518,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_witness_block_size(self): |
|
|
|
def test_witness_block_size(self): |
|
|
|
print("\tTesting witness block size limit") |
|
|
|
self.log.info("Testing witness block size limit") |
|
|
|
# TODO: Test that non-witness carrying blocks can't exceed 1MB |
|
|
|
# TODO: Test that non-witness carrying blocks can't exceed 1MB |
|
|
|
# Skipping this test for now; this is covered in p2p-fullblocktest.py |
|
|
|
# Skipping this test for now; this is covered in p2p-fullblocktest.py |
|
|
|
|
|
|
|
|
|
|
@ -636,7 +635,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
# Consensus tests of extra witness data in a transaction. |
|
|
|
# Consensus tests of extra witness data in a transaction. |
|
|
|
def test_extra_witness_data(self): |
|
|
|
def test_extra_witness_data(self): |
|
|
|
print("\tTesting extra witness data in tx") |
|
|
|
self.log.info("Testing extra witness data in tx") |
|
|
|
|
|
|
|
|
|
|
|
assert(len(self.utxo) > 0) |
|
|
|
assert(len(self.utxo) > 0) |
|
|
|
|
|
|
|
|
|
|
@ -712,7 +711,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
def test_max_witness_push_length(self): |
|
|
|
def test_max_witness_push_length(self): |
|
|
|
''' Should only allow up to 520 byte pushes in witness stack ''' |
|
|
|
''' Should only allow up to 520 byte pushes in witness stack ''' |
|
|
|
print("\tTesting maximum witness push size") |
|
|
|
self.log.info("Testing maximum witness push size") |
|
|
|
MAX_SCRIPT_ELEMENT_SIZE = 520 |
|
|
|
MAX_SCRIPT_ELEMENT_SIZE = 520 |
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
|
|
|
|
|
|
|
@ -752,7 +751,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
def test_max_witness_program_length(self): |
|
|
|
def test_max_witness_program_length(self): |
|
|
|
# Can create witness outputs that are long, but can't be greater than |
|
|
|
# Can create witness outputs that are long, but can't be greater than |
|
|
|
# 10k bytes to successfully spend |
|
|
|
# 10k bytes to successfully spend |
|
|
|
print("\tTesting maximum witness program length") |
|
|
|
self.log.info("Testing maximum witness program length") |
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
MAX_PROGRAM_LENGTH = 10000 |
|
|
|
MAX_PROGRAM_LENGTH = 10000 |
|
|
|
|
|
|
|
|
|
|
@ -801,7 +800,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
def test_witness_input_length(self): |
|
|
|
def test_witness_input_length(self): |
|
|
|
''' Ensure that vin length must match vtxinwit length ''' |
|
|
|
''' Ensure that vin length must match vtxinwit length ''' |
|
|
|
print("\tTesting witness input length") |
|
|
|
self.log.info("Testing witness input length") |
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
|
|
|
|
|
|
|
|
witness_program = CScript([OP_DROP, OP_TRUE]) |
|
|
|
witness_program = CScript([OP_DROP, OP_TRUE]) |
|
|
@ -884,7 +883,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_witness_tx_relay_before_segwit_activation(self): |
|
|
|
def test_witness_tx_relay_before_segwit_activation(self): |
|
|
|
print("\tTesting relay of witness transactions") |
|
|
|
self.log.info("Testing relay of witness transactions") |
|
|
|
# Generate a transaction that doesn't require a witness, but send it |
|
|
|
# Generate a transaction that doesn't require a witness, but send it |
|
|
|
# with a witness. Should be rejected for premature-witness, but should |
|
|
|
# with a witness. Should be rejected for premature-witness, but should |
|
|
|
# not be added to recently rejected list. |
|
|
|
# not be added to recently rejected list. |
|
|
@ -908,7 +907,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# a witness transaction ought not result in a getdata. |
|
|
|
# a witness transaction ought not result in a getdata. |
|
|
|
try: |
|
|
|
try: |
|
|
|
self.test_node.announce_tx_and_wait_for_getdata(tx, timeout=2) |
|
|
|
self.test_node.announce_tx_and_wait_for_getdata(tx, timeout=2) |
|
|
|
print("Error: duplicate tx getdata!") |
|
|
|
self.log.error("Error: duplicate tx getdata!") |
|
|
|
assert(False) |
|
|
|
assert(False) |
|
|
|
except AssertionError as e: |
|
|
|
except AssertionError as e: |
|
|
|
pass |
|
|
|
pass |
|
|
@ -936,7 +935,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# - accepts transactions with valid witnesses |
|
|
|
# - accepts transactions with valid witnesses |
|
|
|
# and that witness transactions are relayed to non-upgraded peers. |
|
|
|
# and that witness transactions are relayed to non-upgraded peers. |
|
|
|
def test_tx_relay_after_segwit_activation(self): |
|
|
|
def test_tx_relay_after_segwit_activation(self): |
|
|
|
print("\tTesting relay of witness transactions") |
|
|
|
self.log.info("Testing relay of witness transactions") |
|
|
|
# Generate a transaction that doesn't require a witness, but send it |
|
|
|
# Generate a transaction that doesn't require a witness, but send it |
|
|
|
# with a witness. Should be rejected because we can't use a witness |
|
|
|
# with a witness. Should be rejected because we can't use a witness |
|
|
|
# when spending a non-witness output. |
|
|
|
# when spending a non-witness output. |
|
|
@ -1025,7 +1024,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# This is true regardless of segwit activation. |
|
|
|
# This is true regardless of segwit activation. |
|
|
|
# Also test that we don't ask for blocks from unupgraded peers |
|
|
|
# Also test that we don't ask for blocks from unupgraded peers |
|
|
|
def test_block_relay(self, segwit_activated): |
|
|
|
def test_block_relay(self, segwit_activated): |
|
|
|
print("\tTesting block relay") |
|
|
|
self.log.info("Testing block relay") |
|
|
|
|
|
|
|
|
|
|
|
blocktype = 2|MSG_WITNESS_FLAG |
|
|
|
blocktype = 2|MSG_WITNESS_FLAG |
|
|
|
|
|
|
|
|
|
|
@ -1113,7 +1112,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
# V0 segwit outputs should be standard after activation, but not before. |
|
|
|
# V0 segwit outputs should be standard after activation, but not before. |
|
|
|
def test_standardness_v0(self, segwit_activated): |
|
|
|
def test_standardness_v0(self, segwit_activated): |
|
|
|
print("\tTesting standardness of v0 outputs (%s activation)" % ("after" if segwit_activated else "before")) |
|
|
|
self.log.info("Testing standardness of v0 outputs (%s activation)" % ("after" if segwit_activated else "before")) |
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
|
|
|
|
|
|
|
|
witness_program = CScript([OP_TRUE]) |
|
|
|
witness_program = CScript([OP_TRUE]) |
|
|
@ -1190,7 +1189,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# Verify that future segwit upgraded transactions are non-standard, |
|
|
|
# Verify that future segwit upgraded transactions are non-standard, |
|
|
|
# but valid in blocks. Can run this before and after segwit activation. |
|
|
|
# but valid in blocks. Can run this before and after segwit activation. |
|
|
|
def test_segwit_versions(self): |
|
|
|
def test_segwit_versions(self): |
|
|
|
print("\tTesting standardness/consensus for segwit versions (0-16)") |
|
|
|
self.log.info("Testing standardness/consensus for segwit versions (0-16)") |
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
NUM_TESTS = 17 # will test OP_0, OP1, ..., OP_16 |
|
|
|
NUM_TESTS = 17 # will test OP_0, OP1, ..., OP_16 |
|
|
|
if (len(self.utxo) < NUM_TESTS): |
|
|
|
if (len(self.utxo) < NUM_TESTS): |
|
|
@ -1274,7 +1273,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_premature_coinbase_witness_spend(self): |
|
|
|
def test_premature_coinbase_witness_spend(self): |
|
|
|
print("\tTesting premature coinbase witness spend") |
|
|
|
self.log.info("Testing premature coinbase witness spend") |
|
|
|
block = self.build_next_block() |
|
|
|
block = self.build_next_block() |
|
|
|
# Change the output of the block to be a witness output. |
|
|
|
# Change the output of the block to be a witness output. |
|
|
|
witness_program = CScript([OP_TRUE]) |
|
|
|
witness_program = CScript([OP_TRUE]) |
|
|
@ -1309,7 +1308,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_signature_version_1(self): |
|
|
|
def test_signature_version_1(self): |
|
|
|
print("\tTesting segwit signature hash version 1") |
|
|
|
self.log.info("Testing segwit signature hash version 1") |
|
|
|
key = CECKey() |
|
|
|
key = CECKey() |
|
|
|
key.set_secretbytes(b"9") |
|
|
|
key.set_secretbytes(b"9") |
|
|
|
pubkey = CPubKey(key.get_pubkey()) |
|
|
|
pubkey = CPubKey(key.get_pubkey()) |
|
|
@ -1491,7 +1490,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
# Test P2SH wrapped witness programs. |
|
|
|
# Test P2SH wrapped witness programs. |
|
|
|
def test_p2sh_witness(self, segwit_activated): |
|
|
|
def test_p2sh_witness(self, segwit_activated): |
|
|
|
print("\tTesting P2SH witness transactions") |
|
|
|
self.log.info("Testing P2SH witness transactions") |
|
|
|
|
|
|
|
|
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
|
|
|
|
|
|
|
@ -1564,7 +1563,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# To enable this test, pass --oldbinary=<path-to-pre-segwit-bitcoind> to |
|
|
|
# To enable this test, pass --oldbinary=<path-to-pre-segwit-bitcoind> to |
|
|
|
# the test. |
|
|
|
# the test. |
|
|
|
def test_upgrade_after_activation(self, node, node_id): |
|
|
|
def test_upgrade_after_activation(self, node, node_id): |
|
|
|
print("\tTesting software upgrade after softfork activation") |
|
|
|
self.log.info("Testing software upgrade after softfork activation") |
|
|
|
|
|
|
|
|
|
|
|
assert(node_id != 0) # node0 is assumed to be a segwit-active bitcoind |
|
|
|
assert(node_id != 0) # node0 is assumed to be a segwit-active bitcoind |
|
|
|
|
|
|
|
|
|
|
@ -1592,7 +1591,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
def test_witness_sigops(self): |
|
|
|
def test_witness_sigops(self): |
|
|
|
'''Ensure sigop counting is correct inside witnesses.''' |
|
|
|
'''Ensure sigop counting is correct inside witnesses.''' |
|
|
|
print("\tTesting sigops limit") |
|
|
|
self.log.info("Testing sigops limit") |
|
|
|
|
|
|
|
|
|
|
|
assert(len(self.utxo)) |
|
|
|
assert(len(self.utxo)) |
|
|
|
|
|
|
|
|
|
|
@ -1694,7 +1693,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# TODO: test p2sh sigop counting |
|
|
|
# TODO: test p2sh sigop counting |
|
|
|
|
|
|
|
|
|
|
|
def test_getblocktemplate_before_lockin(self): |
|
|
|
def test_getblocktemplate_before_lockin(self): |
|
|
|
print("\tTesting getblocktemplate setting of segwit versionbit (before lockin)") |
|
|
|
self.log.info("Testing getblocktemplate setting of segwit versionbit (before lockin)") |
|
|
|
# Node0 is segwit aware, node2 is not. |
|
|
|
# Node0 is segwit aware, node2 is not. |
|
|
|
for node in [self.nodes[0], self.nodes[2]]: |
|
|
|
for node in [self.nodes[0], self.nodes[2]]: |
|
|
|
gbt_results = node.getblocktemplate() |
|
|
|
gbt_results = node.getblocktemplate() |
|
|
@ -1746,7 +1745,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# Uncompressed pubkeys are no longer supported in default relay policy, |
|
|
|
# Uncompressed pubkeys are no longer supported in default relay policy, |
|
|
|
# but (for now) are still valid in blocks. |
|
|
|
# but (for now) are still valid in blocks. |
|
|
|
def test_uncompressed_pubkey(self): |
|
|
|
def test_uncompressed_pubkey(self): |
|
|
|
print("\tTesting uncompressed pubkeys") |
|
|
|
self.log.info("Testing uncompressed pubkeys") |
|
|
|
# Segwit transactions using uncompressed pubkeys are not accepted |
|
|
|
# Segwit transactions using uncompressed pubkeys are not accepted |
|
|
|
# under default policy, but should still pass consensus. |
|
|
|
# under default policy, but should still pass consensus. |
|
|
|
key = CECKey() |
|
|
|
key = CECKey() |
|
|
@ -1848,7 +1847,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
self.utxo.append(UTXO(tx5.sha256, 0, tx5.vout[0].nValue)) |
|
|
|
self.utxo.append(UTXO(tx5.sha256, 0, tx5.vout[0].nValue)) |
|
|
|
|
|
|
|
|
|
|
|
def test_non_standard_witness(self): |
|
|
|
def test_non_standard_witness(self): |
|
|
|
print("\tTesting detection of non-standard P2WSH witness") |
|
|
|
self.log.info("Testing detection of non-standard P2WSH witness") |
|
|
|
pad = chr(1).encode('latin-1') |
|
|
|
pad = chr(1).encode('latin-1') |
|
|
|
|
|
|
|
|
|
|
|
# Create scripts for tests |
|
|
|
# Create scripts for tests |
|
|
@ -1972,7 +1971,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
# Test logic begins here |
|
|
|
# Test logic begins here |
|
|
|
self.test_node.wait_for_verack() |
|
|
|
self.test_node.wait_for_verack() |
|
|
|
|
|
|
|
|
|
|
|
print("\nStarting tests before segwit lock in:") |
|
|
|
self.log.info("Starting tests before segwit lock in:") |
|
|
|
|
|
|
|
|
|
|
|
self.test_witness_services() # Verifies NODE_WITNESS |
|
|
|
self.test_witness_services() # Verifies NODE_WITNESS |
|
|
|
self.test_non_witness_transaction() # non-witness tx's are accepted |
|
|
|
self.test_non_witness_transaction() # non-witness tx's are accepted |
|
|
@ -1987,7 +1986,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
sync_blocks(self.nodes) |
|
|
|
sync_blocks(self.nodes) |
|
|
|
|
|
|
|
|
|
|
|
# At lockin, nothing should change. |
|
|
|
# At lockin, nothing should change. |
|
|
|
print("\nTesting behavior post lockin, pre-activation") |
|
|
|
self.log.info("Testing behavior post lockin, pre-activation") |
|
|
|
self.advance_to_segwit_lockin() |
|
|
|
self.advance_to_segwit_lockin() |
|
|
|
|
|
|
|
|
|
|
|
# Retest unnecessary witnesses |
|
|
|
# Retest unnecessary witnesses |
|
|
@ -2000,7 +1999,7 @@ class SegWitTest(BitcoinTestFramework): |
|
|
|
sync_blocks(self.nodes) |
|
|
|
sync_blocks(self.nodes) |
|
|
|
|
|
|
|
|
|
|
|
# Now activate segwit |
|
|
|
# Now activate segwit |
|
|
|
print("\nTesting behavior after segwit activation") |
|
|
|
self.log.info("Testing behavior after segwit activation") |
|
|
|
self.advance_to_segwit_active() |
|
|
|
self.advance_to_segwit_active() |
|
|
|
|
|
|
|
|
|
|
|
sync_blocks(self.nodes) |
|
|
|
sync_blocks(self.nodes) |
|
|
|