From a7c96f874de13ace9814da92fd6160a126a97ebf Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Fri, 7 Feb 2025 11:46:34 -0600 Subject: [PATCH] tests: Add witness commitment if we have a witness transaction in FullBlockTest.update_block() --- test/functional/data/invalid_txs.py | 16 ++++++++++++++++ test/functional/feature_block.py | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/test/functional/data/invalid_txs.py b/test/functional/data/invalid_txs.py index a7cdcb058fe..4853f8cc009 100644 --- a/test/functional/data/invalid_txs.py +++ b/test/functional/data/invalid_txs.py @@ -26,6 +26,7 @@ from test_framework.messages import ( COutPoint, CTransaction, CTxIn, + CTxInWitness, CTxOut, MAX_MONEY, SEQUENCE_FINAL, @@ -36,6 +37,7 @@ from test_framework.blocktools import ( MAX_STANDARD_TX_SIGOPS, ) from test_framework.script import ( + OP_TRUE, CScript, OP_0, OP_2DIV, @@ -124,6 +126,20 @@ class SizeTooSmall(BadTxTemplate): assert MIN_STANDARD_TX_NONWITNESS_SIZE - 1 == 64 return tx +# reject a transaction that contains a witness +# but doesn't spend a segwit output +class ExtraWitness(BadTxTemplate): + reject_reason = "tx-size-small" + block_reject_reason = "block-script-verify-flag-failed (Witness provided for non-witness script)" + + def get_tx(self): + tx = CTransaction() + tx.vin.append(self.valid_txin) + tx.vout.append(CTxOut(0, CScript())) + tx.wit.vtxinwit = [CTxInWitness()] + tx.wit.vtxinwit[0].scriptWitness.stack = [CScript([OP_TRUE])] + return tx + class BadInputOutpointIndex(BadTxTemplate): # Won't be rejected - nonexistent outpoint index is treated as an orphan since the coins diff --git a/test/functional/feature_block.py b/test/functional/feature_block.py index aa60788fad2..60e6117c83b 100755 --- a/test/functional/feature_block.py +++ b/test/functional/feature_block.py @@ -7,6 +7,7 @@ import copy import time from test_framework.blocktools import ( + add_witness_commitment, create_block, create_coinbase, create_tx_with_script, @@ -1416,6 +1417,9 @@ class FullBlockTest(BitcoinTestFramework): if nTime is not None: block.nTime = nTime block.hashMerkleRoot = block.calc_merkle_root() + has_witness_tx = any(not tx.wit.is_null() for tx in block.vtx) + if has_witness_tx: + add_witness_commitment(block) block.solve() # Update the internal state just like in next_block self.tip = block