Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc-p2p-fullblocktest-sigops.py
Show All 33 Lines | from test_framework.messages import ( | ||||
CTxOut, | CTxOut, | ||||
ser_compact_size, | ser_compact_size, | ||||
) | ) | ||||
from test_framework.mininode import P2PDataStore | from test_framework.mininode import P2PDataStore | ||||
from test_framework.script import ( | from test_framework.script import ( | ||||
CScript, | CScript, | ||||
hash160, | hash160, | ||||
OP_2DUP, | OP_2DUP, | ||||
OP_CHECKDATASIG, | |||||
OP_CHECKMULTISIG, | |||||
OP_CHECKSIG, | OP_CHECKSIG, | ||||
OP_CHECKSIGVERIFY, | OP_CHECKSIGVERIFY, | ||||
OP_EQUAL, | OP_EQUAL, | ||||
OP_HASH160, | OP_HASH160, | ||||
OP_RETURN, | OP_RETURN, | ||||
OP_TRUE, | OP_TRUE, | ||||
SIGHASH_ALL, | SIGHASH_ALL, | ||||
SIGHASH_FORKID, | SIGHASH_FORKID, | ||||
▲ Show 20 Lines • Show All 243 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
extra_sigops=MAX_BLOCK_SIGOPS_PER_MB + 1, block_size=2 * ONE_MEGABYTE) | extra_sigops=MAX_BLOCK_SIGOPS_PER_MB + 1, block_size=2 * ONE_MEGABYTE) | ||||
node.p2p.send_blocks_and_test( | node.p2p.send_blocks_and_test( | ||||
[self.tip], node, success=False, reject_reason='bad-blk-sigops') | [self.tip], node, success=False, reject_reason='bad-blk-sigops') | ||||
# Rewind bad block | # Rewind bad block | ||||
tip(22) | tip(22) | ||||
# Accept 60k sigops per block > 2MB and <= 3MB | # Accept 60k sigops per block > 2MB and <= 3MB | ||||
block(25, spend=out[3], script=lots_of_checksigs, extra_sigops=2 * | block(25, spend=out[3], script=lots_of_checksigs, extra_sigops=2 | ||||
MAX_BLOCK_SIGOPS_PER_MB, block_size=2 * ONE_MEGABYTE + 1) | * MAX_BLOCK_SIGOPS_PER_MB, block_size=2 * ONE_MEGABYTE + 1) | ||||
node.p2p.send_blocks_and_test([self.tip], node) | node.p2p.send_blocks_and_test([self.tip], node) | ||||
# Accept 60k sigops per block > 2MB and <= 3MB | # Accept 60k sigops per block > 2MB and <= 3MB | ||||
block(26, spend=out[4], script=lots_of_checksigs, | block(26, spend=out[4], script=lots_of_checksigs, | ||||
extra_sigops=2 * MAX_BLOCK_SIGOPS_PER_MB, block_size=3 * ONE_MEGABYTE) | extra_sigops=2 * MAX_BLOCK_SIGOPS_PER_MB, block_size=3 * ONE_MEGABYTE) | ||||
node.p2p.send_blocks_and_test([self.tip], node) | node.p2p.send_blocks_and_test([self.tip], node) | ||||
# Reject more than 40k sigops per block > 1MB and <= 2MB. | # Reject more than 40k sigops per block > 1MB and <= 2MB. | ||||
block(27, spend=out[5], script=lots_of_checksigs, extra_sigops=2 * | block(27, spend=out[5], script=lots_of_checksigs, extra_sigops=2 | ||||
MAX_BLOCK_SIGOPS_PER_MB + 1, block_size=2 * ONE_MEGABYTE + 1) | * MAX_BLOCK_SIGOPS_PER_MB + 1, block_size=2 * ONE_MEGABYTE + 1) | ||||
node.p2p.send_blocks_and_test( | node.p2p.send_blocks_and_test( | ||||
[self.tip], node, success=False, reject_reason='bad-blk-sigops') | [self.tip], node, success=False, reject_reason='bad-blk-sigops') | ||||
# Rewind bad block | # Rewind bad block | ||||
tip(26) | tip(26) | ||||
# Reject more than 40k sigops per block > 1MB and <= 2MB. | # Reject more than 40k sigops per block > 1MB and <= 2MB. | ||||
block(28, spend=out[5], script=lots_of_checksigs, extra_sigops=2 * | block(28, spend=out[5], script=lots_of_checksigs, extra_sigops=2 | ||||
MAX_BLOCK_SIGOPS_PER_MB + 1, block_size=3 * ONE_MEGABYTE) | * MAX_BLOCK_SIGOPS_PER_MB + 1, block_size=3 * ONE_MEGABYTE) | ||||
node.p2p.send_blocks_and_test( | node.p2p.send_blocks_and_test( | ||||
[self.tip], node, success=False, reject_reason='bad-blk-sigops') | [self.tip], node, success=False, reject_reason='bad-blk-sigops') | ||||
# Rewind bad block | # Rewind bad block | ||||
tip(26) | tip(26) | ||||
# Too many sigops in one txn | # Too many sigops in one txn | ||||
too_many_tx_checksigs = CScript( | too_many_tx_checksigs = CScript( | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
tip(30) | tip(30) | ||||
# Max sigops in one p2sh txn | # Max sigops in one p2sh txn | ||||
max_p2sh_sigops = CScript([OP_CHECKSIG] * (p2sh_sigops_limit)) | max_p2sh_sigops = CScript([OP_CHECKSIG] * (p2sh_sigops_limit)) | ||||
block(32, spend=out[8], block_size=ONE_MEGABYTE + 1) | block(32, spend=out[8], block_size=ONE_MEGABYTE + 1) | ||||
update_block(32, [spend_p2sh_tx(max_p2sh_sigops)]) | update_block(32, [spend_p2sh_tx(max_p2sh_sigops)]) | ||||
node.p2p.send_blocks_and_test([self.tip], node) | node.p2p.send_blocks_and_test([self.tip], node) | ||||
# Ensure that a coinbase with too many sigops is forbidden, even if it | |||||
# doesn't push the total block count over the limit. | |||||
b33 = block(33, spend=out[9], block_size=2 * ONE_MEGABYTE) | |||||
# 20001 sigops | |||||
b33.vtx[0].vout.append( | |||||
CTxOut(0, CScript([OP_CHECKMULTISIG] * 1000 + [OP_CHECKDATASIG]))) | |||||
update_block(33, []) | |||||
node.p2p.send_blocks_and_test( | |||||
[b33], node, success=False, reject_reason='bad-txn-sigops') | |||||
# 20000 sigops | |||||
b33.vtx[0].vout[-1].scriptPubKey = CScript([OP_CHECKMULTISIG] * 1000) | |||||
update_block(33, []) | |||||
node.p2p.send_blocks_and_test([b33], node) | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
FullBlockTest().main() | FullBlockTest().main() |