Currently the per-tx sigops limit standardness check (bounded by MAX_STANDARD_TX_SIGOPS_COST
, throwing “bad-txns-too-many-sigops” if exceeded):
https://github.com/bitcoin/bitcoin/blob/3f83c744ac28b700090e15b5dda2260724a56f49/src/validation.cpp#L925-L927
is only indirectly tested with the much higher per-block consensus limit (MAX_BLOCK_SIGOPS_COST
):
https://github.com/bitcoin/bitcoin/blob/3f83c744ac28b700090e15b5dda2260724a56f49/test/functional/data/invalid_txs.py#L236-L242
I.e. an increase in the per-tx limit up to the per-block one would still pass all of our tests. Refine that by splitting up the invalid tx template TooManySigops
in a per-block and a per-tx template.
The involved functional tests taking use of these templates are feature_block.py
and p2p_invalid_txs.py
. Can be tested by applying e.g.
0diff --git a/src/policy/policy.h b/src/policy/policy.h
1index 2151ec13dd..e5766d2a55 100644
2--- a/src/policy/policy.h
3+++ b/src/policy/policy.h
4@@ -37,7 +37,7 @@ static constexpr unsigned int MIN_STANDARD_TX_NONWITNESS_SIZE{65};
5 /** Maximum number of signature check operations in an IsStandard() P2SH script */
6 static constexpr unsigned int MAX_P2SH_SIGOPS{15};
7 /** The maximum number of sigops we're willing to relay/mine in a single tx */
8-static constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST{MAX_BLOCK_SIGOPS_COST/5};
9+static constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST{MAX_BLOCK_SIGOPS_COST/5 + 4};
10 /** Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or replacement **/
11 static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE{1000};
12 /** Default for -bytespersigop */
13diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py
where the tests succeed on master, but fail on this PR.
(Found by diving deeper into the jungle of current sig-ops limit, as preparation for reviewing the BIP 54 draft and related preparatory PRs like #32521).