@@ -139,6 +139,32 @@ Key order does not matter for `sortedmulti()`. `sortedmulti()` behaves in the sa
139
139
as ` multi() ` does but the keys are reordered in the resulting script such that they
140
140
are lexicographically ordered as described in BIP67.
141
141
142
+ #### Basic multisig example
143
+
144
+ For a good example of a basic M-of-N multisig between multiple participants using descriptor
145
+ wallets and PSBTs, as well as a signing flow, see [ this functional test] ( /test/functional/wallet_multisig_descriptor_psbt.py ) .
146
+ The basic steps are:
147
+
148
+ 1 . Every participant generates an xpub. The most straightforward way is to create a new descriptor wallet.
149
+ Avoid reusing this wallet for any other purpose. Hint: extract the wallet's xpubs using ` listdescriptors `
150
+ and pick the one from the ` pkh ` descriptor since it's least likely to be accidentally reused (legacy addresses)
151
+ 2 . Create a watch-only descriptor wallet (blank, private keys disabled). Now the multisig is created by importing the two descriptors:
152
+ ` wsh(sortedmulti(<M>,XPUB1/0/*,XPUB2/0/*,…,XPUBN/0/*)) ` and ` wsh(sortedmulti(<M>,XPUB1/1/*,XPUB2/1/*,…,XPUBN/1/*)) `
153
+ (one descriptor w/ ` 0 ` for receiving addresses and another w/ ` 1 ` for change). Every participant does this
154
+ 3 . A receiving address is generated for the multisig. As a check to ensure step 2 was done correctly, every participant
155
+ should verify they get the same addresses
156
+ 4 . Funds are sent to the resulting address
157
+ 5 . A sending transaction is created using ` walletcreatefundedpsbt ` (anyone can initiate this). It is simple to do this in
158
+ the GUI by going to the ` Send ` tab in the multisig wallet and creating an unsigned transaction (PSBT)
159
+ 6 . At least ` M ` users check the PSBT with ` decodepsbt ` and (if OK) signs it with ` walletprocesspsbt ` . It is simple to do
160
+ this in the GUI by Loading the PSBT from file and signing it
161
+ 7 . The signed PSBTs are collected with ` combinepsbt ` , finalized w/ ` finalizepsbt ` , and
162
+ then the resulting transaction is broadcasted to the network
163
+ 8 . Checks that balances are correct after the transaction has been included in a block
164
+
165
+ [ The test] ( /test/functional/wallet_multisig_descriptor_psbt.py ) is meant to be documentation as much as it is a functional test, so
166
+ it is kept as simple and readable as possible.
167
+
142
168
### BIP32 derived keys and chains
143
169
144
170
Most modern wallet software and hardware uses keys that are derived using
0 commit comments