原文標題:《小島美奈子:比特幣閃電網絡初探》
文章來源:鏈人 ChainHR

閃電網絡落地的場景是微支付和流式支付,要學習和開發閃電網絡,有兩個非常好的地方:第一個就是閃電網絡的白皮書,第二個就是 https://github.com/bcongdon/awesome-lightning-network,這裏收集了所有和閃電網絡相關的開源 repo,包括閃電網絡的五種 protocol 實現,還有若干閃電網絡的開源錢包,我們可以看到閃電網絡社區是非常開放和繁榮的。

直觀瞭解閃電網絡的最好方法,其一是下載和使用支持閃電網絡的錢包,例如 bluewallet,其二是查看閃電網絡瀏覽器 https://1ml.com,之所以叫 1ml,也是社區希望有一天閃電網絡可以承載 1million btc 支付能力的上限。

下面我結合白皮書,講解閃電網絡的具體實現。關於閃電網絡的白皮書,可以在閃電網絡實驗室的官方網站上找到。鏈接如下:https://lightning.network/lightning-network-paper.pdf

要理解閃電網絡,首先要講解 BTC Transaction 裏面的 2 個關鍵字段:nLockTime 與 sequence numbe。nLockTime 表示交易是否會被積壓;當默認 nLockTime=0 時,代表這筆交易不會積壓,節點在收到這筆交易之後,立即會進入 Memory Pool,進行打包。當 nLockTime > 0 時,這筆交易會被節點暫時 Hold,不會被礦工打包。

nLockTime 是 Transaction 級別的,而 Sequence Number 是 Input 級別的,粒度更細。原理和 nLockTime 類似,Sequence Number 的作用也是把交易 Hold 在那,等到該 Input 所引用的交易所在的 Block,其後面跟隨了 Sequence Number 個區塊之後,該交易才能被打包,被廣播進區塊鏈網絡。

兩者都是關於時間的,但有 1 個很大差別:nLockTime :絕對時間,用的是整個區塊鏈的長度或時間戳來表達的。sequence number: 相對時間,當前交易所引用的 UTXO 所在的塊,後面追加了多少個塊。

有了這個知識之後,下面就可以來看比特幣裏面的微支付通道。在比特幣閃電網絡白皮書中引用了這麼一句話:If a tree falls in the forest and no one is around to hear it, does it make a sound? 「如果一棵樹落在森林裏,周圍沒有人聽到它,它會發出聲音嗎?」

作用在比特幣的世界,如果我們一桌人在打麻將,我們經常一晚上下來可能會互相之間先記賬。最後回家的時候在一起結算。因爲這筆交易只在小範圍內進行着,所以其實沒有必要讓所有人都知道,這樣其實只要參與交易的雙方能夠達成共識。

這就是我們哲學上說的,唯心主義的觀點。中國也有心外無物,心外無理的說法。

回到閃電網絡。我們看看,微支付通道是如何做到 off chain 交易的。剛纔我們提到了 nLockTime 和 Sequence number 要實現微支付通道,就必須藉助這兩個屬性。

微支付通道建立過程,我來舉一個例子。比如我在看一段電影,這個電影按照我觀看的時間每分鐘收取一定費用。A 是客戶,B 是電影提供商,B 需要把 1 段視頻播放給 A,整集的價格是 100 元。

A 不是 1 次性把 100 元給 B,而是每觀看一分鐘,給 B 支付 1 元。現在看一下,微支付通道如何解決這個問題:

階段一,用戶 A 發起 1 筆交易,把 100 元打到 1 個公共賬號上面,這個公共賬號同時需要 A 和 B 的簽名,也就是我們常說的多重簽名(Multisig)。這筆錢需要 A,B 同時出具私鑰,才能把錢取出來。這筆交易叫做保證金交易(Funding Transaction)。

階段二,用戶 A 同時發起 1 筆退款交易(Refund Transaction)。輸入就是上面的那筆,但是這筆交易的 nLockTime 爲一個 > 0 的值,所以不會立即生效。具體怎麼做呢? 用戶 A 先把這筆交易發給 B,B 用自己的私鑰進行簽名返回給 A,A 把這個 Refund Transaction 攥在手上,這筆交易其實是 A 的一個保底措施,保證前面的 100 元不會永遠拿不回來。

階段三,就是流式交易階段,每播放一段視頻,雙方 Update 階段一發出的保證金交易(Funding Transaction)。使得這個公共賬戶裏的資金分配不斷走向 B。這些 Update 只會在 A, B 之間傳遞,而不會廣播到比特幣網絡上。

階段四,整個播放過程完成,公共賬號裏的所有資金都流向 B。雙方確認最後的交易,廣播到網絡上,交易完成。我們看到,整個過程,只有一頭一尾兩次交易被廣播到了比特幣網絡上。其他步驟都是在 A、B 雙方之間達成共識的。

現在我們考慮可能出現的作弊情況。

情況 1,B 跑路,視頻根本沒有播放完,A 的錢會不會永遠鎖死在公共賬號裏面?
情況 2,A 跑路,B 播放了視頻,但是 A 撤銷了已經付的錢。

先看情況 1,我們前面提到在階段二的時候,A 發起 1 筆退款交易(Refund Transaction)。如果 B 跑路,就直接把這個廣播出去,雖然會有一定延時,但最終不會有損失。

考慮情況 2,我們 remind 階段三,因爲每一次 update 有雙方的簽名。如果 A 跑路了,B 就把最新的 update Transaction 廣播到網絡上,該交易被執行,B 就會拿到最新的錢。這個 Update Transaction,就相當於 B 攥在手裏的 A 的把柄。

這個 Update Tx 有個特點,就是每次更新,nLockTime 是單調遞減的。所以一旦 B 進行廣播,就能拿到最新的一次更新。這樣微支付通道就被建立了。

但是這個微支付通道距離我們的閃電網絡,還有很多距離。微支付通道的缺點:它是單向的,只能用來 A 給 B 轉賬。nLockTime 的限制。當有一方跑路了,另一方都要等 nLockTime 解鎖才能贖回自己的錢。

下面我們介紹的閃電網絡就是解決微支付通道的問題。這就要介紹閃電網絡白皮書裏面的另一個核心概念:RSMC,全稱 Revocable Sequence Maturity Contract。中文翻譯「可撤銷序列成熟度合約」。

下面我們來用 RSMC 來重現上面的例子。這個是白皮書裏面有一幅圖,

階段一,和微支付通道一樣,生成一筆保證金交易(Funding Transaction)。不過這次是,參與的雙方都拿出一部分本金放到公共賬戶。

階段二,和微支付通道類似,不過這次,雙方都需要生成一筆退款交易(Refund Transaction),以便不時之需。

階段三:雙方開始不斷 Update Transaction。重點來了,一旦有一方中斷交易,對方可以立即拿回自己的錢,而另一方,則要等待 Sequence Maturity 之後纔可以拿回自己的一部分錢。換句話說,違約的一方被懲罰了。

最後階段四,雙方把交易廣播,此時 Sequence = 0,雙方都拿到了自己錢。

需要注意到,當其中一方拿回錢的時候,這筆錢並沒有直接打回自己的賬戶裏。而是達到了一個新產生的公共賬戶。而在每次 Update Transaction 的時候,雙方都會把上一輪自己產生的公共賬戶的私鑰發送給對方,相當於雙方不斷的交換把柄,讓交易得以持續。

這個過程很像古代交戰雙方交換戰俘,具體細節可參見比特幣閃電網絡白皮書和比特幣閃電網絡實現規範 BOLT (博爾特)。https://github.com/lightningnetwork/lightning-rfc/blob/master/00-introduction.md

所有的閃電網絡 protocol 的實現,以及錢包,都是兼容這份規範的。

目前建立了雙向的流式支付通道,但是要形成網絡,還需要很多很多人加入這些通道,而最終所有的通道會聯繫在一起,形成一張 Mesh Network。類似格點網絡,使得任意一筆交易,都可以經過若干通道,達到最終的目標。

有一部電影,叫做《六度空間》,說的是現實世界中,你和任何陌生人之間,最多隻有不超過 6 個熟人關係,說明通過形成很多支付通道,來建立龐大的支付網絡是可能的,這就是閃電 「網絡」。

最後推薦一些介紹閃電網絡的文章

1.閃電網絡「增長」迅猛,比特幣正式邁入「支付貨幣」2.0 時代

2.The Lightning Network: How to install and (hopefully) make money

其中第二篇教你怎麼自己建立一個閃電網絡的支付通道。最後要想體驗閃電網絡,可以下載安裝一些支持閃電網絡的錢包。

我這裏推薦 BlueWallet 值得一提的是,這些錢包也是開源的,大家可以應用這些錢包,構建自己的服務,以及設計 Lapp。

最後提一下,「For every complex problem there is an answer that is clear, simple, and wrong.」

我們回顧比特幣,擴容這個問題,增大區塊可能就是那個 「clear and simple」 的解決方案。閃電網絡選擇了走隔離見證,是一種短期看激進,長期看保守的策略。其目的就是追求比特幣作爲 Layer 1 層的穩定。把所有擴展的努力都寄託在 Layer 2 的實現上。

閃電網絡還在快速的發展着,現在進場的還是老韭菜。今天的分享就到這裏,我們下回再見。

問答環節

問題 1: 目前閃電網絡的支付能力怎麼樣?

答:閃電網絡的支付能力目前依然在快速的變化,https://1ml.com/,大家可以用這個實時查詢。

問題 2: 以流式支付爲例,A 開始是發起 1 筆 100 塊錢的交易,1 分鐘後 update,這個過程 A 把私鑰告訴 B,讓 B 通過私鑰取 1 塊錢嗎?錢從公共賬戶流向 B 是通過合約執行嗎?

答:注意,每次更新狀態,都會創建一組新的公共賬戶,這裏的私鑰指的是這個新的公共賬戶的零時私鑰。這個過程是通過參與交易的雙方,都對這個新的公共賬戶進行簽名達到的。