Skip to content

Commit 9be6065

Browse files
committed
test: coverage for 16-20 segwit multisig scripts
This exercises the bug fixed by previous commits, where we were unable to generate and sign for segwit redeem scripts (in this case multisig redeem scripts) longer than 520 bytes. and also, this adds coverage for legacy 15-15 multisig script generation and signing.
1 parent 9d9a91c commit 9be6065

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

test/functional/rpc_createmultisig.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@ def run_test(self):
5656
self.generate(self.wallet, 149)
5757

5858
wallet_multi = self.create_wallet(node1, 'wmulti') if self._requires_wallet else None
59-
self.create_keys(5)
60-
for nkeys in [3, 5]:
61-
for nsigs in [2, 3]:
62-
for output_type in ["bech32", "p2sh-segwit", "legacy"]:
63-
self.do_multisig(nkeys, nsigs, output_type, wallet_multi)
59+
self.create_keys(21) # max number of allowed keys + 1
60+
m_of_n = [(2, 3), (3, 3), (2, 5), (3, 5), (10, 15), (15, 15)]
61+
for (sigs, keys) in m_of_n:
62+
for output_type in ["bech32", "p2sh-segwit", "legacy"]:
63+
self.do_multisig(keys, sigs, output_type, wallet_multi)
6464

65+
self.test_multisig_script_limit()
6566
self.test_mixing_uncompressed_and_compressed_keys(node0, wallet_multi)
6667
self.test_sortedmulti_descriptors_bip67()
6768

@@ -83,6 +84,21 @@ def check_addmultisigaddress_errors(self):
8384
pubs = [self.nodes[1].getaddressinfo(addr)["pubkey"] for addr in addresses]
8485
assert_raises_rpc_error(-5, "Bech32m multisig addresses cannot be created with legacy wallets", self.nodes[0].addmultisigaddress, 2, pubs, "", "bech32m")
8586

87+
def test_multisig_script_limit(self):
88+
node1 = self.nodes[1]
89+
pubkeys = self.pub[0:20]
90+
91+
self.log.info('Test legacy redeem script max size limit')
92+
assert_raises_rpc_error(-8, "redeemScript exceeds size limit: 684 > 520", node1.createmultisig, 16, pubkeys, 'legacy')
93+
94+
self.log.info('Test valid 16-20 multisig p2sh-legacy and bech32 (no wallet)')
95+
self.do_multisig(nkeys=20, nsigs=16, output_type="p2sh-segwit", wallet_multi=None)
96+
self.do_multisig(nkeys=20, nsigs=16, output_type="bech32", wallet_multi=None)
97+
98+
self.log.info('Test invalid 16-21 multisig p2sh-legacy and bech32 (no wallet)')
99+
assert_raises_rpc_error(-8, "Number of keys involved in the multisignature address creation > 20", node1.createmultisig, 16, self.pub, 'p2sh-segwit')
100+
assert_raises_rpc_error(-8, "Number of keys involved in the multisignature address creation > 20", node1.createmultisig, 16, self.pub, 'bech32')
101+
86102
def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
87103
node0, node1, node2 = self.nodes
88104
pub_keys = self.pub[0: nkeys]
@@ -117,13 +133,13 @@ def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
117133
assert mredeemw == mredeem
118134

119135
spk = address_to_scriptpubkey(madd)
120-
value = decimal.Decimal("0.00001300")
136+
value = decimal.Decimal("0.00004000")
121137
tx = self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=spk, amount=int(value * COIN))
122138
prevtxs = [{"txid": tx["txid"], "vout": tx["sent_vout"], "scriptPubKey": spk.hex(), "redeemScript": mredeem, "amount": value}]
123139

124140
self.generate(node0, 1)
125141

126-
outval = value - decimal.Decimal("0.00001000")
142+
outval = value - decimal.Decimal("0.00002000") # deduce fee (must be higher than the min relay fee)
127143
# send coins to node2 when wallet is enabled
128144
node2_balance = node2.getbalances()['mine']['trusted'] if self.is_wallet_compiled() else 0
129145
out_addr = node2.getnewaddress() if self.is_wallet_compiled() else getnewdestination('bech32')[2]
@@ -157,6 +173,7 @@ def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
157173

158174
rawtx2 = node2.signrawtransactionwithkey(rawtx, priv_keys[0:nsigs - 1], prevtxs)
159175
rawtx3 = node2.signrawtransactionwithkey(rawtx2["hex"], [priv_keys[-1]], prevtxs)
176+
assert rawtx3['complete']
160177

161178
tx = node0.sendrawtransaction(rawtx3["hex"], 0)
162179
blk = self.generate(node0, 1)[0]

0 commit comments

Comments
 (0)