aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfurszy <matiasfurszyfer@protonmail.com>2023-08-21 17:58:46 -0300
committerfurszy <matiasfurszyfer@protonmail.com>2024-05-03 14:20:45 -0300
commit9be6065cc03f2408f290a332b203eef9c9cebf24 (patch)
tree08c39b7ec4ff405c9fb3eb1b7b2b382ee3dce00a
parent9d9a91c4ea6b3bb32ef4131bca86f1d6683fc901 (diff)
downloadbitcoin-9be6065cc03f2408f290a332b203eef9c9cebf24.tar.xz
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.
-rwxr-xr-xtest/functional/rpc_createmultisig.py31
1 files changed, 24 insertions, 7 deletions
diff --git a/test/functional/rpc_createmultisig.py b/test/functional/rpc_createmultisig.py
index 983aeafc1c..e14dea70e6 100755
--- a/test/functional/rpc_createmultisig.py
+++ b/test/functional/rpc_createmultisig.py
@@ -56,12 +56,13 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
self.generate(self.wallet, 149)
wallet_multi = self.create_wallet(node1, 'wmulti') if self._requires_wallet else None
- self.create_keys(5)
- for nkeys in [3, 5]:
- for nsigs in [2, 3]:
- for output_type in ["bech32", "p2sh-segwit", "legacy"]:
- self.do_multisig(nkeys, nsigs, output_type, wallet_multi)
+ self.create_keys(21) # max number of allowed keys + 1
+ m_of_n = [(2, 3), (3, 3), (2, 5), (3, 5), (10, 15), (15, 15)]
+ for (sigs, keys) in m_of_n:
+ for output_type in ["bech32", "p2sh-segwit", "legacy"]:
+ self.do_multisig(keys, sigs, output_type, wallet_multi)
+ self.test_multisig_script_limit()
self.test_mixing_uncompressed_and_compressed_keys(node0, wallet_multi)
self.test_sortedmulti_descriptors_bip67()
@@ -83,6 +84,21 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
pubs = [self.nodes[1].getaddressinfo(addr)["pubkey"] for addr in addresses]
assert_raises_rpc_error(-5, "Bech32m multisig addresses cannot be created with legacy wallets", self.nodes[0].addmultisigaddress, 2, pubs, "", "bech32m")
+ def test_multisig_script_limit(self):
+ node1 = self.nodes[1]
+ pubkeys = self.pub[0:20]
+
+ self.log.info('Test legacy redeem script max size limit')
+ assert_raises_rpc_error(-8, "redeemScript exceeds size limit: 684 > 520", node1.createmultisig, 16, pubkeys, 'legacy')
+
+ self.log.info('Test valid 16-20 multisig p2sh-legacy and bech32 (no wallet)')
+ self.do_multisig(nkeys=20, nsigs=16, output_type="p2sh-segwit", wallet_multi=None)
+ self.do_multisig(nkeys=20, nsigs=16, output_type="bech32", wallet_multi=None)
+
+ self.log.info('Test invalid 16-21 multisig p2sh-legacy and bech32 (no wallet)')
+ assert_raises_rpc_error(-8, "Number of keys involved in the multisignature address creation > 20", node1.createmultisig, 16, self.pub, 'p2sh-segwit')
+ assert_raises_rpc_error(-8, "Number of keys involved in the multisignature address creation > 20", node1.createmultisig, 16, self.pub, 'bech32')
+
def do_multisig(self, nkeys, nsigs, output_type, wallet_multi):
node0, node1, node2 = self.nodes
pub_keys = self.pub[0: nkeys]
@@ -117,13 +133,13 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
assert mredeemw == mredeem
spk = address_to_scriptpubkey(madd)
- value = decimal.Decimal("0.00001300")
+ value = decimal.Decimal("0.00004000")
tx = self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=spk, amount=int(value * COIN))
prevtxs = [{"txid": tx["txid"], "vout": tx["sent_vout"], "scriptPubKey": spk.hex(), "redeemScript": mredeem, "amount": value}]
self.generate(node0, 1)
- outval = value - decimal.Decimal("0.00001000")
+ outval = value - decimal.Decimal("0.00002000") # deduce fee (must be higher than the min relay fee)
# send coins to node2 when wallet is enabled
node2_balance = node2.getbalances()['mine']['trusted'] if self.is_wallet_compiled() else 0
out_addr = node2.getnewaddress() if self.is_wallet_compiled() else getnewdestination('bech32')[2]
@@ -157,6 +173,7 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
rawtx2 = node2.signrawtransactionwithkey(rawtx, priv_keys[0:nsigs - 1], prevtxs)
rawtx3 = node2.signrawtransactionwithkey(rawtx2["hex"], [priv_keys[-1]], prevtxs)
+ assert rawtx3['complete']
tx = node0.sendrawtransaction(rawtx3["hex"], 0)
blk = self.generate(node0, 1)[0]