@ryanofsky recently suggested that I should write an overview of how the various pull requests spread over different repositories relate to some bigger picture view.
See the multisig tutorial for how things currently work.
I typically have the following future multisig wallet in mind to guide my thinking:
- a computer running Bitcoin Core holding one master key (key 1)
- one or more hardware wallets with additional keys, via HWI (keys 2 … n)
- taproot keypath using n-of-n MuSig2
- a fallback with fewer keys after some time elapsed
- a GUI wizard to set this up (simple Python command line tool until then)
The descriptors for this could be hand crafted, but it would be nice to have: 6. Miniscript compiler that can generate this
What’s Missing?
- Taproot support for external signers:
- Timelock support for descriptors: this will be added along with full MiniScript support in #24148 & #24149 (@darosior).
- Ability to handle descriptors for which we have 1-of-N keys. Descriptor wallets currently expect the wallet to be either watch-only and have no keys, or to have all the keys.
- MuSig2 setup and signing support, which requires:
- a BIP to specify new PSBT fields (tracked in #23326)
- Bitcoin Core changes; no PR yet afaik, (tracked in #23326)
- At least one other (hardware) wallet to support it
- I’m not aware of any hardware wallet working on this yet
- testing with two Bitcoin Core nodes is good start
- HWI changes: additional commands for:
- initial setup
- signing (although perhaps calling
signtx
multiple times with the right PSBT will “just work”)
- doesn’t have to be HWI of course, we would just add support new commands in the external signer command interface
- a simple Python setup wizard
- right now Specter Desktop is by far the easiest way to setup a multisig wallet. But it’s a huge dependency (including a bunch of NPM packages for their web interface). A simple Python script in contrib/ could call HWI to get a list of signers, ask what threshold to use, call
createwallet
to generate a blank wallet, fetch an xpub from it, and then callimportdescriptors
. - the script could use BIP 129 / BSMS (perhaps initially without encryption)
- Specter doesn’t set the external_signer wallet flag, so I have a trivial PR to do that manually: #21928
- right now Specter Desktop is by far the easiest way to setup a multisig wallet. But it’s a huge dependency (including a bunch of NPM packages for their web interface). A simple Python script in contrib/ could call HWI to get a list of signers, ask what threshold to use, call
- a GUI setup wizard: once we have an established work flow, we would implement that in the GUI
Misc
I have a PR that improves address display handling on the device:
Even better would be if we had a feature to ask the wallet for a signature to prove it has the private key (without passing that information to the outside world of course, see #24186). This requires BIP-322 support on our end (#24058), at least one hardware wallet to support it, and a new HWI signmessage
command. Perhaps this can later be expanded to allow your device to prove that it (still) has the keys it needs as a co-signer.
Miniscript compilers currently doesn’t support Taproot (e.g. to find the optimal tree structure), but I’m assuming you can still hand craft a leaf containing MiniScript.