
閃電網絡(Lightning Network)可能是比特幣區塊鏈上最受期待的創新(編者註:原文撰寫於2016 年)。這種支付方案最早由Joseph Poon 和Tadge Dryja 在一年多以前提出,號稱能支持用戶之間在鏈下發送無限次的交易,而且成本極低—— 還能藉用比特幣網絡提供的安全性。
至少有三家公司—— Poon 和Dryja 的Lightning、Blockstream 和Blockchain 正在開發這種技術的實現。但在技術人員的小圈子之外,很少有人理解“微支付的未來”如何能引爆比特幣的潛能。
在本系列文章裡,Bitcoin Magazine 嘗試列舉閃電網絡最基礎的磚石,並展示這些東西如何能組合出閃電網絡這種即將到來的協議。
本系列的第一篇文章將列舉必要的模塊並展示這些模塊如何能組合起來創建“智能合約”;這個概念可以用來理解閃電網絡的第一個前提:雙向的支付通道。
(提示:非常熟悉比特幣的讀者可以跳過對這些模塊的介紹。)
模塊#1:未確認的事務(Unconfirmed Transactions)
比特幣協議的核心是所謂的“事務” 的概念;一般來說,一筆事務總是關聯著另一筆前序事務,並且可以用在未來的事務中。每筆事務都包括 輸入,指向 轉出 比特幣的地址;以及 輸出,指向 收到 比特幣的地址。此外,為了發送比特幣,輸入還必須滿足一些條件,比如要提供數字簽名來證明發送者俱有輸入地址的“所有權”。同時,輸出也會確立這些比特幣在日後使用時候的新條件,在 後序事務 發出的時候必須滿足。
(譯者註:把比特幣想像成一張張有面額的支票,在使用時,支票自身給出了資金的來源,而在使用後又會形成新的支票。所以對每一張支票來說,都有形成這張支票的事務,也即是前序事務;而當這些支票被再次花用時,那筆事務就可稱為後序事務。)
閃電網絡的一個關鍵特性是,它是由或多或少的常規比特幣事務組成的。只是,這些事務一般不會在比特幣網絡里傳播。相反,這些事務都是用戶保存在節點本地的—— 只不過,它們隨時可以放到比特幣網絡中傳播。

- (譯者註:如圖所示,比特幣就像支票一樣可以拆分,且其流轉會形成清晰的鏈條。) -
模塊#2:杜絕多重支付(Double-Spend Protection)
閃電網絡所需的第二個模塊可能不需要太多解釋,因為它可以說是比特幣協議本身的存在理由:多重支付的防範措施。如果兩筆事務(或者說輸入)依賴於同一個輸出,那隻有其中一筆才會得到整個網絡的確認。
謹記:即使尚未確認的事務之間發生了衝突,最終也只有一筆會得到確認。

模塊#3:多簽名(Multisig)
閃電網絡的第三個模塊也很好理解:多簽名地址。 (或者更廣義地說:P2SH 地址(腳本哈希值地址)。)
顧名思義,多簽名地址就是需要多個私鑰來“解鎖”、使用比特幣的地址。多簽名地址的條件可以設置得很多樣。比如,可以要求在3 把私鑰中要有2 把參與,才能轉出比特幣;或者是其它的數量要求(比如2/5,3/4,等等)。
閃電網絡一般使用2-2 的多簽名要求。要從這樣的地址中轉出比特幣需要提供跟這兩把私鑰相關的兩個簽名,少一個都不行。

模塊#4:時間鎖(Time-Locks)
第四個模塊是時間鎖。時間鎖功能可以在一個輸出中放置一個鎖定條件,讓這些比特幣僅在未來某個時間之後才能花用(也即被用作一筆事務的輸入)。
有兩種類型的時間鎖:1)絕對時間鎖,叫做CheckLockTimeVerify(CLTV);2)相對時間鎖,CheckSequenceVerify(CSV)。 CLTV 會鎖定比特幣直至未來某個(可以說是)具體的具體:一個具體時間和日期,或者一個具體的區塊高度;而CSV 只會使用相對時間。當一個CVS 輸出上鍊之後,就要等待一定數量的區塊後,這筆輸出才能花用。

模塊#5:哈希值和秘密值
第五個,也是最後一個模塊—— 密碼學—— 也是比特幣本身最基礎的模塊。但在閃電網絡中,用法有所不同。
簡而言之,一個“秘密值” 是一個很長而且獨一無二的數字串,是幾乎不可能猜測出來的,一台電腦暴力運算無數次也猜不出來。而通過特殊的計算,這個秘密值又可以“打散” 成一個不同的數,叫做“哈希值”。有趣之處正是這裡:知道這個秘密值得人可以很容易地計算出其哈希值,但反之不成立,拿著哈希值你是反推不出那個秘密值的。
在比特幣區塊鏈上,這個機關又可以用在“鎖定比特幣” 上(實際上,鎖定比特幣就是比特幣協議運行的方式)。舉個例子,你可以在一個輸出中包含一個哈希值,要求後序的事務只有包含該哈希值對應的秘密值才能花費這筆輸出。

第一個挑戰:雙向的支付通道
在閃電網絡出現之前,就已經有“支付通道” 的概念了。標準的支付通道是用於特定用途的,因此也很局限:它們都是單向的通道。 Alice 可以在鏈下向Bob 發起多比支付,但Bob 沒法用同一個通道給Alice 支付。
而閃電網絡的一個關鍵特性就是, Poon 和Dryja 提出的免信任的雙向支付通道。
開啟通道
要建立一個雙向的支付通道,參與的雙方都必須首先對一筆開啟通道事務達成共識。這筆開啟事務決定了他們倆各要在這個通道中存入多少比特幣。
假設Alice 想給Bob 發送1 btc。因為他們倆都預期以後會有頻繁往來,他們決定開啟一個雙向的支付通道。 (在通道裡發送1 btc 可能有點太大了,畢竟通道可能對小額支付更有用—— 但也是完全可以做到的。)
要開啟這個通道,Alice 和Bob 每人都發送5 btc 到一個2-2 的多簽名地址裡。這就是“通道開啟事務”。這個地址裡面的錢,只有Alice 和Bob 簽名同一筆事務才能花用。
此外,Alice 和Bot 都各自創建一個秘密值(也就是一串數字),然後交換哈希值。
現在,Alice 創建一筆通道開啟事務的後序事務,且這是一筆“承諾事務”。在這筆承諾事務裡,Alice 把4 btc 發給她自己,而6 btc 發送給第二個多簽名地址;這個多簽名地址更有趣:Bob 可以獨自解鎖這個地址,但是,要等(Alice 的事務上鍊後的) 1-00 個區塊之後,Bob 才能花里面的錢(這是一個相對時間鎖);Alice 也可以獨自打開這個地址,前提是她也擁有Bob 給她的哈希值所對應的秘密值。 (當然,Alice 是完全不知道這個秘密值的—— 她只有Bob 給她的哈希值—— 所以只是表面上可以這麼做而已。)(譯者註:即,這第二個多簽地址既有時間鎖,也有哈希鎖。)
Alice 簽名了她的承諾事務。但是她不會把這筆事務廣播出去!相反,她只會把這筆事務發給Bob。
同時,Bob 也做剛好對稱的操作。他也創建一筆承諾事務,把6 btc 發給自己,4btc 發給一個新的多簽地址。 Alice 在等待1000 個區塊後就可以獨自解鎖這個地址,或者Bob 可以拿Alice 的秘密值來解鎖這個地址。
Bob 簽名了這筆事務,然後發給了Alice。
交換完了這些承諾事務和哈希值之後,他們再共同簽名並把那筆通道開啟事務廣播出去,使之能夠上鍊。現在,一個雙向的支付通道就開好了。
開啟通道之後,Alice 和Bob 都可以簽名和廣播他們從地方那裡得到的、部分有效的承諾事務。如果Alice 廣播了(Bob 發給她的承諾事務),則Bob 會立即得到6 btc。如果Bod 廣播了,則Alice 會立即拿到4 btc。但簽名和廣播事務的那個,必須等待1000 個區塊才能解鎖那個後序的多簽名地址,把剩餘的比特幣拿走。

不過,這就是支付通道的關鍵技巧:不去簽名和廣播他們得到的承諾交易。
(譯者註:先交互承諾事務,再廣播通道開啟事務,是為了避免對手欺詐;而獲得承諾事務之後,不必廣播,也可以獲得安全性保證了。)
更新通道
後來,Bob 想給Alice 發回1 btc,他們想更新這個通道的狀態,使之回到5:5 的狀態。要實現這一點,Alice 和Bob 需要做兩件事。
首先,雙方都要把上面所講的流程再做一遍(除了開啟事務的那部分,因為已經記錄在鏈上了)。這一次,Alice 和Bob 都把5 btc 分配給對方,都把5 btc 分配給那個多簽名地址。這些後續的多簽名地址的條件是類似的,只不過,他們都需要生成 新的 秘密值:Alice 和Bob 都要提供 新的 哈希值。他們都簽名自己的新承諾事務,並發送給對方。
其次,Alice 和Bob 都把他們的 第一個 秘密值(用在第一次承諾事務中的那個)交給對方。
這時候,Alice 和Bob 都能簽名和廣播他們最新得到的這筆承諾事務。他們的對手會立即獲得5 btc,而廣播這自己則必須等待1000 個區塊。就這樣,通道的狀態更新了。
但是,有什麼能阻止Bob 廣播舊的承諾事務呢?那筆承諾事務會給他分配6 btc,比5 btc 要多……
阻止Bob 的,當然就是他的第一個秘密值,也就是他已經給了Alice 的那個秘密值。
因為,這時候Bob 已經無法隨心所欲地簽名和廣播更老的那筆承諾事務了,因為Alice 已經知道了Bob 的第一個秘密值。如果Bob 要簽名和廣播(Alice 給他的那筆)更老的承諾事務,他會立即把4 btc 發給Alice …… 且他自己要等1000 個區塊才能申領,但是,Alice 已經知道他的秘密值了,所以她可以利用這段時間先發製人,直接把剩下的6 btc 也提走!
而且,因為Bob 也有了Alice 的秘密值,所以對Bob 來說同樣如此!要是Alice 想簽名和廣播舊的承諾事務,Bob 就可以偷走她放在通道裡所有的btc 了!
這就意味著Alice 和Bob 都要重組的激勵不去耍小手段,只廣播最近的狀態。

好了,有了雙向的支付通道之後,我們要把它拓展成一個支付網絡。這就是我們第二篇的主題。
感謝Rusty Russell 和Joseph Poon 的專門反饋。
