TronGreen

BTC 協議與礦業閃電規格

閃電網路 Taproot 通道規格勘誤:照舊文實作恐產生無效花費

BOLTs #1352 於 10 月 19 日(UTC)合併,修正 Simple Taproot Channels 擴充規格中五組輸出金鑰公式、控制區塊內容、HTLC 簽章 sighash 說明與多組測試向量。

對照圖:左側列出 Simple Taproot Channels 舊規格中的金鑰公式、x-only、sighash 與遠端測試向量錯誤,右側列出修正後內容,下方為 Eclair 與 LND 對照新向量的結果
BOLTs #1352 修正前後對照與實作測試結果(TronGreen 編輯部自製圖表,資料來源:lightning/bolts PR #1352、Bitcoin Optech #428)

作者表示若照原文實作,可能產生無效花費;修正方向是對齊 LND 與 Eclair 現行實作,不改變協定行為。

重點摘要

這次是「文件追上實作」的勘誤,而非協定變更:已上線的 LND、Eclair 不需改行為,但任何依舊版規格或舊測試向量從零實作 taproot 通道的團隊,必須重新核對金鑰推導、控制區塊與 SIGHASH_SINGLE|ANYONECANPAY 規則。

文章目錄

發生什麼事

閃電網路規格儲存庫 lightning/bolts 於 2026 年 10 月 19 日(UTC)合併 PR #1352,由開發者 erickcestari 提出、Roasbeef 合併,修正 Simple Taproot Channels(簡易 Taproot 通道)擴充規格。該擴充是在 5 月由 BOLTs #995 正式納入規格庫,分配特性位元 80/81,定義以 MuSig2 聚合金鑰的 P2TR 注資輸出、taproot 化的承諾交易與 HTLC 腳本,以及交換 MuSig2 部分簽章與 nonce 的新 TLV 欄位。

Bitcoin Optech 第 428 期(10 月 23 日)摘要指出,規格中 taproot 輸出金鑰推導與控制區塊建構的錯誤「若照先前規格實作,可能產生無效花費」,同時強調這些修改是讓規格對齊既有的 LND 與 Eclair 實作,並未改變協定行為。合併紀錄顯示本次只改動 bolt-simple-taproot.md 一個檔案,新增 176 行、刪除 80 行。

修正了哪些錯誤

金鑰與控制區塊方面,PR 說明有五組輸出金鑰公式(錨定輸出、送出與接收的 HTLC、兩種第二層輸出)把 tweak 雜湊直接加到內部金鑰上,而 BIP 341 的正確寫法是 Q = P + int(hashTapTweak(...))G。規格也只在 NUMS 點處說明要用 32 位元組 x-only 形式,如今統一定義 x_only() 並套用到所有內部金鑰與控制區塊序列化。taproot_nums_point 在承諾交易章節被大量使用卻從未定義,to_remote 章節還自訂了一個與前文及測試向量都不一致的值;to_local 的控制區塊內容也有誤,延遲路徑需要附上兄弟葉雜湊,不是原文所稱的 33 位元組。

簽章與 nonce 方面,commitment_signed 原本沒有寫明 HTLC 簽章使用的 sighash 類型。修正後明訂為 SIGHASH_SINGLE|SIGHASH_ANYONECANPAY,接收方組見證時要在 64 位元組簽章後補上 0x83;由於 SIGHASH_SINGLE 綁定同索引的輸出,為了手續費加速而合併第二層交易時,每個 HTLC 輸入與對應輸出必須位於相同索引。PR 也更正 BIP 327 秘密 nonce 長度為 97 位元組,而不是兩個純量。

測試向量方面,accepted_htlc 系列把本地與遠端 HTLC 金鑰位置放反;*_remote_commit 系列與本地版本逐位元組相同,等於沒有測到任何東西,現改由遠端承諾點與本地撤銷基點重新推導;原本名為 combined_key 的欄位其實是 BIP 86 tweak 後的輸出金鑰,拆成 combined_funding_key 與 funding_key 兩項。

驗證方式與實作現況

作者表示,他從種子重新推導每一把金鑰、腳本、葉雜湊、tapscript 根與輸出金鑰,用 BIP 340、BIP 327 參考實作依 BIP 341 sighash 檢查所有簽章,包括重播每筆承諾簽章的 MuSig2 流程,並在 BIP 342 規則下執行每個見證。作者另提到曾請 AI 工具撰寫腳本,協助檢查新測試向量是否正確,並附上公開 gist。

對照實作的結果是:Eclair 的測試套件在不改程式碼的情況下直接通過新向量;LND 的測試則通過參數、三筆承諾交易、簽章驗證與 MuSig2 重播,以及 11 項腳本條目中的 5 項,其餘 6 項失敗被作者歸因於 LND 向量產生器本身與欄位更名,而非 LND 鏈上行為有誤。PR 說明未提及 Core Lightning 與 LDK 的對照結果,本文也未找到兩者的公開驗證資料。

同日合併的另一項規格收緊

同一天稍晚,BOLTs #1341 也被合併。該 PR 由 Eclair 開發者 t-bast 於 6 月提出,禁止在 utf8 欄位中放入 NULL 與其他控制字元,理由是沒有正當用途;並要求所有地方的特性位元都必須最小編碼,取消過去對 node_announcement 的寬鬆處理。這兩項加上同日合併、要求 BOLT11 發票只能有一個付款雜湊與付款秘密的 #1357,顯示規格維護者正密集把過去的模糊與寬鬆處清掉。

AI 觀點分析與推論

AI 觀點:文件落後實作,才是後進實作者的風險

對已在跑 LND 或 Eclair 的節點營運者,這次勘誤沒有立即操作需求,因為修正方向是讓文件追上程式碼。真正受影響的是後進實作者:如果有人只讀規格與附帶測試向量來寫相容程式,原本的 remote 測試向量根本沒有測到遠端承諾交易,金鑰公式又與 BIP 341 不符,很可能寫出與 LND、Eclair 互不相容、甚至在單方關閉時無法上鏈的交易,而且要到真正需要走腳本路徑時才會發現。

Taproot 通道從 2022 年起草、今年 5 月才正式進規格庫,卻在半年內被發現多組金鑰公式與測試向量有誤,說明閃電規格長期依賴「兩家實作互通即正確」的驗證文化。這次由提案者以參考實作逐項重算,並公開驗證腳本,是值得延續的做法;我們認為 CLN 與 LDK 若推進 taproot 通道,應以新版向量為準,錢包與 LSP 在採用前也應確認對方實作通過的是 10 月 19 日之後的測試向量。

原始來源與延伸閱讀

  1. lightning/bolts PR #1352:bolt-simple-taproot: fix the output key derivations, signature rules and test vectors ↗官方規格儲存庫(合併紀錄) · 原始發布 2026-10-19 · 查閱 2026-10-24
  2. Bitcoin Optech Newsletter #428 ↗技術週報 · 原始發布 2026-10-23 · 查閱 2026-10-24
  3. Bitcoin Optech Newsletter #404(BOLTs #995 新增 Simple Taproot Channels 擴充) ↗技術週報 · 原始發布 2026-05-08 · 查閱 2026-10-24
  4. lightning/bolts:bolt-simple-taproot.md ↗官方規格文件 · 原始發布 2026-10-19 · 查閱 2026-10-24
  5. lightning/bolts PR #1341:Ban unicode control characters from utf8 fields ↗官方規格儲存庫(合併紀錄) · 原始發布 2026-10-19 · 查閱 2026-10-24

更正與更新

本文發布後沒有更新。之後若有修改,會建立新版本並在這裡標示更新時間。

內容有誤?請見更正方式,或寄信至 [email protected](請附文章網址、段落與參考資料)。

延伸閱讀

更多 BTC 新聞