
原創- Odaily
作者- 南枳
引言
10 月20 日,Bitcoin Core 核心開發者/dev/fd0 在X 平台宣布,將停止參與閃電網絡及其實施的開發,包括協調處理協議級安全問題。
/dev/fd0 表示,每個比特幣節點都有自己的記憶體池。交易由對等節點轉發。如果閃電網路節點用於開啟通道並接受HTLC 轉發,那麼很容易受到替換循環攻擊(Replacement Cycling Attacks)。
該開發者所指的「替換循環攻擊」是什麼,其具體實現途徑如何,Odaily將於本文揭示。
閃電網路
比特幣網路的TPS 僅約為7 ,且手續費高昂,為解決小額支付的需求,閃電網絡應運而生。
閃電網絡(Lightning Network)是一種針對比特幣和其他加密貨幣的第二層擴展解決方案,旨在解決加密貨幣網絡的可擴展性和交易速度問題。
其實現原理可簡化為:
交易雙方A 與B 建立了一個「交易通道」(實際上是多簽錢包)
A 與B 分別在裡面充滿A1 和B1 (此步上鍊)
A 與B 在鏈下發生任意筆交易,A 淨轉出額X(例如A 向B 轉帳100 次1 元,B 向A 轉出99 次1 元,最終A 淨流出1 元)
將A1-X 與B1+X 的交易更新上鍊
透過上述流程,無論A、B 在鏈下進行多少次交易,都只要支付兩筆上鍊費用,並節省了大量的時間。
哈希時間鎖合約(HTLC)
以上介紹的形式限於A 和B 之間有直接的交易通道,為跨通道支付而出現了中繼節點,中繼節點中轉兩者交易,以便跨通道進行支付,而中繼節點可以收取小費。
但這面臨一個問題:需要確保每個通道內每個參與者都是誠實守信的,通過多通道連接是安全的。
因而出現了HTLC(Hash Time-Lock Contract、哈希時間鎖合約),一筆帶有HTLC 的支付事務可簡化為:
A 準備一個暗號R,併計算其哈希值 H
A 設定一個時限 T
A 向B 發送一筆帶有HTLC 的支付事務,僅當符合以下兩個條件時交易才會最終成立
B 回答出暗號R(經H 驗證)
B 回答的時間在T 之內(例如10 個區塊內給出答案)
若B 不知道暗號,或回答超時,則資金退還給 A
正常交易流程
通過上述的HTLC,一筆涉及中繼節點的支付流程如下:
最終的接收者C 向發送資金者A 提供暗號
A 以雜湊值H 發起HTLC 支付(請注意,此時資金並未到B 手中)
B 接收到支付訊息,向C 以雜湊值H 發起HTLC 支付
C 為了接收資金,回答暗號,收到資金。 B 此時也知道了暗號
B 用暗號取得A 發起的支付,收到資金,交易完成
涉及三者的流程如上,中間也可以多加入幾個中繼節點,而支付模式仍保持不變,透過鍊式發送支付到最終接收者,然後再反向傳播暗號至初始的中繼節點,最終完成交易。
而中繼節點如果遲遲沒有收到暗號 R(下家不做解答,時限由中繼節點自行判斷),則中繼節點可以選擇關閉通道,若成功上鍊,則B 發起的支付將“失效”,沒有資金損失。
循環替代攻擊
回到HTLC 的基本原理中,除了回答暗號外,中繼節點還需要達成另一條件“中繼節點回答的時間在T 之內”,而惡意攻擊者即是瞄準了該點進行攻擊:
A 和C 惡意串通,受害者為中繼節點B(B 要求下家3 個區塊內回答)
A 向B 發起支付(假設此時區塊高度為1000),要求在區塊1020 前回答
B 向C 發起支付(區塊高度1005)
區塊高度1008 時,B 見到C 還不回答,決定關閉頻道,將在區塊1009 生效
C 發起高Gas 的交易①(區塊1008),使B 發起的交易無法進入內存池
C 發起高Gas 的交易②(區塊1009),B 仍無法進入記憶體池
C 無限循環操作,直到區塊1020 ,給出暗號R,提取資金
B 儘管取得了暗號,但已沒有時間回答A 發起的支付,資金退回給A,而向C 的支付又已經成立,最終「循環替代攻擊」實現。此外,A、C 也可以透過串通,循環攻擊B 的關閉交易而實現雙花。
結語
儘管存在上述攻擊途徑,但並不意味著攻擊者就可以為所欲為,任意盜取閃電網絡中的資金,原文中作者也提出了五種處理辦法,如本地內存池和事務中繼流量監控、礦工內存池監控等。
前途是光明的,道路是曲折的,今年比特幣網絡上也誕生出了Ordinals、BRC-20、Taproot Asset 等一系列新事物,問題雖存在,但持續的發展終將能解決問題。
參考資料
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-October/022032.html
https://github.com/ariard/mempool-research/blob/2023-10-replacement-paper/replacement-cycling.pdf