Skip to content

Instantly share code, notes, and snippets.

@hodlwave
Last active November 17, 2019 21:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hodlwave/a65ee9743a349cd94c40b4ecf441c3bb to your computer and use it in GitHub Desktop.
Save hodlwave/a65ee9743a349cd94c40b4ecf441c3bb to your computer and use it in GitHub Desktop.
Bitcoin Core PSBT Example Walkthrough

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.

Create addresses

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

Get address info

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"
    }
  ]
}

Add the multisig address

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"
}

Create the unsigned PSBT

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
}

Sign the PSBT

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
}

Finalize the PSBT

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
}

Send the raw transaction

Broadcasts the signed transaction to the network

$ bitcoin-cli --testnet sendrawtransaction "0200000000010107e16ca340d45463a47fa89d6d77384a8a216642a62178835a2b19756c1fca440100000000feffffff015d5500000000000017a9143608d108c2d809ae45a5f5ff1e28a8e858cf95e987040047304402206de08dffbdff4d22dea7e765c3aa170b1711cf26c291a009a7c06beeec6eac2c0220266153356c6562d55371bc857430edb8c4d435861a83bf62fa96894c3dfd73510147304402203b66eb2a6df1778eceb329d79960559aea80dacbc90fba26769489bec37df4e6022071178d2afe1b7103c3983698d880a998aeac6a072e0d9b4a6304f46e9f1c87ff0169522102117238f21a5ab8915073fee90681aea5db0bb7608504c76a04c984ad2fc2efbe2102490a09b0677d5c76f1c1aae1a972ce91cd81a7615e1bf1fa176abfdc6b41033d2102b4f029c6939f279573f88bfed1df0979ab3dcb762e9a9141c0e4f3541812f29653ae00000000"
3b410231822348c52c54eefeb01eeca00479e1396747f3f65b79a7253974e184
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment