How to Sign a Musig with Bitcoin Core
Today I was back at trying to sign a transaction spending a musig UTXO in Bitcoin Core. Last time around, Pieter W. gave me two pieces of advice.
- Use PSBTs, as they're more likely to work on modern stuff like Musig than raw transactions.
- He asked how I was generating my private/public keys, which made me realize I'd probably calculated my pubkey incorrectly.
So today I took a new swing, using the same methodology I use for signing regular multisigs in Bitcoin Core, but now I can't get the PSBT to process correctly.
I. Capturing the Individual Keys
I used the simplest method possible to generate a musig address: grab addresses from two different wallets and capture their pubkeys. (The private keys should then be sitting in those wallets.)
Here's the address & pubkey capture:
musigaddress1=$(bitcoin-cli -rpcwallet=musig1 getnewaddress)
musigaddress2=$(bitcoin-cli -rpcwallet=musig2 getnewaddress)
musigpubkey1=$(bitcoin-cli -rpcwallet=musig1 -named getaddressinfo address=$musigaddress1 | jq -r '.pubkey')
musigpubkey2=$(bitcoin-cli -rpcwallet=musig2 -named getaddressinfo address=$musigaddress2 | jq -r '.pubkey')
Here's the descriptor creation:
musigdesc="tr(musig($musigpubkey1,$musigpubkey2))"
musigcs=$(bitcoin-cli getdescriptorinfo $musigdesc | jq -r '.checksum')
musigdescwithcs=$musigdesc#$musigcs
echo $musigdescwithcs
tr(musig(031e4be4d329cb508f5b424564d23bb07f4f3e00b52797df607eabe25ebf7ff6ba,0269cd634538d451c95b1e9211605677542b19c813fc7a46795e39a19fd3053d59))#f56zcuwx
II. Creating a Watch Only Wallet
Next step: creating a watch-only wallet and generating a musig address
bitcoin-cli createwallet "musigwatchonly" true true
{
"name": "musigwatchonly"
}
bitcoin-cli -rpcwallet=musigwatchonly importdescriptors '''[{ "desc": "'$musigdescwithcs'", "timestamp": "now" }]'''
[
{
"success": true
}
]
bitcoin-cli -rpcwallet=musigwatchonly getaddressesbylabel ""
{
"tb1pp29jj0t4wfanctzsrvaz28l6ptamhqy7e8gmyuh8tv43ynra2dkqsskyne": {
"purpose": "receive"
}
}
Then, fund the address from a handy faucet.
III. Spend the Funds
Here's where I run into troubles. I can create a PSBT and process it through all three wallets. musigwatchonly should provide the descriptor, while musig1 and musig2 should provide signatures. They all seem to do something! But analyzepsbt continues to report that an Updater is needed!
Making the PSBT:
split1=$(bitcoin-cli -rpcwallet=musig1 getnewaddress)
split2=$(bitcoin-cli -rpcwallet=musig2 getnewaddress)
utxo_txid=$(bitcoin-cli -rpcwallet=musigwatchonly listunspent | jq -r '.[0] | .txid')
utxo_vout=$(bitcoin-cli -rpcwallet=musigwatchonly listunspent | jq -r '.[0] | .vout')
psbt=$(bitcoin-cli -named createpsbt inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$split1'": 0.0000498,"'$split2'": 0.0000498 }''')
bitcoin-cli analyzepsbt $psbt
{
"inputs": [
{
"has_utxo": false,
"is_final": false,
"next": "updater"
}
],
"next": "updater"
}
It seems to find the UTXO OK.
psbt=$(bitcoin-cli -rpcwallet="musigwatchonly" walletprocesspsbt $psbt | jq -r '.psbt')
bitcoin-cli analyzepsbt $psbt
{
"inputs": [
{
"has_utxo": true,
"is_final": false,
"next": "updater"
}
],
"estimated_vsize": 130,
"estimated_feerate": 0.00000307,
"fee": 0.00000040,
"next": "updater"
}
Lots of info has been filled in:
bitcoin-cli decodepsbt $psbt
{
"tx": {
"txid": "6b752ed99150f6cde71de6b9a5ea728bc2d908289744262b569da23eea60896f",
"hash": "6b752ed99150f6cde71de6b9a5ea728bc2d908289744262b569da23eea60896f",
"version": 2,
"size": 113,
"vsize": 113,
"weight": 452,
"locktime": 0,
"vin": [
{
"txid": "d376a2461fdba2198d070794224cdc5dd4c1f3f8bcef7a9bd8cdd254494476bf",
"vout": 0,
"scriptSig": {
"asm": "",
"hex": ""
},
"sequence": 4294967293
}
],
"vout": [
{
"value": 0.00004980,
"n": 0,
"scriptPubKey": {
"asm": "0 801f6ab23569c477fecf5ef7fb7568c208185200",
"desc": "addr(tb1qsq0k4v34d8z80lk0tmmlkatgcgyps5sq67nv2g)#52328mds",
"hex": "0014801f6ab23569c477fecf5ef7fb7568c208185200",
"address": "tb1qsq0k4v34d8z80lk0tmmlkatgcgyps5sq67nv2g",
"type": "witness_v0_keyhash"
}
},
{
"value": 0.00004980,
"n": 1,
"scriptPubKey": {
"asm": "0 0afe9ffb4f071020ed6f657c97881081f2b36c2c",
"desc": "addr(tb1qptlfl760qugzpmt0v47f0zqss8etxmpvpvgj5p)#9fgy0vvy",
"hex": "00140afe9ffb4f071020ed6f657c97881081f2b36c2c",
"address": "tb1qptlfl760qugzpmt0v47f0zqss8etxmpvpvgj5p",
"type": "witness_v0_keyhash"
}
}
]
},
"global_xpubs": [
],
"psbt_version": 0,
"proprietary": [
],
"unknown": {
},
"inputs": [
{
"witness_utxo": {
"amount": 0.00010000,
"scriptPubKey": {
"asm": "1 0a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c",
"desc": "rawtr(0a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c)#wrut38c9",
"hex": "51200a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c",
"address": "tb1pp29jj0t4wfanctzsrvaz28l6ptamhqy7e8gmyuh8tv43ynra2dkqsskyne",
"type": "witness_v1_taproot"
}
},
"taproot_bip32_derivs": [
{
"pubkey": "1e4be4d329cb508f5b424564d23bb07f4f3e00b52797df607eabe25ebf7ff6ba",
"master_fingerprint": "cb218d03",
"path": "m",
"leaf_hashes": [
]
},
{
"pubkey": "69cd634538d451c95b1e9211605677542b19c813fc7a46795e39a19fd3053d59",
"master_fingerprint": "03f07354",
"path": "m",
"leaf_hashes": [
]
},
{
"pubkey": "b285c0aeabaf9104034deb39b57443a7ae6763b28c608bd9d5d1f52c8474f9cb",
"master_fingerprint": "5a124770",
"path": "m",
"leaf_hashes": [
]
}
],
"taproot_internal_key": "b285c0aeabaf9104034deb39b57443a7ae6763b28c608bd9d5d1f52c8474f9cb",
"musig2_participant_pubkeys": [
{
"aggregate_pubkey": "02b285c0aeabaf9104034deb39b57443a7ae6763b28c608bd9d5d1f52c8474f9cb",
"participant_pubkeys": [
"0269cd634538d451c95b1e9211605677542b19c813fc7a46795e39a19fd3053d59",
"031e4be4d329cb508f5b424564d23bb07f4f3e00b52797df607eabe25ebf7ff6ba"
]
}
]
}
],
"outputs": [
{
},
{
}
],
"fee": 0.00000040
}
But why isn't it now ready for a Signer? I think this is the point where something's not clicking.
Nonetheless, I pass to the other wallets for signing:
psbt1=$(bitcoin-cli -rpcwallet="musig1" walletprocesspsbt $psbt | jq -r '.psbt')
psbt2=$(bitcoin-cli -rpcwallet="musig2" walletprocesspsbt $psbt | jq -r '.psbt')
It gets bigger each time as expected:
echo $psbt
cHNidP8BAHECAAAAAb92RElU0s3Ym3rvvPjzwdRd3EwilAcHjRmi2x9GonbTAAAAAAD9////AnQTAAAAAAAAFgAUgB9qsjVpxHf+z173+3VowggYUgB0EwAAAAAAABYAFAr+n/tPBxAg7W9lfJeIEIHys2wsAAAAAAABASsQJwAAAAAAACJRIAqLKT11cns8LFAbOiUf+gr7u4CeydGycudbKxJMfVNsIRYeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugUAyyGNAyEWac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkFAAPwc1QhFrKFwK6rr5EEA03rObV0Q6euZ2OyjGCL2dXR9SyEdPnLBQBaEkdwARcgsoXArquvkQQDTes5tXRDp65nY7KMYIvZ1dH1LIR0+csiGgKyhcCuq6+RBANN6zm1dEOnrmdjsoxgi9nV0fUshHT5y0ICac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkDHkvk0ynLUI9bQkVk0juwf08+ALUnl99gfqviXr9/9roAAAA=
echo $psbt1
cHNidP8BAHECAAAAAb92RElU0s3Ym3rvvPjzwdRd3EwilAcHjRmi2x9GonbTAAAAAAD9////AnQTAAAAAAAAFgAUgB9qsjVpxHf+z173+3VowggYUgB0EwAAAAAAABYAFAr+n/tPBxAg7W9lfJeIEIHys2wsAAAAAAABASsQJwAAAAAAACJRIAqLKT11cns8LFAbOiUf+gr7u4CeydGycudbKxJMfVNsIRYeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugUAyyGNAyEWac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkFAAPwc1QhFrKFwK6rr5EEA03rObV0Q6euZ2OyjGCL2dXR9SyEdPnLBQBaEkdwARcgsoXArquvkQQDTes5tXRDp65nY7KMYIvZ1dH1LIR0+csiGgKyhcCuq6+RBANN6zm1dEOnrmdjsoxgi9nV0fUshHT5y0ICac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkDHkvk0ynLUI9bQkVk0juwf08+ALUnl99gfqviXr9/9rpDGwMeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugIKiyk9dXJ7PCxQGzolH/oK+7uAnsnRsnLnWysSTH1TbEIDUW0NpPynpLb9EXN8T2YvnwqTD3pCQ7UprBoOTpfeyAUCSwTI/x0Xt4jSD/2/CwfC4nunxxiH5l3Bg9MkPuJO9IYAIgIDxMqMXLVL9Es9WxXOuTQqMT1pp/KQksHu2z5P3E8U1o8YIdUHUVQAAIABAACAAAAAgAAAAAAEAAAAAAA=
echo $psbt2
cHNidP8BAHECAAAAAb92RElU0s3Ym3rvvPjzwdRd3EwilAcHjRmi2x9GonbTAAAAAAD9////AnQTAAAAAAAAFgAUgB9qsjVpxHf+z173+3VowggYUgB0EwAAAAAAABYAFAr+n/tPBxAg7W9lfJeIEIHys2wsAAAAAAABASsQJwAAAAAAACJRIAqLKT11cns8LFAbOiUf+gr7u4CeydGycudbKxJMfVNsIRYeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugUAyyGNAyEWac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkFAAPwc1QhFrKFwK6rr5EEA03rObV0Q6euZ2OyjGCL2dXR9SyEdPnLBQBaEkdwARcgsoXArquvkQQDTes5tXRDp65nY7KMYIvZ1dH1LIR0+csiGgKyhcCuq6+RBANN6zm1dEOnrmdjsoxgi9nV0fUshHT5y0ICac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkDHkvk0ynLUI9bQkVk0juwf08+ALUnl99gfqviXr9/9rpDGwJpzWNFONRRyVsekhFgVndUKxnIE/x6RnleOaGf0wU9WQIKiyk9dXJ7PCxQGzolH/oK+7uAnsnRsnLnWysSTH1TbEIDZOz5xPC+llfCjYxmcE7DQJaPvc6oCPMi8fljIPAS/7gCIYc1WFqSDDm3qtvYJY5yAa5OeSTpIZp/ninkCYZGsWcAACICAy4i+I2kVFm1W9ULY9/+ssHe6VkymFBX7NgkxBgff6unGLFWOEVUAACAAQAAgAAAAIAAAAAAAgAAAAA=
So I combine them:
psbt_complete=$(bitcoin-cli combinepsbt '''["'$psbt1'", "'$psbt2'"]''')
Here's that "complete" PSBT:
cHNidP8BAHECAAAAAb92RElU0s3Ym3rvvPjzwdRd3EwilAcHjRmi2x9GonbTAAAAAAD9////AnQTAAAAAAAAFgAUgB9qsjVpxHf+z173+3VowggYUgB0EwAAAAAAABYAFAr+n/tPBxAg7W9lfJeIEIHys2wsAAAAAAABASsQJwAAAAAAACJRIAqLKT11cns8LFAbOiUf+gr7u4CeydGycudbKxJMfVNsIRYeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugUAyyGNAyEWac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkFAAPwc1QhFrKFwK6rr5EEA03rObV0Q6euZ2OyjGCL2dXR9SyEdPnLBQBaEkdwARcgsoXArquvkQQDTes5tXRDp65nY7KMYIvZ1dH1LIR0+csiGgKyhcCuq6+RBANN6zm1dEOnrmdjsoxgi9nV0fUshHT5y0ICac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkDHkvk0ynLUI9bQkVk0juwf08+ALUnl99gfqviXr9/9rpDGwJpzWNFONRRyVsekhFgVndUKxnIE/x6RnleOaGf0wU9WQIKiyk9dXJ7PCxQGzolH/oK+7uAnsnRsnLnWysSTH1TbEIDZOz5xPC+llfCjYxmcE7DQJaPvc6oCPMi8fljIPAS/7gCIYc1WFqSDDm3qtvYJY5yAa5OeSTpIZp/ninkCYZGsWdDGwMeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugIKiyk9dXJ7PCxQGzolH/oK+7uAnsnRsnLnWysSTH1TbEIDUW0NpPynpLb9EXN8T2YvnwqTD3pCQ7UprBoOTpfeyAUCSwTI/x0Xt4jSD/2/CwfC4nunxxiH5l3Bg9MkPuJO9IYAIgIDxMqMXLVL9Es9WxXOuTQqMT1pp/KQksHu2z5P3E8U1o8YIdUHUVQAAIABAACAAAAAgAAAAAAEAAAAACICAy4i+I2kVFm1W9ULY9/+ssHe6VkymFBX7NgkxBgff6unGLFWOEVUAACAAQAAgAAAAIAAAAAAAgAAAAA=
It still thinks it's waiting for an updater:
bitcoin-cli analyzepsbt $psbt_complete
{
"inputs": [
{
"has_utxo": true,
"is_final": false,
"next": "updater"
}
],
"estimated_vsize": 130,
"estimated_feerate": 0.00000307,
"fee": 0.00000040,
"next": "updater"
}
Here's what the final PSBT looks like:
bitcoin-cli decodepsbt $psbt_complete
{
"tx": {
"txid": "6b752ed99150f6cde71de6b9a5ea728bc2d908289744262b569da23eea60896f",
"hash": "6b752ed99150f6cde71de6b9a5ea728bc2d908289744262b569da23eea60896f",
"version": 2,
"size": 113,
"vsize": 113,
"weight": 452,
"locktime": 0,
"vin": [
{
"txid": "d376a2461fdba2198d070794224cdc5dd4c1f3f8bcef7a9bd8cdd254494476bf",
"vout": 0,
"scriptSig": {
"asm": "",
"hex": ""
},
"sequence": 4294967293
}
],
"vout": [
{
"value": 0.00004980,
"n": 0,
"scriptPubKey": {
"asm": "0 801f6ab23569c477fecf5ef7fb7568c208185200",
"desc": "addr(tb1qsq0k4v34d8z80lk0tmmlkatgcgyps5sq67nv2g)#52328mds",
"hex": "0014801f6ab23569c477fecf5ef7fb7568c208185200",
"address": "tb1qsq0k4v34d8z80lk0tmmlkatgcgyps5sq67nv2g",
"type": "witness_v0_keyhash"
}
},
{
"value": 0.00004980,
"n": 1,
"scriptPubKey": {
"asm": "0 0afe9ffb4f071020ed6f657c97881081f2b36c2c",
"desc": "addr(tb1qptlfl760qugzpmt0v47f0zqss8etxmpvpvgj5p)#9fgy0vvy",
"hex": "00140afe9ffb4f071020ed6f657c97881081f2b36c2c",
"address": "tb1qptlfl760qugzpmt0v47f0zqss8etxmpvpvgj5p",
"type": "witness_v0_keyhash"
}
}
]
},
"global_xpubs": [
],
"psbt_version": 0,
"proprietary": [
],
"unknown": {
},
"inputs": [
{
"witness_utxo": {
"amount": 0.00010000,
"scriptPubKey": {
"asm": "1 0a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c",
"desc": "rawtr(0a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c)#wrut38c9",
"hex": "51200a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c",
"address": "tb1pp29jj0t4wfanctzsrvaz28l6ptamhqy7e8gmyuh8tv43ynra2dkqsskyne",
"type": "witness_v1_taproot"
}
},
"taproot_bip32_derivs": [
{
"pubkey": "1e4be4d329cb508f5b424564d23bb07f4f3e00b52797df607eabe25ebf7ff6ba",
"master_fingerprint": "cb218d03",
"path": "m",
"leaf_hashes": [
]
},
{
"pubkey": "69cd634538d451c95b1e9211605677542b19c813fc7a46795e39a19fd3053d59",
"master_fingerprint": "03f07354",
"path": "m",
"leaf_hashes": [
]
},
{
"pubkey": "b285c0aeabaf9104034deb39b57443a7ae6763b28c608bd9d5d1f52c8474f9cb",
"master_fingerprint": "5a124770",
"path": "m",
"leaf_hashes": [
]
}
],
"taproot_internal_key": "b285c0aeabaf9104034deb39b57443a7ae6763b28c608bd9d5d1f52c8474f9cb",
"musig2_participant_pubkeys": [
{
"aggregate_pubkey": "02b285c0aeabaf9104034deb39b57443a7ae6763b28c608bd9d5d1f52c8474f9cb",
"participant_pubkeys": [
"0269cd634538d451c95b1e9211605677542b19c813fc7a46795e39a19fd3053d59",
"031e4be4d329cb508f5b424564d23bb07f4f3e00b52797df607eabe25ebf7ff6ba"
]
}
],
"musig2_pubnonces": [
{
"participant_pubkey": "0269cd634538d451c95b1e9211605677542b19c813fc7a46795e39a19fd3053d59",
"aggregate_pubkey": "020a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c",
"pubnonce": "0364ecf9c4f0be9657c28d8c66704ec340968fbdcea808f322f1f96320f012ffb802218735585a920c39b7aadbd8258e7201ae4e7924e9219a7f9e29e4098646b167"
},
{
"participant_pubkey": "031e4be4d329cb508f5b424564d23bb07f4f3e00b52797df607eabe25ebf7ff6ba",
"aggregate_pubkey": "020a8b293d75727b3c2c501b3a251ffa0afbbb809ec9d1b272e75b2b124c7d536c",
"pubnonce": "03516d0da4fca7a4b6fd11737c4f662f9f0a930f7a4243b529ac1a0e4e97dec805024b04c8ff1d17b788d20ffdbf0b07c2e27ba7c71887e65dc183d3243ee24ef486"
}
]
}
],
"outputs": [
{
"bip32_derivs": [
{
"pubkey": "03c4ca8c5cb54bf44b3d5b15ceb9342a313d69a7f29092c1eedb3e4fdc4f14d68f",
"master_fingerprint": "21d50751",
"path": "m/84h/1h/0h/0/4"
}
]
},
{
"bip32_derivs": [
{
"pubkey": "032e22f88da45459b55bd50b63dffeb2c1dee95932985057ecd824c4181f7faba7",
"master_fingerprint": "b1563845",
"path": "m/84h/1h/0h/0/2"
}
]
}
],
"fee": 0.00000040
}
Unsurprisingly, I can't complete it:
bitcoin-cli finalizepsbt $psbt_complete
{
"psbt": "cHNidP8BAHECAAAAAb92RElU0s3Ym3rvvPjzwdRd3EwilAcHjRmi2x9GonbTAAAAAAD9////AnQTAAAAAAAAFgAUgB9qsjVpxHf+z173+3VowggYUgB0EwAAAAAAABYAFAr+n/tPBxAg7W9lfJeIEIHys2wsAAAAAAABASsQJwAAAAAAACJRIAqLKT11cns8LFAbOiUf+gr7u4CeydGycudbKxJMfVNsIRYeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugUAyyGNAyEWac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkFAAPwc1QhFrKFwK6rr5EEA03rObV0Q6euZ2OyjGCL2dXR9SyEdPnLBQBaEkdwARcgsoXArquvkQQDTes5tXRDp65nY7KMYIvZ1dH1LIR0+csiGgKyhcCuq6+RBANN6zm1dEOnrmdjsoxgi9nV0fUshHT5y0ICac1jRTjUUclbHpIRYFZ3VCsZyBP8ekZ5Xjmhn9MFPVkDHkvk0ynLUI9bQkVk0juwf08+ALUnl99gfqviXr9/9rpDGwJpzWNFONRRyVsekhFgVndUKxnIE/x6RnleOaGf0wU9WQIKiyk9dXJ7PCxQGzolH/oK+7uAnsnRsnLnWysSTH1TbEIDZOz5xPC+llfCjYxmcE7DQJaPvc6oCPMi8fljIPAS/7gCIYc1WFqSDDm3qtvYJY5yAa5OeSTpIZp/ninkCYZGsWdDGwMeS+TTKctQj1tCRWTSO7B/Tz4AtSeX32B+q+Jev3/2ugIKiyk9dXJ7PCxQGzolH/oK+7uAnsnRsnLnWysSTH1TbEIDUW0NpPynpLb9EXN8T2YvnwqTD3pCQ7UprBoOTpfeyAUCSwTI/x0Xt4jSD/2/CwfC4nunxxiH5l3Bg9MkPuJO9IYAIgIDxMqMXLVL9Es9WxXOuTQqMT1pp/KQksHu2z5P3E8U1o8YIdUHUVQAAIABAACAAAAAgAAAAAAEAAAAACICAy4i+I2kVFm1W9ULY9/+ssHe6VkymFBX7NgkxBgff6unGLFWOEVUAACAAQAAgAAAAIAAAAAAAgAAAAA=",
"complete": false
}
So that's the pretty complete rundown of where I got the keys from, how I created my MuSig2 descriptor, and how I tried to make the PSBT.
Where did I go wrong in this? Why can't I get the PSBT past the Updater stage? What are the wallets with the private keys doing if not offering signatures?
Hoping to get this documented for the next person!
Thanks!
from Recent Questions - Bitcoin Stack Exchange https://ift.tt/kiERuFS
via IFTTT