LND 中的 2022 年 10 月錯誤是什麼,是什麼導致了它,以及什麼可以防止將來出現類似的錯誤?
由於 LND/btcd(Go 中的替代比特幣實施)中的錯誤,LND 使用者被要求從 2022 年 10 月起緊急更新他們的閃電節點軟體。什麼是錯誤,是什麼原因造成的?它會影響誰,他們會不會賠錢?將來如何防止類似的錯誤?
LND 和 btcd 中存在一個錯誤,該錯誤由 Burak 於 2022 年 10 月 9 日廣播的完全有效的 998-of-999 Taproot 多重簽名交易暴露。該交易符合 2021 年 11 月在網路上啟動的 Taproot 共識規則,被包含在由礦工阻止並由所有比特幣核心完整節點驗證(據我所知,除了 btcd 之外的替代實現)。
(此交易由 AdamISZ 分析。)
BIP342中包含的 Taproot 共識規則升級:
腳本大小限制:不適用 10000 字節的最大腳本大小。它們的大小僅受塊重量限制的隱含限制。
btcd 全節點拒絕了該交易,該交易包含在區塊中,其區塊鏈停滯不前。btcd 線路解析庫仍在為 SegWit 版本 1 交易執行 SegWit 版本 0 的最大腳本大小限制。
這影響了所有 LND 節點(包括由 Bitcoin Core 全節點支持的節點和由 btcd 全節點支持的節點),因為反序列化原始塊的 btcd 線解析庫是 LND 依賴項。
正如 Olaoluwa Osuntokun(LND,btcd 維護者)在 Twitter 上所說:
問題出在反序列化原始塊的 btcd 的線解析庫中,segwit v0 的初始實現包括對見證大小限制的共識級別檢查,但也將此檢查提升到線解析層
使用 segwit v1,這個先前的最大接受見證大小的限制被刪除,代替了 sigop 成本抽象之類的東西,有效地將限制留在了最大塊重量/大小
btcd 最初的 segwit v1 實現正確更新了共識邏輯,但也未能更新線路解析層中的深度防禦檢查(解析線路時,您需要某種上限)
至於它會影響誰以及他們是否會賠錢,這取決於 LND 使用者、渠道交易對手是否試圖利用此漏洞以及使用者能夠以多快的速度更新到LND v0.15.2。其他閃電節點實現(Core Lightning、eclair、LDK 等)不受影響。如果 LND 節點由 btcd 全節點支持,則 btcd 全節點也需要更新. 如果 LND 使用者無法快速更新,有兩種方法可以利用此漏洞。渠道交易對手可以廣播撤銷狀態,除非 LND 節點在 2 週內恢復或使用外部瞭望塔,否則資金可能會以這種方式失去。此外,如果 LND 節點是路由節點,如果在超時之前通道交易對手未提供 HTLC 雜湊原像,則其無法關閉通道可能會導致資金損失。
進一步討論了為什麼 Taproot (BIP341) 靜態測試向量沒有擷取 LND 儲存庫中的錯誤。Olaoluwa Osuntokun 再次:
btcd is/was using this test vectors。這裡的問題是,為這些測試向量解析見證的程式碼與用於從線路讀取塊的程式碼不同。當一個新塊進入時,我們獲取原始塊然後嘗試對其進行解碼,這觸發了這個問題。
比特幣光學技術也涵蓋了這個錯誤。