Multi-Signature – Can I sign multi-signature transactions with only the private key of a descriptor-based wallet?
When using Bitcoin multisig UTXOs, you will need either a public key or a usage script/witness script to sign the transaction.
An experiment to see if we can sign a transaction without a public key:
run
bitcoind -signet=1 -rpcport=38332 -rpcuser=user -rpcpassword=password
Create 3 wallets: m1, m2, m3
$ bitcoin-cli -named createwallet wallet_name=m1 descriptors=false
Get 3 public keys from each wallet:
$ bitcoin-cli -rpcwallet=m1 getnewaddress tb1q8hz93lwkmzjq2yapxr6mnsfwjt5wvp2f5zgm98 $ bitcoin-cli -rpcwallet=m1 getaddressinfo tb1q8hz93lwkmzjq2yapxr6mnsfwjt5wvp2f5zgm98 "address": "tb1q8hz93lwkmzjq2yapxr6mnsfwjt5wvp2f5zgm98", "scriptPubKey": "00143dc458fdd6d8a40513a130f5b9c12e92e8e60549", "ismine": true, "solvable": true, "desc": "wpkh((045471ed/0'/0'/1')039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716)#wht4f5zk", "iswatchonly": false, "isscript": false, "iswitness": true, "witness_version": 0, "witness_program": "3dc458fdd6d8a40513a130f5b9c12e92e8e60549", "pubkey": "039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716", "ischange": false, "timestamp": 1663309171, "hdkeypath": "m/0'/0'/1'", "hdseedid": "ccd54fe6a42efde5251f8443f1edd7ebcf25fefa", "hdmasterfingerprint": "045471ed", "labels": ( "" )
Create two out of three multi-signatures using your public key.
$ bitcoin-cli createmultisig 2 "(\"039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716\",\"0359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc2323279\",\"037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec4046\")" "address": "2N7WpySLj8bBGFrZE8hxQUm29ZCwaqz5FvT", "redeemScript": "5221039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716210359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc232327921037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec404653ae", "descriptor": "sh(multi(2,039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716,0359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc2323279,037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec4046))#jqk9dcqj"
Send 0.001 sBTC to the multisig address using the Signet Faucet.
0b30a06e2653b84b0b976559a0efc9018a6da2a4ea6c71c346496d2ac36e43b5
To use this UTXO, create a PSBT.
$ bitcoin-cli createpsbt "(\"txid\":\"0b30a06e2653b84b0b976559a0efc9018a6da2a4ea6c71c346496d2ac36e43b5\",\"vout\":1)" "(\"tb1qvl3a3l8ejuyk62qfz2kjjxdndcrk99ldxchqvx\":\"0.0009\")" cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAAA
you will get
"complete": false
If you try to sign with 2 wallets using:walletprocesspsbt
or individually signed, combinedcombinepsbt
nextfinalizepsbt
Get the multisig address from m1, descriptors (including all public keys) from m2, and redemption script from m3 wallet.
$ bitcoin-cli -rpcwallet=m1 importmulti '( "scriptPubKey": "address": "2N7WpySLj8bBGFrZE8hxQUm29ZCwaqz5FvT" , "timestamp":"now", "watchonly": true )'
(
"success": true
)
$ bitcoin-cli -rpcwallet=m2 importmulti '( "desc": "sh(multi(2,039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716,0359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc2323279,037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec4046))#jqk9dcqj", "timestamp":"now", "watchonly": true )'
(
"success": true
)
$ bitcoin-cli -rpcwallet=m3 importmulti '( "scriptPubKey": "a9149c85346a6ea0c2b6c6904e5c464df6ef84fe170587", "redeemscript": "5221039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716210359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc232327921037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec404653ae", "timestamp":"now", "watchonly": true )'
(
"success": true
)
Try signing with m1 and m2 or m1 and m3. It doesn’t work.
$ bitcoin-cli -rpcwallet=m1 walletprocesspsbt cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAAA "psbt": "cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBAAAA", "complete": false $ bitcoin-cli -rpcwallet=m2 walletprocesspsbt cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBAAAA "psbt": "cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBACICA1lZHfKbvNuPsuTN5dkuzIxmmNnwqyfy92k4zd3CMjJ5RzBEAiB1+POriSk9sPSZnMxkCE6oDKiLmYNW5KxuRN/q0nJJmgIgWM3ZX3ryJEDKhcyM4NI9wnLpMqkIXZwTueM33kYUysgBAQRpUiEDmSeEIIDMSiLS1KY8E7PZpmVk4jB3WYHwOXZ4ev5s9xYhA1lZHfKbvNuPsuTN5dkuzIxmmNnwqyfy92k4zd3CMjJ5IQN+RFJqg/2yyJ3oA1bu2hu/2zc4obO3DDxx6pX+ruxARlOuIgYDWVkd8pu824+y5M3l2S7MjGaY2fCrJ/L3aTjN3cIyMnkExzmGAiIGA35EUmqD/bLInegDVu7aG7/bNzihs7cMPHHqlf6u7EBGBIup2JAiBgOZJ4QggMxKItLUpjwTs9mmZWTiMHdZgfA5dnh6/mz3FgQ9xFj9AAA=", "complete": false
But it works for m2 and m3.
$ bitcoin-cli -rpcwallet=m2 walletprocesspsbt cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAAA "psbt": "cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBACICA1lZHfKbvNuPsuTN5dkuzIxmmNnwqyfy92k4zd3CMjJ5RzBEAiB1+POriSk9sPSZnMxkCE6oDKiLmYNW5KxuRN/q0nJJmgIgWM3ZX3ryJEDKhcyM4NI9wnLpMqkIXZwTueM33kYUysgBAQRpUiEDmSeEIIDMSiLS1KY8E7PZpmVk4jB3WYHwOXZ4ev5s9xYhA1lZHfKbvNuPsuTN5dkuzIxmmNnwqyfy92k4zd3CMjJ5IQN+RFJqg/2yyJ3oA1bu2hu/2zc4obO3DDxx6pX+ruxARlOuIgYDWVkd8pu824+y5M3l2S7MjGaY2fCrJ/L3aTjN3cIyMnkExzmGAiIGA35EUmqD/bLInegDVu7aG7/bNzihs7cMPHHqlf6u7EBGBIup2JAiBgOZJ4QggMxKItLUpjwTs9mmZWTiMHdZgfA5dnh6/mz3FgQ9xFj9AAA=", "complete": false $ bitcoin-cli -rpcwallet=m3 walletprocesspsbt cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBACICA1lZHfKbvNuPsuTN5dkuzIxmmNnwqyfy92k4zd3CMjJ5RzBEAiB1+POriSk9sPSZnMxkCE6oDKiLmYNW5KxuRN/q0nJJmgIgWM3ZX3ryJEDKhcyM4NI9wnLpMqkIXZwTueM33kYUysgBAQRpUiEDmSeEIIDMSiLS1KY8E7PZpmVk4jB3WYHwOXZ4ev5s9xYhA1lZHfKbvNuPsuTN5dkuzIxmmNnwqyfy92k4zd3CMjJ5IQN+RFJqg/2yyJ3oA1bu2hu/2zc4obO3DDxx6pX+ruxARlOuIgYDWVkd8pu824+y5M3l2S7MjGaY2fCrJ/L3aTjN3cIyMnkExzmGAiIGA35EUmqD/bLInegDVu7aG7/bNzihs7cMPHHqlf6u7EBGBIup2JAiBgOZJ4QggMxKItLUpjwTs9mmZWTiMHdZgfA5dnh6/mz3FgQ9xFj9AAA= "psbt": "cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBAAEH/ABHMEQCIHX486uJKT2w9JmczGQITqgMqIuZg1bkrG5E3+rSckmaAiBYzdlfevIkQMqFzIzg0j3CcukyqQhdnBO54zfeRhTKyAFHMEQCIA2bI9IQ/SOsgaFtU5d7TFj3Em6Cy/Zm9YuS0zeAgOSvAiAZvOhcoFe6MQB1V4aMDqW1cXIrTiIDxSERdY2MMK/xuQFMaVIhA5knhCCAzEoi0tSmPBOz2aZlZOIwd1mB8Dl2eHr+bPcWIQNZWR3ym7zbj7LkzeXZLsyMZpjZ8Ksn8vdpOM3dwjIyeSEDfkRSaoP9ssid6ANW7tobv9s3OKGztww8ceqV/q7sQEZTrgAA", "complete": true
This transaction can be completed and broadcast.
$ bitcoin-cli finalizepsbt cHNidP8BAFICAAAAAbVDbsMqbUlGw3Fs6qSibYoBye+gWWWXC0u4UyZuoDALAQAAAAD9////AZBfAQAAAAAAFgAUZ+PY/PmXCW0oCRKtKRmzbgdil+0AAAAAAAEAcgIAAAABf9MjFLP83xBP8nl17j6VId+Y2UW/5seoLnxCqNnLOAcAAAAAAP7///8CMew0w1QGAAAWABRA3SSDttwD9s5g86KiG+bhufb1caCGAQAAAAAAF6kUnIU0am6gwrbGkE5cRk3274T+FwWH1qYBAAEH/ABHMEQCIHX486uJKT2w9JmczGQITqgMqIuZg1bkrG5E3+rSckmaAiBYzdlfevIkQMqFzIzg0j3CcukyqQhdnBO54zfeRhTKyAFHMEQCIA2bI9IQ/SOsgaFtU5d7TFj3Em6Cy/Zm9YuS0zeAgOSvAiAZvOhcoFe6MQB1V4aMDqW1cXIrTiIDxSERdY2MMK/xuQFMaVIhA5knhCCAzEoi0tSmPBOz2aZlZOIwd1mB8Dl2eHr+bPcWIQNZWR3ym7zbj7LkzeXZLsyMZpjZ8Ksn8vdpOM3dwjIyeSEDfkRSaoP9ssid6ANW7tobv9s3OKGztww8ceqV/q7sQEZTrgAA "hex": "0200000001b5436ec32a6d4946c3716ceaa4a26d8a01c9efa05965970b4bb853266ea0300b01000000fc00473044022075f8f3ab89293db0f4999ccc64084ea80ca88b998356e4ac6e44dfead272499a022058cdd95f7af22440ca85cc8ce0d23dc272e932a9085d9c13b9e337de4614cac80147304402200d9b23d210fd23ac81a16d53977b4c58f7126e82cbf666f58b92d3378080e4af022019bce85ca057ba31007557868c0ea5b571722b4e2203c52111758d8c30aff1b9014c695221039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716210359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc232327921037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec404653aefdffffff01905f01000000000016001467e3d8fcf997096d280912ad2919b36e076297ed00000000", "complete": true $ bitcoin-cli sendrawtransaction 0200000001b5436ec32a6d4946c3716ceaa4a26d8a01c9efa05965970b4bb853266ea0300b01000000fc00473044022075f8f3ab89293db0f4999ccc64084ea80ca88b998356e4ac6e44dfead272499a022058cdd95f7af22440ca85cc8ce0d23dc272e932a9085d9c13b9e337de4614cac80147304402200d9b23d210fd23ac81a16d53977b4c58f7126e82cbf666f58b92d3378080e4af022019bce85ca057ba31007557868c0ea5b571722b4e2203c52111758d8c30aff1b9014c695221039927842080cc4a22d2d4a63c13b3d9a66564e230775981f03976787afe6cf716210359591df29bbcdb8fb2e4cde5d92ecc8c6698d9f0ab27f2f76938cdddc232327921037e44526a83fdb2c89de80356eeda1bbfdb3738a1b3b70c3c71ea95feaeec404653aefdffffff01905f01000000000016001467e3d8fcf997096d280912ad2919b36e076297ed00000000 6f56b1b93a6053cb9e7b91ae4786a20f8d34f1d183022142c2fbf8a16d780766
send: 6f56b1b93a6053cb9e7b91ae4786a20f8d34f1d183022142c2fbf8a16d780766
You might also find this interesting: https://github.com/1440000bytes/p2p