Taproot
使用 PSBT 進行 Taproot 簽名:如何確定簽名方法?
據我所知,您可以通過三種方式在 Taproot 環境中生成有效的 Schnorr 簽名:
- 對於使用BIP-0086承諾的 p2tr 輸出(密鑰支出,使用內部密鑰簽名,使用 調整
h_tapTweak(internalKey)*G
)- 對於送出到腳本樹根雜湊的 p2tr 輸出(密鑰花費,使用內部密鑰簽名,使用 調整
h_tapTweak(internalKey || scriptRoot)*G
)- 對於送出到腳本 merkle 樹根雜湊的 p2tr 輸出(腳本花費,使用任何密鑰簽名以滿足葉腳本)
我如何找出上述哪些簽名“方法”預計將由 PSBT 簽名者生成?
更新後的BIP-0174文件僅提及輸入和輸出的所有新 Taproot 相關欄位,但未提及如何解釋它們以及哪些值組合是有效的。
我在https://github.com/bitcoin/bitcoin/pull/22558中找到了一些測試向量,這些向量給了我一些線索,但我不確定我是否遺漏了更詳細地描述 PSBT 簽名過程的重要資源?
到目前為止,這是我能夠拼湊的:
- (p2tr BIP-0086 密鑰支出):
PSBT_IN_TAP_BIP32_DERIVATION
使用內部密鑰和零/空葉雜湊設置。- (p2tr 腳本根雜湊密鑰花費):
PSBT_IN_TAP_BIP32_DERIVATION
使用內部密鑰零/空葉雜湊設置,設置PSBT_IN_TAP_MERKLE_ROOT
為 merkle 根雜湊。- (p2tr 腳本花費):
PSBT_IN_TAP_BIP32_DERIVATION
使用內部密鑰和正在執行的葉子的葉子雜湊進行設置。還設置PSBT_IN_TAP_LEAF_SCRIPT
了控制塊和執行葉子的腳本。這看起來正確嗎?
如果是,那麼與在
PSBT_IN_TAP_INTERNAL_KEY
欄位中使用內部鍵相比,該欄位的意義是什麼PSBT_IN_TAP_BIP32_DERIVATION
?感覺就像我在這裡遺漏了一些東西。
是的,這看起來是正確的。
我想你是對的,這
PSBT_IN_TAP_INTERNAL_KEY
不是絕對必要的,但是 PSBT 的主要思想之一是包含盡可能多的資訊,並明確包含的資訊是什麼。因此,我們不是從 推斷內部密鑰PSBT_IN_TAP_BIP32_DERIVATION
,而是明確說明它是什麼PSBT_IN_TAP_INTERNAL_KEY
。也可以讓內部密鑰也成為腳本內部的密鑰(不知道為什麼你想要那樣,但它可能會發生)。在這種情況下,無法從 中推斷出哪個鍵是內部鍵
PSBT_IN_TAP_BIP32_DERIVATION
。