Taproot

主根腳本路徑 sighash 中的最後一個字節是什麼?

  • October 25, 2022

我正在嘗試遵循BIP341來了解主根腳本路徑花費的簽名雜湊計算。

從比特幣測試框架程式碼中,我看到如果交易是從腳本路徑支出(而不是關鍵路徑支出),則 sighash 需要附加這些額外的字節。

   if (scriptpath):
       ss += TaggedHash("TapLeaf", bytes([leaf_ver]) + ser_string(script))
       ss += bytes([0])
       ss += struct.pack("<i", codeseparator_pos)

這些字節在 BIP 中描述在哪裡?

如果 BIP 不清楚,最後兩行的目的是什麼:0x00struct.pack("<i", codeseparator_pos)

您可以在BIP342中的common signature message extension下找到它。BIP342 簽名重用了大部分 BIP341 簽名雜湊結構,但添加了一些自己的欄位,以及更改了一個標誌位:

  • Tapleaf 雜湊:使用 BIP342 腳本花費需要送出實際腳本的雜湊(“tapleaf”),以確保為一個葉子創建的簽名不能在其他葉子中重用。這使得在相同輸出的不同腳本中多次重複使用相同的鍵是安全的。
  • 密鑰版本:由於 BIP342 允許引入新的公鑰類型(沒有新的見證版本、葉版本或新的操作碼),因此有一個保留字節用於指示該簽名使用的公鑰類型。目前始終為 0。
  • 程式碼分隔符位置:為了使 OP_CODESEPARATOR 的使用(之一)保留在這個新模型中,它的語義發生了變化。它沒有截斷“scriptCode”(主根腳本中不再存在的概念),它只記錄最後一次執行 OP_CODESEPARATOR 的時間(以執行和/或跳過的操作碼的數量),並且該數字包含在 sighash 中。如果沒有執行過這樣的操作碼,則數字為 0xffffffff。這樣做的目的是允許某人構造一個腳本來破壞某種形式的延展性:在執行 OP_CODESEPARATOR 之前和之後的檢查簽名操作的簽名不能在其他位置重用,即使它們使用相同的公鑰。

BIP341描述了主根輸出和支出的一般結構,以及關鍵路徑支出規則。它描述了腳本路徑成本是什麼,但在這種情況下應用的實際腳本語義留給未來的擴展。BIP342 專門描述了葉子版本為 0xc0 的主根葉子腳本的腳本語義。其他葉子版本可以由未來的 BIP 描述。

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