BIP: 383 Layer: Applications Title: Multisig Output Script Descriptors Author: Pieter Wuille <email@example.com> Andrew Chow <firstname.lastname@example.org> Comments-Summary: No comments yet. Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0383 Status: Draft Type: Informational Created: 2021-06-27 License: BSD-2-Clause
This document specifies
sortedmulti() output script
descriptors. Both functions take a threshold and one or more public keys
and produce a multisig output script.
multi() specifies the public
keys in the output script in the order given in the descriptor while
sortedmulti() sorts the public keys lexicographically when the output
script is produced.
This BIP is licensed under the BSD 2-clause license.
The most common complex script used in Bitcoin is a threshold multisig. These expressions allow specifying multisig scripts as a descriptor.
Two new script expressions are defined:
Both expressions produce the scripts of the same template and take the
same arguments. They are written as
k is the threshold - the number of keys that must sign the input for
the script to be valid.
KEY_1,KEY_2,...,KEY_n are the key expressions
for the multisig.
k must be less than or equal to
sortedmulti() expressions can be used as a top level
expression, or inside of either a
Depending on the higher level descriptors, there may be restrictions on
the type of public keys that can be included.
Depending on the higher level descriptors, there are also restrictions
on the number of keys that can be present, i.e. the maximum value of
n. When used at the top level, there can only be at most 3 keys. When
used inside of a
sh() expression, there can only be most 15 compressed
public keys (this is limited by the P2SH script limit). Otherwise the
maximum number of keys is 20.
The output script produced also depends on the value of
less than or equal to 16:
OP_k KEY_1 KEY_2 ... KEY_n OP_CHECKMULTISIG
k is greater than 16:
k KEY_1 KEY_2 ... KEY_n OP_CHECKMULTISIG
The only change for
sortedmulti() is that the keys are sorted
lexicographically prior to the creation of the output script. This
sorting is on the keys that are to be put into the output script, i.e.
after all extended keys are derived.
Multiple Extended Keys
When one or more the key expressions in a
expression are extended keys, the derived keys use the same child index.
This changes the keys in lockstep and allows for output scripts to be
indexed in the same way that the derived keys are indexed.
sortedmulti() descriptors use the format and general
operation specified in 380. As these
are a wholly new descriptors, they are not compatible with any
implementation. However the scripts produced are standard scripts so
existing software are likely to be familiar with them.
multi() descriptors have been implemented in Bitcoin
Core since version 0.17.