Bitcoin-Core

從 Taproot 多重簽名地址簽署 PSBT 以使用

  • October 29, 2022

我按照Pieter Wuille 在這篇文章中概述的步驟使用importdescriptors和創建了一個 2-of-3 多重簽名主根地址deriveaddresses。他的步驟完美無缺,我能夠從 3 個 pubkeys 創建地址沒問題。

我的問題是我不知道如何從資助地址消費(有點大不了)

我在 Signet 上使用 Bitcoin Core QT 控制台,24.0rc2。

我正在使用我設置的 4 個不同的錢包。所有都是描述符錢包,但第 4 個已禁用私鑰,因此我可以導入主根描述符並創建多重簽名地址。

我在 3 個正常描述符錢包中的每一個中使用getnewaddressgetaddressinfo來獲取地址和相應的 66 字元十六進制公鑰。

我使用這 3 個公鑰創建了主根描述符

0249f48bd0c87f48a3d4d0fd5f0a2571861fd1891b092a41bd3546a93bc6db97ae, 03cde9c66862a392780e6868a7fd245273eff736a516d0f950a4e027d4d83d9194, 02d56baf4e4b77932b2f195598c68b63ee98827f21acb660b34bbf3ebf1862fc2e

使用上述連結文章中的這種格式;tr(KI,multi_a(2,K1,K2,K3))#12345678

我得到了這個描述符;

tr(50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,multi_a(2,0249f48bd0c87f48a3d4d0fd5f0a2571861fd1891b092a41bd3546a93bc6db97ae,03cde9c66862a392780e6868a7fd245273eff736a516d0f950a4e027d4d83d9194,02d56baf4e4b77932b2f195598c68b63ee98827f21acb660b34bbf3ebf1862fc2e))#s7q27ueu

對於 KI,我使用了上述連結文章中提到的 BIP341 PW 的不可消耗的輸出。

使用後importdescriptorsderiveaddresses我得到了這個主根多重簽名地址;

tb1p6vzv5za7pc9503fkvexccv4qm43z6600lhpj3k7sem9w3vdh8xjqanz5ld

我通過交易資助了該地址。

txid=071a04111096e77bfb8a5b1518b2ea5dca6adac245d41b4025fb50ed4a740819

然後我用這個命令創建了一個 PSBT;

createpsbt \
'[{"txid": "071a04111096e77bfb8a5b1518b2ea5dca6adac245d41b4025fb50ed4a740819", "vout": 0, "sequence":1}]' \
'{"tb1qlxrmerprf9h2tgnlysltcs2lcc4dj9hjtu9se5": 0.0002}'

這返回了一個 PBST;

cHNidP8BAFICAAAAARkIdErtUPslQBvURcLaaspd6rIYFVuK+3vnlhARBBoHAAAAAAABAAAAASBOAAAAAAAAFgAU+Ye8jCNJbqWifyQ+vEFfxirZFvIAAAAAAAAA

解碼 PSBT 返回;

{
 "tx": {
   "txid": "52063d0c2ec3f7fc60702e98c0a39e057ee71ae583ddace3d1d68f7a8cb5c125",
   "hash": "52063d0c2ec3f7fc60702e98c0a39e057ee71ae583ddace3d1d68f7a8cb5c125",
   "version": 2,
   "size": 82,
   "vsize": 82,
   "weight": 328,
   "locktime": 0,
   "vin": [
     {
       "txid": "071a04111096e77bfb8a5b1518b2ea5dca6adac245d41b4025fb50ed4a740819",
       "vout": 0,
       "scriptSig": {
         "asm": "",
         "hex": ""
       },
       "sequence": 1
     }
   ],
   "vout": [
     {
       "value": 0.00020000,
       "n": 0,
       "scriptPubKey": {
         "asm": "0 f987bc8c23496ea5a27f243ebc415fc62ad916f2",
         "desc": "addr(tb1qlxrmerprf9h2tgnlysltcs2lcc4dj9hjtu9se5)#jhwtg3zn",
         "hex": "0014f987bc8c23496ea5a27f243ebc415fc62ad916f2",
         "address": "tb1qlxrmerprf9h2tgnlysltcs2lcc4dj9hjtu9se5",
         "type": "witness_v0_keyhash"
       }
     }
   ]
 },
 "global_xpubs": [
 ],
 "psbt_version": 0,
 "proprietary": [
 ],
 "unknown": {
 },
 "inputs": [
   {
   }
 ],
 "outputs": [
   {
   }
 ]

現在這裡是我遇到問題的地方,我在 Wallet1 中打開 PSBT 執行walletprocesspsbt它返回 false,這通常可能沒問題,但 PSBT 數據沒有改變,所以我可以說什麼都沒發生,它確實無法處理;

   {
 "psbt": "cHNidP8BAFICAAAAARkIdErtUPslQBvURcLaaspd6rIYFVuK+3vnlhARBBoHAAAAAAABAAAAASBOAAAAAAAAFgAU+Ye8jCNJbqWifyQ+vEFfxirZFvIAAAAAAAAA",
 "complete": false
}

我在 Wallet2 和 Wallet3 中得到相同的結果。這些是用於創建主根描述符中使用的地址/公鑰的錢包。

然後只是為了看看發生了什麼,我在禁用私鑰的錢包中嘗試了相同的命令(我將 tr 描述符導入並創建地址的錢包)。作為說明,如果我執行 listunspent,我可以看到資金 tx(我試圖在 PSBT 上花費的資金)。這會返回不同的 PSBT 數據,但仍然是錯誤的;

{
 "psbt": "cHNidP8BAFICAAAAARkIdErtUPslQBvURcLaaspd6rIYFVuK+3vnlhARBBoHAAAAAAABAAAAASBOAAAAAAAAFgAU+Ye8jCNJbqWifyQ+vEFfxirZFvIAAAAAAAEBKxdPAAAAAAAAIlEg0wTKC74OC0fFNmZNjDKg3WItae/9wyjb0M7K6LG3OaQiFcBQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wGkgSfSL0Mh/SKPU0P1fCiVxhh/RiRsJKkG9NUapO8bbl66sIM3pxmhio5J4Dmhop/0kUnPv9zalFtD5UKTgJ9TYPZGUuiDVa69OS3eTKy8ZVZjGi2PumIJ/Iay2YLNLvz6/GGL8LrpSnMAhFlCSm3TBoElUt4tLYDXpel4HiloPKOyW1Ue/7prOgDrABQB8Rh5dARcgUJKbdMGgSVS3i0tgNel6XgeKWg8o7JbVR7/ums6AOsABGCDt29WnxAqM6dFJQ1DxQsSQgva1MP5WQW1URX0xZXSThwAA",
 "complete": false
}

解碼 PSBT 得到這個結果;

{
 "tx": {
   "txid": "52063d0c2ec3f7fc60702e98c0a39e057ee71ae583ddace3d1d68f7a8cb5c125",
   "hash": "52063d0c2ec3f7fc60702e98c0a39e057ee71ae583ddace3d1d68f7a8cb5c125",
   "version": 2,
   "size": 82,
   "vsize": 82,
   "weight": 328,
   "locktime": 0,
   "vin": [
     {
       "txid": "071a04111096e77bfb8a5b1518b2ea5dca6adac245d41b4025fb50ed4a740819",
       "vout": 0,
       "scriptSig": {
         "asm": "",
         "hex": ""
       },
       "sequence": 1
     }
   ],
   "vout": [
     {
       "value": 0.00020000,
       "n": 0,
       "scriptPubKey": {
         "asm": "0 f987bc8c23496ea5a27f243ebc415fc62ad916f2",
         "desc": "addr(tb1qlxrmerprf9h2tgnlysltcs2lcc4dj9hjtu9se5)#jhwtg3zn",
         "hex": "0014f987bc8c23496ea5a27f243ebc415fc62ad916f2",
         "address": "tb1qlxrmerprf9h2tgnlysltcs2lcc4dj9hjtu9se5",
         "type": "witness_v0_keyhash"
       }
     }
   ]
 },
 "global_xpubs": [
 ],
 "psbt_version": 0,
 "proprietary": [
 ],
 "unknown": {
 },
 "inputs": [
   {
     "witness_utxo": {
       "amount": 0.00020247,
       "scriptPubKey": {
         "asm": "1 d304ca0bbe0e0b47c536664d8c32a0dd622d69effdc328dbd0cecae8b1b739a4",
         "desc": "rawtr(d304ca0bbe0e0b47c536664d8c32a0dd622d69effdc328dbd0cecae8b1b739a4)#sn2t4sme",
         "hex": "5120d304ca0bbe0e0b47c536664d8c32a0dd622d69effdc328dbd0cecae8b1b739a4",
         "address": "tb1p6vzv5za7pc9503fkvexccv4qm43z6600lhpj3k7sem9w3vdh8xjqanz5ld",
         "type": "witness_v1_taproot"
       }
     },
     "taproot_scripts": [
       {
         "script": "2049f48bd0c87f48a3d4d0fd5f0a2571861fd1891b092a41bd3546a93bc6db97aeac20cde9c66862a392780e6868a7fd245273eff736a516d0f950a4e027d4d83d9194ba20d56baf4e4b77932b2f195598c68b63ee98827f21acb660b34bbf3ebf1862fc2eba529c",
         "leaf_ver": 192,
         "control_blocks": [
           "c050929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0"
         ]
       }
     ],
     "taproot_bip32_derivs": [
       {
         "pubkey": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0",
         "master_fingerprint": "7c461e5d",
         "path": "m",
         "leaf_hashes": [
         ]
       }
     ],
     "taproot_internal_key": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0",
     "taproot_merkle_root": "eddbd5a7c40a8ce9d1494350f142c49082f6b530fe56416d54457d3165749387"
   }
 ],
 "outputs": [
   {
   }
 ],
 "fee": 0.00000247
}

我嘗試將這個 PSBT 帶入其他 3 個錢包,看看他們是否可以處理這個 PSBT,但都給出了相同的結果,錯誤,並且 PSBT 數據沒有變化。

那麼我應該怎麼做才能獲得可以實際組合和最終確定的 PSBT?

當您使用 來創建 PSBT 時createpsbt,它不包含有關輸入的任何資訊。由於錢包 1-3 也沒有有關輸入的任何資訊,因此他們無法對其進行簽名。只有 wallet4 有關於輸入的資訊。因此,您必須使用walletprocesspsbtwallet4 來填寫該資訊,然後再前往 wallet1-3 進行簽名。

但是,看起來multi_a邏輯中存在一個錯誤,沒有填寫 wallet4 的所有資訊,導致 wallet1-3 仍然無法簽名。


我已經打開了一個PR應該可以解決這個問題。

引用自:https://bitcoin.stackexchange.com/questions/115742