validation: Check only MANDATORY_SCRIPT_VERIFY_FLAGS when -acceptnonstdtxn is set

This commit is contained in:
Anthony Towns 2023-03-08 17:58:56 +10:00
parent 3118c2e365
commit affee04f7a
2 changed files with 7 additions and 5 deletions

View file

@ -1094,8 +1094,7 @@ bool MemPoolAccept::PolicyScriptChecks(const ATMPArgs& args, Workspace& ws)
AssertLockHeld(m_pool.cs);
const CTransaction& tx = *ws.m_ptx;
TxValidationState& state = ws.m_state;
constexpr unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS;
const unsigned int scriptVerifyFlags = (m_pool.m_opts.require_standard ? STANDARD_SCRIPT_VERIFY_FLAGS : MANDATORY_SCRIPT_VERIFY_FLAGS);
// Check input scripts and signatures.
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
@ -2198,6 +2197,10 @@ static unsigned int GetBlockScriptFlags(const CBlockIndex& block_index, const Ch
{
const Consensus::Params& consensusparams = chainman.GetConsensus();
// Note that any flags returned from this function (ie, specified
// here or in script_flag_exceptions) must also be included in
// MANDATORY_SCRIPT_VERIFY_FLAGS in policy/policy.h
// BIP16 didn't become active until Apr 1 2012 (on mainnet, and
// retroactively applied to testnet)
// However, only one historical block violated the P2SH rules (on both

View file

@ -1392,9 +1392,8 @@ class SegWitTest(BitcoinTestFramework):
# Now the node will no longer ask for getdata of this transaction when advertised by same txid
self.std_node.announce_tx_and_wait_for_getdata(tx3, success=False)
# Spending a higher version witness output is not allowed by policy,
# even with the node that accepts non-standard txs.
test_transaction_acceptance(self.nodes[0], self.test_node, tx3, with_witness=True, accepted=False, reason="reserved for soft-fork upgrades")
# Spending a higher version witness output is allowed on the node with -acceptnonstdtxn
test_transaction_acceptance(self.nodes[0], self.test_node, tx3, with_witness=True, accepted=True)
# Building a block with the transaction must be valid, however even without -acceptnonstdtxn.
block = self.build_next_block()