diff --git a/src/validation.cpp b/src/validation.cpp index 1213d8be9f9..47bcf457c2c 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1230,8 +1230,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. @@ -2396,6 +2395,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 diff --git a/test/functional/p2p_segwit.py b/test/functional/p2p_segwit.py index 37c2827ba61..3b82b569589 100755 --- a/test/functional/p2p_segwit.py +++ b/test/functional/p2p_segwit.py @@ -1389,14 +1389,13 @@ 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. + # Building a block with the transaction must be valid, however even without -acceptnonstdtxn. block = self.build_next_block() self.update_witness_block_with_transactions(block, [tx2, tx3]) - test_witness_block(self.nodes[0], self.test_node, block, accepted=True) + test_witness_block(self.nodes[1], self.std_node, block, accepted=True) self.sync_blocks() # Add utxo to our list @@ -1477,11 +1476,11 @@ class SegWitTest(BitcoinTestFramework): sign_input_segwitv0(tx2, 0, script, tx.vout[0].nValue, key) # Should fail policy test. - test_transaction_acceptance(self.nodes[0], self.test_node, tx2, True, False, 'non-mandatory-script-verify-flag (Using non-compressed keys in segwit)') + test_transaction_acceptance(self.nodes[1], self.std_node, tx2, True, False, 'non-mandatory-script-verify-flag (Using non-compressed keys in segwit)') # But passes consensus. block = self.build_next_block() self.update_witness_block_with_transactions(block, [tx2]) - test_witness_block(self.nodes[0], self.test_node, block, accepted=True) + test_witness_block(self.nodes[1], self.std_node, block, accepted=True) # Test 2: P2WSH # Try to spend the P2WSH output created in last test. @@ -1496,11 +1495,11 @@ class SegWitTest(BitcoinTestFramework): sign_p2pk_witness_input(witness_script, tx3, 0, SIGHASH_ALL, tx2.vout[0].nValue, key) # Should fail policy test. - test_transaction_acceptance(self.nodes[0], self.test_node, tx3, True, False, 'non-mandatory-script-verify-flag (Using non-compressed keys in segwit)') + test_transaction_acceptance(self.nodes[1], self.std_node, tx3, True, False, 'non-mandatory-script-verify-flag (Using non-compressed keys in segwit)') # But passes consensus. block = self.build_next_block() self.update_witness_block_with_transactions(block, [tx3]) - test_witness_block(self.nodes[0], self.test_node, block, accepted=True) + test_witness_block(self.nodes[1], self.std_node, block, accepted=True) # Test 3: P2SH(P2WSH) # Try to spend the P2SH output created in the last test. @@ -1513,10 +1512,10 @@ class SegWitTest(BitcoinTestFramework): sign_p2pk_witness_input(witness_script, tx4, 0, SIGHASH_ALL, tx3.vout[0].nValue, key) # Should fail policy test. - test_transaction_acceptance(self.nodes[0], self.test_node, tx4, True, False, 'non-mandatory-script-verify-flag (Using non-compressed keys in segwit)') + test_transaction_acceptance(self.nodes[1], self.std_node, tx4, True, False, 'non-mandatory-script-verify-flag (Using non-compressed keys in segwit)') block = self.build_next_block() self.update_witness_block_with_transactions(block, [tx4]) - test_witness_block(self.nodes[0], self.test_node, block, accepted=True) + test_witness_block(self.nodes[1], self.std_node, block, accepted=True) # Test 4: Uncompressed pubkeys should still be valid in non-segwit # transactions.