Taproot

使用 PSBT 進行 Taproot 簽名:如何確定簽名方法?

  • April 28, 2022

據我所知,您可以通過三種方式在 Taproot 環境中生成有效的 Schnorr 簽名:

  1. 對於使用BIP-0086承諾的 p2tr 輸出(密鑰支出,使用內部密鑰簽名,使用 調整h_tapTweak(internalKey)*G
  2. 對於送出到腳本樹根雜湊的 p2tr 輸出(密鑰花費,使用內部密鑰簽名,使用 調整h_tapTweak(internalKey || scriptRoot)*G
  3. 對於送出到腳本 merkle 樹根雜湊的 p2tr 輸出(腳本花費,使用任何密鑰簽名以滿足葉腳本)

我如何找出上述哪些簽名“方法”預計將由 PSBT 簽名者生成?

更新後的BIP-0174文件僅提及輸入和輸出的所有新 Taproot 相關欄位,但未提及如何解釋它們以及哪些值組合是有效的。

我在https://github.com/bitcoin/bitcoin/pull/22558中找到了一些測試向量,這些向量給了我一些線索,但我不確定我是否遺漏了更詳細地描述 PSBT 簽名過程的重要資源?

到目前為止,這是我能夠拼湊的:

  1. (p2tr BIP-0086 密鑰支出):PSBT_IN_TAP_BIP32_DERIVATION使用內部密鑰和零/空葉雜湊設置。
  2. (p2tr 腳本根雜湊密鑰花費):PSBT_IN_TAP_BIP32_DERIVATION使用內部密鑰零/空葉雜湊設置,設置PSBT_IN_TAP_MERKLE_ROOT為 merkle 根雜湊。
  3. (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

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