From 6109bc529e234b464d406495bb9644254ca7fc9e 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 | 18 ++++++++++++++++++ test/functional/feature_block.py | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/test/functional/data/invalid_txs.py b/test/functional/data/invalid_txs.py index d2d7202d860..83bbc5c9ed6 100644 --- a/test/functional/data/invalid_txs.py +++ b/test/functional/data/invalid_txs.py @@ -26,12 +26,14 @@ from test_framework.messages import ( COutPoint, CTransaction, CTxIn, + CTxInWitness, CTxOut, MAX_MONEY, SEQUENCE_FINAL, ) from test_framework.blocktools import create_tx_with_script, MAX_BLOCK_SIGOPS from test_framework.script import ( + OP_TRUE, CScript, OP_0, OP_2DIV, @@ -129,6 +131,22 @@ class SizeTooSmall(BadTxTemplate): tx.calc_sha256() return tx +# reject a transaction that contains a witness +# but doesnt spend a segwit output +class ExtraWitness(BadTxTemplate): + expect_disconnect = False + valid_in_block = False + block_reject_reason = "mandatory-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])] + tx.calc_sha256() + 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 2dfa568c5b6..baf291242d1 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, @@ -1400,6 +1401,9 @@ class FullBlockTest(BitcoinTestFramework): self.add_transactions_to_block(block, new_transactions) old_sha256 = block.sha256 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