Skip to content

Commit d2c9fc8

Browse files
committed
Merge bitcoin/bitcoin#32533: test: properly check for per-tx sigops limit
7bc64a8 test: properly check for per-tx sigops limit (Sebastian Falbesoner) Pull request description: 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. ```diff diff --git a/src/policy/policy.h b/src/policy/policy.h index 2151ec1..e5766d2a55 100644 --- a/src/policy/policy.h +++ b/src/policy/policy.h @@ -37,7 +37,7 @@ static constexpr unsigned int MIN_STANDARD_TX_NONWITNESS_SIZE{65}; /** Maximum number of signature check operations in an IsStandard() P2SH script */ static constexpr unsigned int MAX_P2SH_SIGOPS{15}; /** The maximum number of sigops we're willing to relay/mine in a single tx */ -static constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST{MAX_BLOCK_SIGOPS_COST/5}; +static constexpr unsigned int MAX_STANDARD_TX_SIGOPS_COST{MAX_BLOCK_SIGOPS_COST/5 + 4}; /** Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or replacement **/ static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE{1000}; /** Default for -bytespersigop */ diff --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](https://github.com/bitcoin/bips/blob/master/bip-0054.md) draft and related preparatory PRs like #32521). ACKs for top commit: fjahr: tACK 7bc64a8 tapcrafter: tACK 7bc64a8 darosior: ACK 7bc64a8 instagibbs: crACK 7bc64a8 Tree-SHA512: 1365409349664a76a1d46b2fa358c0d0609fb17fffdd549423d22b61749481282c928be3c2fb428725735c82d319b4279f703bde01e94e4aec14bab206abb8cf
2 parents 35bf3f8 + 7bc64a8 commit d2c9fc8

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

test/functional/data/invalid_txs.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@
3030
MAX_MONEY,
3131
SEQUENCE_FINAL,
3232
)
33-
from test_framework.blocktools import create_tx_with_script, MAX_BLOCK_SIGOPS
33+
from test_framework.blocktools import (
34+
create_tx_with_script,
35+
MAX_BLOCK_SIGOPS,
36+
MAX_STANDARD_TX_SIGOPS,
37+
)
3438
from test_framework.script import (
3539
CScript,
3640
OP_0,
@@ -233,7 +237,7 @@ def get_tx(self):
233237
amount=(self.spend_avail // 2))
234238

235239

236-
class TooManySigops(BadTxTemplate):
240+
class TooManySigopsPerBlock(BadTxTemplate):
237241
reject_reason = "bad-txns-too-many-sigops"
238242
block_reject_reason = "bad-blk-sigops, out-of-bounds SigOpCount"
239243
expect_disconnect = False
@@ -245,6 +249,20 @@ def get_tx(self):
245249
output_script=lotsa_checksigs,
246250
amount=1)
247251

252+
253+
class TooManySigopsPerTransaction(BadTxTemplate):
254+
reject_reason = "bad-txns-too-many-sigops"
255+
expect_disconnect = False
256+
valid_in_block = True
257+
258+
def get_tx(self):
259+
lotsa_checksigs = CScript([OP_CHECKSIG] * (MAX_STANDARD_TX_SIGOPS + 1))
260+
return create_tx_with_script(
261+
self.spend_tx, 0,
262+
output_script=lotsa_checksigs,
263+
amount=1)
264+
265+
248266
def getDisabledOpcodeTemplate(opcode):
249267
""" Creates disabled opcode tx template class"""
250268
def get_tx(self):

test/functional/test_framework/blocktools.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949

5050
MAX_BLOCK_SIGOPS = 20000
5151
MAX_BLOCK_SIGOPS_WEIGHT = MAX_BLOCK_SIGOPS * WITNESS_SCALE_FACTOR
52+
MAX_STANDARD_TX_SIGOPS = 4000
5253
MAX_STANDARD_TX_WEIGHT = 400000
5354

5455
# Genesis block time (regtest)

0 commit comments

Comments
 (0)