mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 10:38:42 +01:00
test: check for block reject reasons in p2p_segwit.py [2/2]
This commit adds specific expected reject reasons for segwit blocks sent to the node, that are only showing up if one script threads is used. For this reason, the node is started with the parameter `-par=1`.
This commit is contained in:
parent
4eb532ff8b
commit
45827fd718
@ -198,7 +198,7 @@ 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", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}", "-whitelist=noban@127.0.0.1"],
|
||||
["-acceptnonstdtxn=1", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}", "-whitelist=noban@127.0.0.1", "-par=1"],
|
||||
["-acceptnonstdtxn=0", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}"],
|
||||
]
|
||||
self.supports_cli = False
|
||||
@ -509,8 +509,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
# 'block-validation-failed' (if script check threads > 1) or
|
||||
# 'non-mandatory-script-verify-flag (Witness program was passed an
|
||||
# empty witness)' (otherwise).
|
||||
# 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,
|
||||
reason='non-mandatory-script-verify-flag (Witness program was passed an empty witness)')
|
||||
|
||||
self.utxo.pop(0)
|
||||
self.utxo.append(UTXO(txid, 2, value))
|
||||
@ -993,7 +993,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
self.update_witness_block_with_transactions(block, [tx])
|
||||
|
||||
# Extra witness data should not be allowed.
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Witness provided for non-witness script)')
|
||||
|
||||
# Try extra signature data. Ok if we're not spending a witness output.
|
||||
block.vtx[1].wit.vtxinwit = []
|
||||
@ -1018,7 +1019,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
self.update_witness_block_with_transactions(block, [tx2])
|
||||
|
||||
# This has extra witness data, so it should fail.
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Stack size must be exactly one after execution)')
|
||||
|
||||
# Now get rid of the extra witness, but add extra scriptSig data
|
||||
tx2.vin[0].scriptSig = CScript([OP_TRUE])
|
||||
@ -1030,7 +1032,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
block.solve()
|
||||
|
||||
# This has extra signature data for a witness input, so it should fail.
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Witness requires empty scriptSig)')
|
||||
|
||||
# Now get rid of the extra scriptsig on the witness input, and verify
|
||||
# success (even with extra scriptsig data in the non-witness input)
|
||||
@ -1068,7 +1071,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
tx2.rehash()
|
||||
|
||||
self.update_witness_block_with_transactions(block, [tx, tx2])
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Push value size limit exceeded)')
|
||||
|
||||
# Now reduce the length of the stack element
|
||||
tx2.wit.vtxinwit[0].scriptWitness.stack[0] = b'a' * (MAX_SCRIPT_ELEMENT_SIZE)
|
||||
@ -1108,7 +1112,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
|
||||
self.update_witness_block_with_transactions(block, [tx, tx2])
|
||||
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Script is too big)')
|
||||
|
||||
# Try again with one less byte in the witness script
|
||||
witness_script = CScript([b'a' * MAX_SCRIPT_ELEMENT_SIZE] * 19 + [OP_DROP] * 62 + [OP_TRUE])
|
||||
@ -1188,6 +1193,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
|
||||
block.vtx = [block.vtx[0]]
|
||||
self.update_witness_block_with_transactions(block, [tx2])
|
||||
# This block doesn't result in a specific reject reason, but an iostream exception:
|
||||
# "Exception 'CDataStream::read(): end of data: unspecified iostream_category error' (...) caught"
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
|
||||
# Now make one of the intermediate witnesses be incorrect
|
||||
@ -1197,7 +1204,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
|
||||
block.vtx = [block.vtx[0]]
|
||||
self.update_witness_block_with_transactions(block, [tx2])
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Operation not valid with the current stack size)')
|
||||
|
||||
# Fix the broken witness and the block should be accepted.
|
||||
tx2.wit.vtxinwit[5].scriptWitness.stack = [b'a', witness_script]
|
||||
@ -1568,13 +1576,17 @@ class SegWitTest(BitcoinTestFramework):
|
||||
# Too-large input value
|
||||
sign_p2pk_witness_input(witness_script, tx, 0, hashtype, prev_utxo.nValue + 1, key)
|
||||
self.update_witness_block_with_transactions(block, [tx])
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Script evaluated without error '
|
||||
'but finished with a false/empty top stack element')
|
||||
|
||||
# Too-small input value
|
||||
sign_p2pk_witness_input(witness_script, tx, 0, hashtype, prev_utxo.nValue - 1, key)
|
||||
block.vtx.pop() # remove last tx
|
||||
self.update_witness_block_with_transactions(block, [tx])
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Script evaluated without error '
|
||||
'but finished with a false/empty top stack element')
|
||||
|
||||
# Now try correct value
|
||||
sign_p2pk_witness_input(witness_script, tx, 0, hashtype, prev_utxo.nValue, key)
|
||||
@ -1676,7 +1688,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
tx2.vin[0].scriptSig = CScript([signature, pubkey])
|
||||
block = self.build_next_block()
|
||||
self.update_witness_block_with_transactions(block, [tx, tx2])
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False)
|
||||
test_witness_block(self.nodes[0], self.test_node, block, accepted=False,
|
||||
reason='non-mandatory-script-verify-flag (Witness requires empty scriptSig)')
|
||||
|
||||
# Move the signature to the witness.
|
||||
block.vtx.pop()
|
||||
|
Loading…
Reference in New Issue
Block a user