<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bitcoin.it/w/index.php?action=history&amp;feed=atom&amp;title=BIP_0387</id>
	<title>BIP 0387 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bitcoin.it/w/index.php?action=history&amp;feed=atom&amp;title=BIP_0387"/>
	<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0387&amp;action=history"/>
	<updated>2026-05-02T16:03:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0387&amp;diff=70178&amp;oldid=prev</id>
		<title>934: Update BIP text with latest version from https://github.com/bitcoin/bips/blob/c4c5c69bdf260513/bip-0387.mediawiki</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0387&amp;diff=70178&amp;oldid=prev"/>
		<updated>2024-05-07T00:34:55Z</updated>

		<summary type="html">&lt;p&gt;Update BIP text with latest version from https://github.com/bitcoin/bips/blob/c4c5c69bdf260513/bip-0387.mediawiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{bip}}&lt;br /&gt;
{{BipMoved|bip-0387.mediawiki}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 387&lt;br /&gt;
  Layer: Applications&lt;br /&gt;
  Title: Tapscript Multisig Output Script Descriptors&lt;br /&gt;
  Author: Pieter Wuille &amp;lt;pieter@wuille.net&amp;gt;&lt;br /&gt;
          Ava Chow &amp;lt;me@achow101.com&amp;gt;&lt;br /&gt;
  Comments-Summary: No comments yet.&lt;br /&gt;
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0387&lt;br /&gt;
  Status: Draft&lt;br /&gt;
  Type: Informational&lt;br /&gt;
  Created: 2024-04-17&lt;br /&gt;
  License: BSD-2-Clause&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
This document specifies &amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; output script descriptors.&lt;br /&gt;
Like BIP 383&amp;#039;s &amp;lt;tt&amp;gt;multi()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sortedmulti()&amp;lt;/tt&amp;gt;, both functions take a threshold and one&lt;br /&gt;
or more public keys and produce a multisig script. The primary distinction is that &amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt;&lt;br /&gt;
and &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; only produce tapscripts and are only allowed in a tapscript context.&lt;br /&gt;
&lt;br /&gt;
==Copyright==&lt;br /&gt;
&lt;br /&gt;
This BIP is licensed under the BSD 2-clause license.&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
The most common complex script used in Bitcoin is a threshold multisig.&lt;br /&gt;
These expressions allow specifying multisig scripts as a descriptor.&lt;br /&gt;
&lt;br /&gt;
==Specification==&lt;br /&gt;
&lt;br /&gt;
Two new script expressions are defined: &amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Both expressions produce the scripts of the same template and take the same arguments.&lt;br /&gt;
They are written as &amp;lt;tt&amp;gt;multi_a(k,KEY_1,KEY_2,...,KEY_n)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; is the threshold - the number of keys that must sign the input for the script to be valid.&lt;br /&gt;
&amp;lt;tt&amp;gt;KEY_1,KEY_2,...,KEY_n&amp;lt;/tt&amp;gt; are the key expressions for the multisig. &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; must be less than or equal to &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; expressions can only be used inside of a &amp;lt;tt&amp;gt;tr()&amp;lt;/tt&amp;gt; descriptor.&lt;br /&gt;
The maximum number of keys is 999.&lt;br /&gt;
&lt;br /&gt;
The output script produced also depends on the value of &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt;. If &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; is less than or equal to 16:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KEY_1 OP_CHECKSIG KEY_2 OP_CHECKSIGADD ... KEY_n OP_CHECKSIGADD OP_k OP_NUMEQUAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; is greater than 16:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KEY_1 OP_CHECKSIG KEY_2 OP_CHECKSIGADD ... KEY_n OP_CHECKSIGADD k OP_NUMEQUAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The only change for &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; is that the x-only public keys are sorted lexicographically prior to the creation of the output script.&lt;br /&gt;
This sorting is on the keys that are to be put into the output script, i.e. after all extended keys are derived.&lt;br /&gt;
&lt;br /&gt;
===Multiple Extended Keys&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
When one or more of the key expressions in a &amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; expression are extended keys, the derived keys use the same child index.&lt;br /&gt;
This changes the keys in lockstep and allows for output scripts to be indexed in the same way that the derived keys are indexed.&lt;br /&gt;
&lt;br /&gt;
==Test Vectors==&lt;br /&gt;
&lt;br /&gt;
Valid descriptors followed by the scripts they produce. Descriptors involving derived child keys will have the 0th, 1st, and 2nd scripts listed.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;tr(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,multi_a(1,KzoAz5CanayRKex3fSLQ2BwJpN7U52gZvxMyk78nDMHuqrUxuSJy))&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120eb5bd3894327d75093891cc3a62506df7d58ec137fcd104cdd285d67816074f3&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd,multi_a(1,669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120eb5bd3894327d75093891cc3a62506df7d58ec137fcd104cdd285d67816074f3&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(2,[00000000/111&amp;#039;/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;51202eea93581594a43c0c8423b70dc112e5651df63984d108d4fc8ccd3b63b4eafa&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,sortedmulti_a(2,[00000000/111&amp;#039;/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;512016fa6a6ba7e98c54b5bf43b3144912b78a61b60b02f6a74172b8dcb35b12bc30&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,sortedmulti_a(2,xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/*,xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y/0/0/*))&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120abd47468515223f58a1a18edfde709a7a2aab2b696d59ecf8c34f0ba274ef772&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120fe62e7ed20705bd1d3678e072bc999acb014f07795fa02cb8f25a7aa787e8cbd&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;51201311093750f459039adaa2a5ed23b0f7a8ae2c2ffb07c5390ea37e2fb1050b41&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(2,xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U/2147483647&amp;#039;/0,xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt/1/2/*,xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*&amp;#039;))&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120e4c8f2b0a7d3a688ac131cb03248c0d4b0a59bbd4f37211c848cfbd22a981192&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120827faedaa21e52fca2ac83b53afd1ab7d4d1e6ce67ff42b19f2723d48b5a19ab&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;5120647495ed09de61a3a324704f9203c130d655bf3141f9b748df8f7be7e9af55a4&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Invalid descriptors&lt;br /&gt;
&lt;br /&gt;
* Unsupported top level: &amp;lt;tt&amp;gt;multi_a(1,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Unsupported &amp;lt;tt&amp;gt;sh()&amp;lt;/tt&amp;gt; context: &amp;lt;tt&amp;gt;sh(multi_a(1,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Unsupported &amp;lt;tt&amp;gt;wsh()&amp;lt;/tt&amp;gt; context: &amp;lt;tt&amp;gt;wsh(multi_a(1,03669b8afcec803a0d323e9a17f3ea8e68e8abe5a278020a929adbec52421adbd0))&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Invalid threshold: &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(a,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Threshold of 0: &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(0,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Uncompressed pubkey: &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(1,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235))&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Threshold larger than keys: &amp;lt;tt&amp;gt;tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(3,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss))&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Backwards Compatibility==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; descriptors use the format and general operation specified in [[bip-0380.mediawiki|380]].&lt;br /&gt;
As these are wholly new descriptors, they are not compatible with any implementation.&lt;br /&gt;
However, the scripts produced are standard scripts, so existing software are likely to be familiar with them.&lt;br /&gt;
&lt;br /&gt;
==Reference Implementation==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;multi_a()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sortedmulti_a()&amp;lt;/tt&amp;gt; descriptors were implemented in Bitcoin Core in https://github.com/bitcoin/bitcoin/pull/24043 and have been available since version 24.0.&lt;/div&gt;</summary>
		<author><name>934</name></author>
	</entry>
</feed>