This gist provides example commands for the "Multisig with multiple Bitcoin Core instances" section of the Bitcoin PSBT HowTo doc. All the commands were run on the same instance of Bitcoin Core, but it should work on multiple instances (Alice's, Bob's, and Carol's). Comments are kept at a minimum as the reference doc explains everything.
This step will create a private key that Bitcoin Core remembers and output its associated address. Alice address
$ bitcoin-cli --testnet getnewaddress "Aalice" "bech32"
tb1qcqnk794t9pny6pnpfc7fz2q7q05ahgxwes8hef
Bob address
$ bitcoin-cli --testnet getnewaddress "Abob" "bech32"
tb1q7dgkslzsdm3nhqtc3lw0j4kw7dpztzk9w5hyht
Carol address
$ bitcoin-cli --testnet getnewaddress "Acarol" "bech32"
tb1qdlwtxp2emqvvcqwvtv6k58f2vazhmvdh77p5wu
This step returns the public key of the address (key "pubkey" in the JSON output) to be used in later steps.
Alice address info
$ bitcoin-cli --testnet getaddressinfo tb1qcqnk794t9pny6pnpfc7fz2q7q05ahgxwes8hef
{
"address": "tb1qcqnk794t9pny6pnpfc7fz2q7q05ahgxwes8hef",
"scriptPubKey": "0014c0276f16ab28664d06614e3c91281e03e9dba0ce",
"ismine": true,
"solvable": true,
"desc": "wpkh([9cb79627/0'/0'/10']02117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe)#cxrl6xdh",
"iswatchonly": false,
"isscript": false,
"iswitness": true,
"witness_version": 0,
"witness_program": "c0276f16ab28664d06614e3c91281e03e9dba0ce",
"pubkey": "02117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe",
"label": "Aalice",
"ischange": false,
"timestamp": 1573876411,
"hdkeypath": "m/0'/0'/10'",
"hdseedid": "5613912a81932de2342d8c94b1bb763fbed98fa8",
"hdmasterfingerprint": "9cb79627",
"labels": [
{
"name": "Aalice",
"purpose": "receive"
}
]
}
Bob address info
$ bitcoin-cli --testnet getaddressinfo tb1q7dgkslzsdm3nhqtc3lw0j4kw7dpztzk9w5hyht
{
"address": "tb1q7dgkslzsdm3nhqtc3lw0j4kw7dpztzk9w5hyht",
"scriptPubKey": "0014f351687c506ee33b81788fdcf956cef342258ac5",
"ismine": true,
"solvable": true,
"desc": "wpkh([9cb79627/0'/0'/11']02490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d)#kertf98x",
"iswatchonly": false,
"isscript": false,
"iswitness": true,
"witness_version": 0,
"witness_program": "f351687c506ee33b81788fdcf956cef342258ac5",
"pubkey": "02490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d",
"label": "Abob",
"ischange": false,
"timestamp": 1573876411,
"hdkeypath": "m/0'/0'/11'",
"hdseedid": "5613912a81932de2342d8c94b1bb763fbed98fa8",
"hdmasterfingerprint": "9cb79627",
"labels": [
{
"name": "Abob",
"purpose": "receive"
}
]
}
Carol address info
$ bitcoin-cli --testnet getaddressinfo tb1qdlwtxp2emqvvcqwvtv6k58f2vazhmvdh77p5wu
{
"address": "tb1qdlwtxp2emqvvcqwvtv6k58f2vazhmvdh77p5wu",
"scriptPubKey": "00146fdcb30559d818cc01cc5b356a1d2a67457db1b7",
"ismine": true,
"solvable": true,
"desc": "wpkh([9cb79627/0'/0'/12']02b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f296)#x2y9qrdj",
"iswatchonly": false,
"isscript": false,
"iswitness": true,
"witness_version": 0,
"witness_program": "6fdcb30559d818cc01cc5b356a1d2a67457db1b7",
"pubkey": "02b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f296",
"label": "Acarol",
"ischange": false,
"timestamp": 1573876411,
"hdkeypath": "m/0'/0'/12'",
"hdseedid": "5613912a81932de2342d8c94b1bb763fbed98fa8",
"hdmasterfingerprint": "9cb79627",
"labels": [
{
"name": "Acarol",
"purpose": "receive"
}
]
}
This step combines the public keys from the previous step and adds a 2-of-3 multisignature address to Bitcoin Core. The address and redeem script are returned.
$ bitcoin-cli --testnet addmultisigaddress 2 "[\"02117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe\",\"02490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d\",\"02b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f296\"]" "" "bech32"
{
"address": "tb1qlkny3gq2sghs276m9s07e5s787dhtn4crx8eqg66mmh473qzqcwshmgkjs",
"redeemScript": "522102117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe2102490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d2102b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f29653ae"
}
Creates an unsigned PSBT that spends all of the funds at the multisignature address to an address (in this case 2MxAw3E6yBq2xumTWJ837WrUyv6oZ9zik3U
)
$ bitcoin-cli --testnet walletcreatefundedpsbt "[]" "{\"2MxAw3E6yBq2xumTWJ837WrUyv6oZ9zik3U\": 0.00022000 }" 0 "{\"subtractFeeFromOutputs\":[0], \"includeWatching\":true}"
{
"psbt": "cHNidP8BAFMCAAAAAQfhbKNA1FRjpH+onW13OEqKIWZCpiF4g1orGXVsH8pEAQAAAAD+////AV1VAAAAAAAAF6kUNgjRCMLYCa5FpfX/Hiio6FjPlemHAAAAAAABASvwVQAAAAAAACIAIP2mSKAKgi8Fe1ssH+zSHj+bdc64GY+QI1re719EAgYdAQVpUiECEXI48hpauJFQc/7pBoGupdsLt2CFBMdqBMmErS/C774hAkkKCbBnfVx28cGq4alyzpHNgadhXhvx+hdqv9xrQQM9IQK08CnGk58nlXP4i/7R3wl5qz3Ldi6akUHA5PNUGBLyllOuAAEAFgAUL/cVRY4VRc6TSlXq0wnca5QjxnUA",
"fee": 0.00000147,
"changepos": -1
}
Signs the PSBT. Since each signatory key was created on the same Bitcoin Core instance, the PSBT is fully signed after this step.
$ bitcoin-cli --testnet walletprocesspsbt "cHNidP8BAFMCAAAAAQfhbKNA1FRjpH+onW13OEqKIWZCpiF4g1orGXVsH8pEAQAAAAD+////AV1VAAAAAAAAF6kUNgjRCMLYCa5FpfX/Hiio6FjPlemHAAAAAAABASvwVQAAAAAAACIAIP2mSKAKgi8Fe1ssH+zSHj+bdc64GY+QI1re719EAgYdAQVpUiECEXI48hpauJFQc/7pBoGupdsLt2CFBMdqBMmErS/C774hAkkKCbBnfVx28cGq4alyzpHNgadhXhvx+hdqv9xrQQM9IQK08CnGk58nlXP4i/7R3wl5qz3Ldi6akUHA5PNUGBLyllOuAAEAFgAUL/cVRY4VRc6TSlXq0wnca5QjxnUA"
{
"psbt": "cHNidP8BAFMCAAAAAQfhbKNA1FRjpH+onW13OEqKIWZCpiF4g1orGXVsH8pEAQAAAAD+////AV1VAAAAAAAAF6kUNgjRCMLYCa5FpfX/Hiio6FjPlemHAAAAAAABASvwVQAAAAAAACIAIP2mSKAKgi8Fe1ssH+zSHj+bdc64GY+QI1re719EAgYdAQj8BABHMEQCIG3gjf+9/00i3qfnZcOqFwsXEc8mwpGgCafAa+7sbqwsAiAmYVM1bGVi1VNxvIV0MO24xNQ1hhqDv2L6lolMPf1zUQFHMEQCIDtm6ypt8XeOzrMp15lgVZrqgNrLyQ+6JnaUib7DffTmAiBxF40q/htxA8OYNpjYgKmYrqxqBy4Nm0pjBPRunxyH/wFpUiECEXI48hpauJFQc/7pBoGupdsLt2CFBMdqBMmErS/C774hAkkKCbBnfVx28cGq4alyzpHNgadhXhvx+hdqv9xrQQM9IQK08CnGk58nlXP4i/7R3wl5qz3Ldi6akUHA5PNUGBLyllOuAAEAFgAUL/cVRY4VRc6TSlXq0wnca5QjxnUA",
"complete": true
}
Finalizes the PSBT and returns a signed hex transaction that can be broadcasted to the network
$ bitcoin-cli --testnet finalizepsbt "cHNidP8BAFMCAAAAAQfhbKNA1FRjpH+onW13OEqKIWZCpiF4g1orGXVsH8pEAQAAAAD+////AV1VAAAAAAAAF6kUNgjRCMLYCa5FpfX/Hiio6FjPlemHAAAAAAABASvwVQAAAAAAACIAIP2mSKAKgi8Fe1ssH+zSHj+bdc64GY+QI1re719EAgYdAQj8BABHMEQCIG3gjf+9/00i3qfnZcOqFwsXEc8mwpGgCafAa+7sbqwsAiAmYVM1bGVi1VNxvIV0MO24xNQ1hhqDv2L6lolMPf1zUQFHMEQCIDtm6ypt8XeOzrMp15lgVZrqgNrLyQ+6JnaUib7DffTmAiBxF40q/htxA8OYNpjYgKmYrqxqBy4Nm0pjBPRunxyH/wFpUiECEXI48hpauJFQc/7pBoGupdsLt2CFBMdqBMmErS/C774hAkkKCbBnfVx28cGq4alyzpHNgadhXhvx+hdqv9xrQQM9IQK08CnGk58nlXP4i/7R3wl5qz3Ldi6akUHA5PNUGBLyllOuAAEAFgAUL/cVRY4VRc6TSlXq0wnca5QjxnUA"
{
"hex": "0200000000010107e16ca340d45463a47fa89d6d77384a8a216642a62178835a2b19756c1fca440100000000feffffff015d5500000000000017a9143608d108c2d809ae45a5f5ff1e28a8e858cf95e987040047304402206de08dffbdff4d22dea7e765c3aa170b1711cf26c291a009a7c06beeec6eac2c0220266153356c6562d55371bc857430edb8c4d435861a83bf62fa96894c3dfd73510147304402203b66eb2a6df1778eceb329d79960559aea80dacbc90fba26769489bec37df4e6022071178d2afe1b7103c3983698d880a998aeac6a072e0d9b4a6304f46e9f1c87ff0169522102117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe2102490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d2102b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f29653ae00000000",
"complete": true
}
Broadcasts the signed transaction to the network
$ bitcoin-cli --testnet sendrawtransaction "0200000000010107e16ca340d45463a47fa89d6d77384a8a216642a62178835a2b19756c1fca440100000000feffffff015d5500000000000017a9143608d108c2d809ae45a5f5ff1e28a8e858cf95e987040047304402206de08dffbdff4d22dea7e765c3aa170b1711cf26c291a009a7c06beeec6eac2c0220266153356c6562d55371bc857430edb8c4d435861a83bf62fa96894c3dfd73510147304402203b66eb2a6df1778eceb329d79960559aea80dacbc90fba26769489bec37df4e6022071178d2afe1b7103c3983698d880a998aeac6a072e0d9b4a6304f46e9f1c87ff0169522102117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe2102490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d2102b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f29653ae00000000"
3b410231822348c52c54eefeb01eeca00479e1396747f3f65b79a7253974e184