從 Taproot 多重簽名地址簽署 PSBT 以使用
我按照Pieter Wuille 在這篇文章中概述的步驟使用
importdescriptors
和創建了一個 2-of-3 多重簽名主根地址deriveaddresses
。他的步驟完美無缺,我能夠從 3 個 pubkeys 創建地址沒問題。我的問題是我不知道如何從資助地址消費(有點大不了)
我在 Signet 上使用 Bitcoin Core QT 控制台,24.0rc2。
我正在使用我設置的 4 個不同的錢包。所有都是描述符錢包,但第 4 個已禁用私鑰,因此我可以導入主根描述符並創建多重簽名地址。
我在 3 個正常描述符錢包中的每一個中使用
getnewaddress
和getaddressinfo
來獲取地址和相應的 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 的不可消耗的輸出。
使用後
importdescriptors
,deriveaddresses
我得到了這個主根多重簽名地址;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 有關於輸入的資訊。因此,您必須使用walletprocesspsbt
wallet4 來填寫該資訊,然後再前往 wallet1-3 進行簽名。但是,看起來
multi_a
邏輯中存在一個錯誤,沒有填寫 wallet4 的所有資訊,導致 wallet1-3 仍然無法簽名。我已經打開了一個PR應該可以解決這個問題。