本文指出閃電網路原理的重要缺陷。我們透過邏輯推理和歸約方法,剔除無關的內容,找出關鍵的矛盾所在。

作者:闞嘉,西交利物浦大學密碼學博士,經濟的工作量證明發現者,儲存公鏈創業,連續創業者

封面: Photo by Brandon Morgan on Unsplash

本文指出閃電網路原理的重要缺陷。我們透過邏輯推理和歸約方法,剔除無關的內容,找出關鍵的矛盾所在。閃電網路核心概念是支付通道 channel,由於單向 channel 更容易幫助我們理解問題,我們使用單向通道 channel 來解釋我們看到的不合理的部分。閃電網路使用的多簽和哈希時間鎖主要用於鏈上結算,是額外一種保護機制,這部分我們會在文章的最後討論。

我們的主張是,最初的閃電網路設計:一對一通道在設計上是合理的,在使用上會出現困難,因為鎖定了太多資金。之後閃電網路增加的帶路由和中繼的閃電網絡,打破了先前一對一通道的核心原則,使得網路無法再防止雙花。閃電網路在此基礎上加入了更多工程設計,例如要求每個中間人在線(幾天內),這讓使用體驗大打折扣,使閃電網絡不再 “閃電”

1 對 1 閃電頻道

雙花和超花(之後解釋)對於轉帳和支付來說,是非常致命的問題。區塊鏈透過引入共識演算法,實現了去中心化防止雙花。此前,只有中心化機構例如銀行,才能確保安全。所以區塊鏈的出現有著跨時代的意義。

閃電網路本身沒有共識演算法,鏈下的系統理論上不能防止雙花。但是閃電網路中最核心的 channel 設計,繞過了這一點。因為支付通道必須指定接收方(支付行為的本質是用私鑰對符合格式的訊息鏈下簽名),如果在 A 到 B 的單向 channel 中付款,A 簽署訊息的收款人必須是 B,否則就是在操作另一個 channel。

所以,閃電網路中 channel 的核心思想就是,鎖定收款人,防止向多個收款人同時支付這筆鎖定的資金。這排除了同時向多個收款人支付同一筆資金的可能性,一對一的閃電網路不可能實現雙花。用戶可以試圖超花,但這一問題的危害確實不如雙花嚴重。

超花的意思是,如果 A 只在通道中鎖定了 10 塊,那麼他可以簽兩張支票,一張付給 B 7 塊,另外一張付給 B 8 塊,B 當然知道 channel 中只有 10 塊,所以只接受其中一張付款。此時,B 知道 A 違規了,立刻開啟鏈上清算流程。

再次強調,一對一的 channel 的特性可以防止雙花,是因為收款人是確定的,這是最關鍵的。當然一對一閃電網路不會走向實用,因為佔用用戶資金太大了。這好像儲值公車卡,但你不可能給每個潛在消費的飯店預先各充值 500 元,因為這會佔用大量資金。

為了解決這個資金佔用問題,閃電網路提出了帶有 relay 路由的支付網路。如果我們無法和所有人建立 channel 鏈接,那我們就找共同好友 C。當然,閃電網絡又要求 C 凍結很多資金和好友們搞好關係,屬於富人社交了,我們暫時不討論這方面問題。

帶路由的閃電通道

當我們簽名的時候,我們會指定我們動用資金的 channel 的,然後還要指定最終接收方。注意,有路由的閃電網路已經能付給不同用戶 B 和 G 了,除了指定動用哪個 channel 的資金(此時通道 AC 和 AE 都可以動用),我們還需要在待簽名的交易中指定最終付款人。

此時,聰明的讀者已經發現了根本的問題,一對多的閃電網路本身已經違反了一對一閃電網路概念的最基本原則,就是支付者必須固定寫死。到這裡,一對多的閃電網路設計已經出了問題。閃電網路給出的答案是,必須讓路由節點在線(一定時間內在線一段時間,處理這些路由支付)。

付款途徑

設計上,我們讓路由節點在線上完全離線,是最佳方案。如果我們假設 C 和 D 是一個普通用戶,在閃電網路伺服器上,只存在 channel 訊息,並沒有 C 和 D 的私鑰,所以在 A 簽名後,就算 C 和 D 不在線,B 依然可以收到錢,因為只要看到 A 的簽名,並且查詢到 A 到 C 的 channel 中 A 的餘額已經合法的減少了,系統就會給 B 增加餘額。 理論上,就算 A 與伺服器的通訊中斷了,A 把簽章資料郵件給 B,再由 B 提交給系統,也是可以完成支付的。但由於這樣做已經違反了一對一閃電網路的基本原則,無法對抗雙花了,所以閃電網路要求 C 和 D 必須部分時間在線,並且利用了 UTXO 時間鎖,這最終還是在利用區塊鏈的抗雙花特性來保護閃電網路。閃電網路本身依然脆弱(另外如此頻繁的使用區塊鏈,在 15 年或許可以,而現在 BTC 的價格已經不那麼便宜了)。

此時,當用戶 A 嘗試雙花,向 B 和 G 同時支付 channel AC 中的餘額,此時由於閃電網絡沒有共識算法,系統是無法判斷哪筆交易發生在前的(或許之前簽發的交易因為網絡延遲了,後收到)B 和 G 就變成爭搶這筆付款,而係統無法給出唯一判定。最後兩位需要去鏈上搶這筆款項。

在一對一的網路 channel 中,由於收款人是固定的,只能超花不能雙花,所以收款人可以接受一筆付款,並且拒絕另外一筆,不會出現爭搶和難以判定。但是在一對多的閃電網路中,這樣的判定是不可能的。

超額付款

當然,利用 BTC UTXO 的特性,在閃電網路的設計中,使用了雙向的 channel 設計,並且要求 C 和 D 部分時候在線上。但 C 上線後發現 A 嘗試的兩筆花費超過了 channel 中鎖定的資金額度,但無法確定先後順序,於是 C 判定 A 違規並進行鏈上回滾。雖然我們無法確定 A 雙花的錢到底應該是屬於 B 還是 G,但我們可以發現爭議並取消交易,這樣 A 並沒有付給 B 或 G 任何資金。回到真實場景,在鏈下支付的時候,A 有可能向 B 和 G 購買了一杯汽水和一份漢堡,在等待 C 和 D 上線確認的時候,汽水和漢堡已經進肚子了,最終 B 和 G 都沒有收到錢。

我們看到閃電網路無論是一對一還是一對多的設計,都有較大缺陷。作為一個差不多 10 年前的項目,同一時代的以太坊已經差不多敘事枯竭,但閃電網路依然難產。使用技術補丁修復理論缺陷,就算不是徒勞無功的,也非常複雜。例如,PoS 演算法相對於 PoW 演算法,就複雜的多,因為 PoS 需要檢查很多作弊和違規行為,罰沒資金,所以演算法實作就會變得臃腫和醜陋,遠不如 PoW 簡單優雅。我們相信,區塊鏈原生支付擁有廣闊的場景,它的未來就像使用紙幣一樣簡單。學習並了解閃電網路有助於我們探索全新的區塊鏈支付協議。

免責聲明:作為區塊鏈資訊平台,本站所發布文章僅代表作者及來賓個人觀點,與 Web3Caff 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。