跳到主要內容

3. 閃電網路運作原理

現在我們已經跟隨 Alice 設定了閃電網路錢包並從 Bob 那裡購買了一杯咖啡,讓我們深入了解並拆解該過程中涉及的閃電網路不同組件。 本章將提供高層次的概述,不會深入所有技術細節。 目標是幫助您了解閃電網路最重要的概念和構建模組。

如果您有計算機科學、密碼學、比特幣和協議開發的經驗,那麼本章應該足以讓您能夠自己填補連接的細節。 如果您經驗較少,本章將為您提供足夠好的概述,讓您更容易理解正式的協議規範,即 BOLT(Basis of Lightning Technology,閃電技術基礎)。 如果您是初學者,本章將幫助您更好地理解本書的技術章節。

如果您需要複習比特幣的基礎知識,可以在 比特幣基礎回顧 中找到以下主題的摘要回顧:

  • 金鑰和地址

  • 雜湊函數

  • 數位簽章

  • 交易結構

  • 交易輸入和輸出

  • 交易鏈接

  • 比特幣腳本

  • 多重簽名地址和腳本

  • 時間鎖

  • 複雜腳本

我們將從閃電網路的一句話定義開始,並在本章其餘部分對其進行分解。

閃電網路是一個「支付通道」的點對點網路,作為智慧合約在「比特幣區塊鏈」上實現,同時也是一個通訊協議,定義參與者如何設定和執行這些智慧合約。

3.1. 什麼是支付通道?

根據上下文,有幾種方式可以描述支付通道。讓我們從高層次開始,然後添加更多細節。

支付通道是閃電網路上兩個節點之間的「財務關係」,稱為「通道夥伴」。財務關係在兩個通道夥伴之間分配「資金餘額」(以毫聰計價)。

支付通道由「密碼學協議」管理,這意味著通道夥伴使用基於密碼學的預定義流程來重新分配通道餘額,使一方或另一方通道夥伴受益。密碼學協議確保一個通道夥伴無法欺騙另一個,因此夥伴不需要相互信任。

密碼學協議是透過對 2-of-2「多重簽名地址」注資來建立的,該地址要求兩個通道夥伴合作,並防止任何一方單方面花費資金。

總結:支付通道是節點之間的財務關係,透過嚴格定義的密碼學協議從多重簽名地址分配資金。

3.2. 支付通道基礎

支付通道的底層只是比特幣區塊鏈上的一個 2-of-2 多重簽名地址,您持有一把金鑰,您的通道夥伴持有另一把金鑰。

您和您的通道夥伴協商一系列從這個多重簽名地址花費的交易。您們不是將這些交易傳輸並記錄在比特幣區塊鏈上,而是都保留它們,未花費。

該序列中的最新交易編碼了通道的餘額,並定義了該餘額如何在您和您的通道夥伴之間分配。

因此,向這個序列添加新交易相當於將部分通道餘額從一個通道夥伴轉移到另一個,而比特幣網路並不知道。當您協商每筆新交易、改變通道中的資金分配時,您還會撤銷之前的交易,這樣任何一方都無法回退到之前的狀態。

序列中的每筆交易都使用比特幣的腳本語言,因此您和您的通道夥伴之間的資金協商由比特幣智慧合約管理。 智慧合約設定為懲罰試圖提交先前已撤銷的通道狀態的通道成員。

如果您有一筆來自 2-of-2 多重簽名地址的未發布交易,該交易向您支付部分餘額,那麼來自另一方的簽名確保您可以隨時透過添加自己的簽名獨立發布此交易。

持有部分簽名的交易、離線且未發布、並可選擇隨時發布和擁有該餘額的能力,是閃電網路的基礎。

3.3. 跨通道路由支付

一旦多個參與者擁有從一方到另一方的通道,支付也可以透過設定跨越網路的「路徑」,從支付通道「轉發」到支付通道,將多個支付通道連接在一起。

例如,如果 Alice 與 Bob 有通道,而 Bob 與 Charlie 有通道,Alice 可以向 Charlie 發送資金。

透過閃電網路的設計,可以擴展操作通道的智慧合約,使 Bob 無法竊取正在透過其通道轉發的資金。

就像智慧合約保護通道夥伴使他們不需要相互信任一樣,整個網路保護參與者,使他們可以轉發支付而不需要信任任何其他參與者。

因為通道是由多重簽名地址構建的,而餘額更新交易是預簽名的比特幣交易,操作閃電網路所需的所有信任都來自對去中心化比特幣網路的信任!

上述創新無疑是允許創建閃電網路的重大突破。 然而,閃電網路遠不止是比特幣腳本語言之上的密碼學協議。 它是一個全面的通訊協議,允許對等節點交換閃電網路訊息以實現比特幣的轉移。 通訊協議定義了閃電網路訊息如何加密和交換。

閃電網路還使用 gossip 協議向所有參與者分發有關通道(網路拓撲)的公開資訊。

例如,Alice 需要網路拓撲資訊才能知道 Bob 和 Charlie 之間的通道,這樣她才能構建一條到 Charlie 的路徑。

最後但同樣重要的是,理解閃電網路只不過是比特幣之上的應用程式,使用比特幣交易和比特幣腳本。沒有「閃電幣」或「閃電區塊鏈」。 除了所有技術原語之外,閃電網路協議是一種創造性的方式,透過允許任意數量的即時支付和即時結算,從比特幣中獲得更多好處,而不需要信任比特幣網路以外的任何人。

3.4. 支付通道

正如我們在上一章中看到的,Alice 使用她的錢包軟體在她自己和另一個閃電網路參與者之間創建了一個支付通道。

通道只受三件事限制:

  • 首先,網際網路傳輸協議所需的幾百位元組資料,將資金從通道一端移動到另一端所需的時間

  • 其次,通道的容量,即開啟通道時承諾到通道的比特幣數量

  • 第三,比特幣交易的最大大小限制也限制了可以同時透過通道傳輸的未完成(進行中)路由支付數量

支付通道有一些非常有趣和有用的特性:

  • 因為更新通道的時間主要受網際網路通訊速度的限制,在支付通道上進行支付幾乎可以是即時的。

  • 如果通道是開啟的,進行支付不需要比特幣區塊的確認。事實上——只要您和您的通道夥伴遵循協議——它不需要與比特幣網路或您的通道夥伴以外的任何人互動。

  • 密碼學協議的構建使得您和您的通道夥伴之間幾乎不需要信任。如果您的夥伴變得無回應或試圖欺騙您,您可以要求比特幣系統充當「法院」,解決您和您的夥伴之前同意的智慧合約。

  • 在支付通道中進行的支付只有您和您的夥伴知道。在這個意義上,與比特幣相比,您獲得了隱私,因為比特幣中每筆交易都是公開的。只有最終餘額,即該通道中所有支付的總和,才會在比特幣區塊鏈上可見。

比特幣大約五歲時,才華橫溢的開發者首次弄清楚如何構建雙向、無限期、可路由的支付通道,到目前為止,至少有三種已知的方法。

本章將重點介紹 2015 年 Joseph Poon 和 Thaddeus Dryja 在 閃電網路白皮書 中首次描述的通道構建方法。這些被稱為 Poon-Dryja 通道,是目前閃電網路中使用的通道構建方法。 另外兩種提出的方法是 Duplex Micropayment 通道(由 Christian Decker 在與 Poon-Dryja 通道大約同一時間引入)和 eltoo 通道(在 2018 年由 Christian Decker、Rusty Russel 和本書合著者 Olaoluwa Osuntokun 在 "eltoo: A Simple Layer2 Protocol for Bitcoin" 中引入)。

eltoo 通道有一些有趣的特性,並簡化了支付通道的實現。然而,eltoo 通道需要比特幣腳本語言的更改,因此截至 2020 年無法在比特幣主網上實現。

3.4.1. 多重簽名地址

支付通道建立在 2-of-2 多重簽名地址之上。

總結來說,多重簽名地址是比特幣被鎖定的地方,需要多個簽名才能解鎖和花費。在閃電網路中使用的 2-of-2 多重簽名地址中,有兩個參與簽名者,「兩者」都需要簽名才能花費資金。

多重簽名腳本和地址在 多重簽章腳本 中有更詳細的解釋。

3.4.2. 資金交易

支付通道的基本構建模組是 2-of-2 多重簽名地址。兩個通道夥伴中的一個將透過向多重簽名地址發送比特幣來為支付通道注資。這筆交易稱為「資金交易」,並記錄在比特幣區塊鏈上。[1]

即使資金交易是公開的,除非通道被公開宣布,否則在關閉之前,它不會明顯是閃電網路支付通道。通道通常由希望轉發支付的路由節點公開宣布。然而,未宣布的通道也存在,通常由不積極參與路由的行動節點創建。此外,通道支付仍然對通道夥伴以外的任何人不可見,通道餘額在他們之間的分配也是如此。

存入多重簽名地址的金額稱為「通道容量」,它設定了可以透過支付通道發送的最大金額。然而,由於資金可以來回發送,通道容量不是可以流經通道的價值上限。這是因為如果通道容量在一個方向的支付中耗盡,它可以再次用於在相反方向發送支付。

在資金交易中發送到多重簽名地址的資金有時被稱為「鎖定在閃電網路通道中」。然而,實際上,閃電網路通道中的資金不是「鎖定」而是「釋放」的。閃電網路通道資金比比特幣區塊鏈上的資金更具流動性,因為它們可以更快、更便宜、更私密地花費。將資金轉移到閃電網路有一些缺點(例如需要將它們保存在「熱」錢包中),但將資金「鎖定」在閃電網路中的想法是誤導性的。

糟糕的通道開啟程序範例

如果您仔細考慮 2-of-2 多重簽名地址,您會意識到將您的資金放入這樣的地址似乎有一些風險。如果您的通道夥伴拒絕簽署交易來釋放資金怎麼辦?它們會永遠卡住嗎?現在讓我們看看那個場景以及閃電網路協議如何避免它。

Alice 和 Bob 想要創建一個支付通道。他們各自創建一個私鑰/公鑰對,然後交換公鑰。現在,他們可以用這兩個公鑰構建一個多重簽名 2-of-2,形成他們支付通道的基礎。

接下來,Alice 構建一筆比特幣交易,從她的錢包發送幾個 mBTC 到由 Alice 和 Bob 的公鑰創建的多重簽名地址。如果 Alice 不採取任何額外步驟就簡單地廣播這筆交易,她必須相信 Bob 會提供他的簽名來從多重簽名地址花費。另一方面,Bob 有機會透過扣留他的簽名並拒絕 Alice 存取她的資金來勒索 Alice。

為了防止這種情況,Alice 需要創建一筆額外的交易,從多重簽名地址花費,將她的 mBTC 退還給她。然後 Alice 讓 Bob 在將她的資金交易廣播到比特幣網路「之前」簽署退款交易。這樣,即使 Bob 消失或未能合作,Alice 也可以獲得退款。

保護 Alice 的「退款」交易是一類稱為「承諾交易」的交易中的第一個,我們將在下一節中更詳細地檢查。

3.4.3. 承諾交易

「承諾交易」是向每個通道夥伴支付其通道餘額並確保通道夥伴不必相互信任的交易。透過簽署承諾交易,每個通道夥伴「承諾」當前餘額,並讓另一個通道夥伴能夠隨時取回他們的資金。

透過持有已簽名的承諾交易,每個通道夥伴即使沒有另一個通道夥伴的合作也可以獲得他們的資金。這保護他們免受另一個通道夥伴的消失、拒絕合作或透過違反支付通道協議試圖欺騙的影響。

Alice 在前面範例中準備的承諾交易是她對多重簽名地址初始支付的退款。然而,更一般地說,承諾交易分割支付通道的資金,根據兩個通道夥伴各自持有的分配(餘額)向他們支付。起初,Alice 持有所有餘額,所以這是一個簡單的退款。但隨著資金從 Alice 流向 Bob,他們會交換代表新餘額分配的新承諾交易簽名,部分資金支付給 Alice,部分支付給 Bob。

假設 Alice 與 Bob 開啟一個容量為 100,000 聰的通道。 最初,Alice 擁有 100,000 聰,即通道中的全部資金。以下是支付通道協議的運作方式:

  1. Alice 創建一個新的私鑰/公鑰對,並透過 open_channel 訊息(閃電網路協議中的訊息)通知 Bob 她希望開啟一個通道。

  2. Bob 也創建一個新的私鑰/公鑰對,並同意接受來自 Alice 的通道,透過 accept_channel 訊息將他的公鑰發送給 Alice。

  3. Alice 現在從她的錢包創建一筆資金交易,將 100k 聰發送到具有鎖定腳本的多重簽名地址:2 <PubKey Alice> <PubKey Bob> 2 CHECKMULTISIG。

  4. Alice 尚未廣播這筆資金交易,而是在 funding_created 訊息中將交易 ID 發送給 Bob,以及她對 Bob 承諾交易的簽名。

  5. Alice 和 Bob 都創建他們版本的承諾交易。這筆交易將從資金交易花費,並將所有比特幣發送回 Alice 控制的地址。

  6. Alice 和 Bob 不需要交換這些承諾交易,因為他們各自知道它們是如何構建的,可以獨立構建兩者(因為他們已經就輸入和輸出的規範順序達成一致)。他們只需要交換簽名。

  7. Bob 為 Alice 的承諾交易提供簽名,並透過 funding_signed 訊息將其發送回 Alice。

  8. 現在簽名已經交換,Alice 將把資金交易廣播到比特幣網路。

透過遵循這個協議,即使資金被發送到 Alice 只控制一把金鑰的 2-of-2 多重簽名地址,Alice 也不會放棄她 100k 聰的所有權。 如果 Bob 停止回應 Alice,她將能夠廣播她的承諾交易並取回她的資金。 她唯一的成本是鏈上交易的費用。 只要她遵循協議,這就是她開啟通道時的唯一風險。

在這次初始交換之後,每當通道餘額變化時都會創建承諾交易。換句話說,每次在 Alice 和 Bob 之間發送支付時,都會創建新的承諾交易並交換簽名。每筆新的承諾交易都編碼了 Alice 和 Bob 之間的最新餘額。

如果 Alice 想向 Bob 發送 30k 聰,兩人都會創建他們承諾交易的新版本,現在向 Alice 支付 70k 聰,向 Bob 支付 30k 聰。透過編碼 Alice 和 Bob 的新餘額,新的承諾交易是透過通道「發送」支付的方式。

現在我們理解了承諾交易,讓我們看看一些更微妙的細節。您可能注意到這個協議留下了一種讓 Alice 或 Bob 作弊的方式。

3.4.4. 用先前狀態作弊

Alice 向 Bob 支付 30k 聰後持有多少筆承諾交易?她持有兩筆:原始的那筆向她支付 100k 聰,以及較新的那筆向她支付 70k 聰、向 Bob 支付 30k 聰。

在我們目前看到的通道協議中,沒有任何東西阻止 Alice 發布先前的承諾交易。作弊的 Alice 可以發布向她授予 100k 聰的承諾交易。 由於該承諾交易是由 Bob 簽署的,他無法阻止 Alice 傳輸它。

需要某種機制來防止 Alice 發布舊的承諾交易。現在讓我們找出如何實現這一點,以及它如何使閃電網路能夠在 Alice 和 Bob 之間無需任何信任的情況下運行。

因為比特幣是抗審查的,沒有人可以阻止某人發布舊的承諾交易。為了防止這種形式的作弊,承諾交易被構建為如果舊的被傳輸,作弊者可以受到懲罰。透過使懲罰足夠大,我們創造了強大的反作弊激勵,這使系統安全。

懲罰的運作方式是給被欺騙方一個機會來索取作弊者的餘額。因此,如果有人試圖透過廣播舊的承諾交易來作弊,在該交易中他們獲得的餘額比他們應得的更高,另一方可以透過同時拿走他們自己的餘額「和」作弊者的餘額來懲罰他們。作弊者失去一切。

您可能注意到,如果 Alice 幾乎完全耗盡她的通道餘額,她就可以嘗試以很小的風險作弊。如果她的通道餘額很低,Bob 的懲罰就不會那麼痛苦。為了防止這種情況,閃電網路協議要求每個通道夥伴在通道中保持最低餘額(稱為「準備金」),這樣他們總是有「利害關係」。

讓我們再次經歷通道構建場景,添加懲罰機制來防止作弊:

  1. Alice 與 Bob 創建一個通道,並投入 100k 聰。

  2. Alice 向 Bob 發送 30k 聰。

  3. Alice 試圖透過發布舊的承諾交易來欺騙 Bob 賺得的 30k 聰,為自己索取全部 100k 聰。

  4. Bob 檢測到欺詐並透過為自己拿走全部 100k 聰來懲罰 Alice。

  5. Bob 最終擁有 100k 聰,因抓住 Alice 作弊而獲得 70k 聰。

  6. Alice 最終擁有 0 聰。

  7. 試圖欺騙 Bob 30k 聰,她失去了她擁有的 70k 聰。

有了強大的懲罰機制,Alice 不會想透過發布舊的承諾交易來作弊,因為她冒著失去全部餘額的風險。

在《Mastering Bitcoin》第 12 章中,Andreas Antonopoulos(本書合著者)如此陳述: 「比特幣的一個關鍵特徵是,一旦交易有效,它就保持有效且不會過期。取消交易的唯一方法是在其被開採之前用另一筆交易雙花其輸入。」

現在我們理解了「為什麼」需要懲罰機制以及它將如何防止作弊,讓我們詳細看看它是「如何」運作的。

通常,承諾交易至少有兩個輸出,向每個通道夥伴支付。我們改變這一點,向其中一個支付添加「時間鎖延遲」和「撤銷秘密」。時間鎖防止輸出的所有者在承諾交易被包含在區塊中後立即花費它。撤銷秘密允許任何一方立即花費該支付,繞過時間鎖。

因此,在我們的範例中,Bob 持有一筆「立即」向 Alice 支付的承諾交易,但他自己的支付是延遲和可撤銷的。Alice 也持有一筆承諾交易,但她的是相反的:它立即向 Bob 支付,但她自己的支付是延遲和可撤銷的。

兩個通道夥伴各持有撤銷秘密的一半,所以他們都不知道整個秘密。如果他們分享自己的一半,那麼另一個通道夥伴就擁有完整的秘密,可以用它來行使撤銷條件。當簽署新的承諾交易時,每個通道夥伴透過將他們的撤銷秘密一半給另一方來撤銷先前的承諾。

我們將在 撤銷和重新承諾 中更詳細地檢查撤銷機制,在那裡我們將學習撤銷秘密如何構建和使用的細節。

簡單來說,只有當 Bob 提供他上一個承諾的撤銷秘密一半時,Alice 才簽署 Bob 的新承諾交易。只有當 Alice 給他上一個承諾的撤銷秘密一半時,Bob 才簽署 Alice 的新承諾交易。

每次新的承諾,他們都交換必要的「懲罰」秘密,使他們能夠透過使傳輸先前承諾變得無利可圖來有效地「撤銷」先前的承諾交易。本質上,他們在簽署新承諾時摧毀了使用舊承諾的能力。我們的意思是,雖然技術上仍然可以使用舊的承諾,但懲罰機制使這樣做在經濟上是不理性的。

時間鎖設定為最多 2,016 個區塊(大約兩週)。如果任何一個通道夥伴在未與另一個夥伴合作的情況下發布承諾交易,他們將不得不等待該區塊數(例如兩週)才能索取他們的餘額。另一個通道夥伴可以隨時索取他們自己的餘額。此外,如果發布的承諾之前已被撤銷,通道夥伴「也」可以立即索取作弊方的餘額,繞過時間鎖並懲罰作弊者。

時間鎖是可調整的,可以在通道夥伴之間協商。通常,對於較大容量的通道,時間鎖較長,對於較小的通道,時間鎖較短,以使激勵與資金價值保持一致。

對於通道餘額的每次新更新,都必須創建和保存新的承諾交易和新的撤銷秘密。只要通道保持開啟,為通道創建的所有撤銷秘密都需要保留,因為它們將來可能需要。幸運的是,秘密相當小,只有通道夥伴需要保留它們,而不是整個網路。此外,由於用於導出撤銷秘密的智慧導出機制,我們只需要儲存最新的秘密,因為先前的秘密可以從中導出(參見 作弊和懲罰的實踐)。

儘管如此,管理和儲存撤銷秘密是閃電網路節點更精細的部分之一,需要節點運營商維護備份。

諸如瞭望塔服務或將通道構建協議更改為 eltoo 協議等技術可能是未來緩解這些問題並減少對撤銷秘密、懲罰交易和通道備份需求的策略。

如果 Bob 不回應,Alice 可以隨時關閉通道,索取她公平份額的餘額。 在鏈上發布「最後」的承諾交易後,Alice 必須等待時間鎖過期才能從承諾交易中花費她的資金。正如我們稍後將看到的,只要 Alice 和 Bob 都在線並合作以正確的餘額分配關閉通道,就有一種更簡單的方法來關閉通道而無需等待。但每個通道夥伴儲存的承諾交易充當故障保護,確保如果他們的通道夥伴有問題,他們不會失去資金。

3.4.5. 宣布通道

通道夥伴可以同意向整個閃電網路宣布他們的通道,使其成為「公開通道」。為了宣布通道,他們使用閃電網路的 gossip 協議告訴其他節點通道的存在、容量和費用。

公開宣布通道允許其他節點使用它們進行支付路由,從而也為通道夥伴產生路由費用。

相比之下,通道夥伴可能決定不宣布通道,使其成為「未宣布」通道。

您可能聽到「私有通道」這個術語用來描述未宣布的通道。我們避免使用這個術語,因為它具有誤導性並創造了一種虛假的隱私感。雖然未宣布的通道在使用時不會被他人知道,但當通道關閉時,其存在和容量將被揭示,因為這些細節將在最終結算交易中在鏈上可見。其存在也可能透過各種其他方式洩露,所以我們避免稱其為「私有」。

未宣布的通道仍然用於路由支付,但只有知道其存在的節點,或給予「路由提示」關於包含未宣布通道的路徑。

當使用 gossip 協議公開宣布通道及其容量時,宣布還可以包含有關通道的資訊(元資料),例如其路由費用和時間鎖持續時間。

當新節點加入閃電網路時,它們從對等節點收集透過 gossip 協議傳播的通道宣布,建立閃電網路的內部地圖。然後可以使用此地圖來查找支付路徑,將通道端到端連接在一起。

3.4.6. 關閉通道

關閉通道的最佳方式是…​不要關閉它! 開啟和關閉通道需要鏈上交易,這將產生交易費用。 因此,最好盡可能長時間保持通道開啟。 只要您在通道一端有足夠的容量,您就可以繼續使用通道進行和轉發支付。 但即使您將所有餘額發送到通道的另一端,您也可以使用通道從您的通道夥伴那裡接收支付。 這種在一個方向使用通道然後在相反方向使用它的概念稱為「再平衡」,我們將在另一章中更詳細地檢查它。 透過再平衡通道,它可以幾乎無限期地保持開啟,並用於基本上無限數量的支付。

然而,有時關閉通道是可取的或必要的。例如:

  • 您出於安全原因想要減少閃電網路通道上持有的餘額,並希望將資金發送到「冷儲存」。

  • 您的通道夥伴長時間無回應,您無法再使用該通道。

  • 通道不經常使用,因為您的通道夥伴不是一個連接良好的節點,所以您想將資金用於與更好連接節點的另一個通道。

  • 您的通道夥伴違反了協議,無論是由於軟體錯誤還是故意的,迫使您關閉通道以保護您的資金。

有三種方式可以關閉支付通道:

  • 互相關閉(好的方式)

  • 強制關閉(壞的方式)

  • 協議違規(醜陋的方式)

每種方法在不同情況下都是有用的,我們將在本章的下一節中探討。 例如,如果您的通道夥伴離線,您將無法遵循「好的方式」,因為沒有合作夥伴無法進行互相關閉。 通常,您的閃電網路軟體會根據情況自動選擇最佳的關閉機制。

互相關閉(好的方式)

互相關閉是當兩個通道夥伴同意關閉通道時,是首選的通道關閉方法。

當您決定要關閉通道時,您的閃電網路節點會通知您的通道夥伴您的意圖。 現在您的節點和通道夥伴的節點一起工作來關閉通道。 任何一方都不會接受新的路由嘗試,任何正在進行的路由嘗試都將在超時後結算或移除。 最終確定路由嘗試需要時間,所以互相關閉也可能需要一些時間才能完成。

一旦沒有待處理的路由嘗試,節點就會合作準備一筆「關閉交易」。 這筆交易類似於承諾交易:它編碼通道的最後餘額,但輸出不受時間鎖的限制。

關閉交易的鏈上交易費用由開啟通道的通道夥伴支付,而不是由發起關閉程序的人支付。 使用鏈上費用估算器,通道夥伴就適當的費用達成一致,雙方都簽署關閉交易。

一旦關閉交易被廣播並被比特幣網路確認,通道就有效地關閉了,每個通道夥伴都收到了他們在通道餘額中的份額。 儘管有等待時間,互相關閉通常比強制關閉更快。

強制關閉(壞的方式)

強制關閉是當一個通道夥伴試圖在未經另一個通道夥伴同意的情況下關閉通道。

這通常發生在其中一個通道夥伴無法聯繫時,所以互相關閉是不可能的。 在這種情況下,您會發起強制關閉,單方面關閉通道並「釋放」資金。

要發起強制關閉,您可以簡單地發布您節點持有的最後一筆承諾交易。 畢竟,這就是承諾交易的用途——它們保證您不需要信任您的通道夥伴就可以取回您通道的餘額。

一旦您將最後一筆承諾交易廣播到比特幣網路並被確認,它將創建兩個可花費的輸出,一個給您,一個給您的夥伴。 正如我們之前討論的,比特幣網路無法知道這是最近的承諾交易還是發布來從您夥伴那裡偷竊的舊交易。 因此,這筆承諾交易會給您的夥伴一點優勢。 發起強制關閉的夥伴的輸出會受到時間鎖的限制,而另一個夥伴的輸出會立即可花費。 如果您廣播了較早的承諾交易,時間鎖延遲給您的夥伴機會使用撤銷秘密對交易提出異議並懲罰您的作弊行為。

在強制關閉期間發布承諾交易時,鏈上費用會比互相關閉更高,原因有幾個:

  1. 當承諾交易被協商時,通道夥伴不知道交易廣播時的鏈上費用會是多少。由於沒有雙方簽名就無法更改費用而不更改承諾交易的輸出,而且強制關閉發生在通道夥伴無法簽名時,協議開發者決定對承諾交易中包含的費率非常慷慨。它可以比承諾交易協商時費用估算器建議的高出五倍。

  2. 承諾交易包括任何待處理路由嘗試雜湊時間鎖定合約(HTLC)的額外輸出,這使得承諾交易比互相關閉交易更大(以位元組計)。更大的交易產生更多費用。

  3. 任何待處理的路由嘗試都必須在鏈上解決,導致額外的鏈上交易。

雜湊時間鎖定合約(HTLC)將在 雜湊時間鎖定合約 中詳細介紹。 現在,假設這些是透過閃電網路路由的支付,而不是兩個通道夥伴之間直接進行的支付。 這些 HTLC 作為承諾交易中的額外輸出攜帶,從而增加交易大小和鏈上費用。

一般來說,除非絕對必要,否則不建議強制關閉。 您的資金會被鎖定更長時間,開啟通道的人將不得不支付更高的費用。 此外,即使您沒有開啟通道,您也可能需要支付鏈上費用來中止或結算路由嘗試。

如果通道夥伴是您認識的,您可能會考慮聯繫該個人或公司,詢問他們的閃電網路節點為什麼關閉,並請求他們重新啟動它,以便您可以實現通道的互相關閉。

您應該只將強制關閉視為最後的手段。

協議違規(醜陋的方式)

協議違規是當您的通道夥伴試圖欺騙您時,無論是故意還是無意的,透過將過時的承諾交易發布到比特幣區塊鏈,本質上是從他們那邊發起(不誠實的)強制關閉。

您的節點必須在線並監視比特幣區塊鏈上的新區塊和交易才能檢測到這一點。

因為您的通道夥伴的支付會受到時間鎖的限制,您的節點有一些時間在時間鎖過期之前檢測協議違規並發布「懲罰交易」。

如果您成功檢測到協議違規並執行懲罰,您將收到通道中的所有資金,包括您通道夥伴的資金。

在這種情況下,通道關閉會相當快。 您將不得不支付鏈上費用來發布懲罰交易,但您的節點可以根據費用估算設定這些費用,而不會多付。 您通常會想支付更高的費用以保證盡快確認。 然而,因為您最終會收到作弊者的所有資金,本質上是作弊者在支付這筆交易。

如果您未能檢測到協議違規且時間鎖過期,您將只收到您夥伴發布的承諾交易分配給您的資金。 在此之後您收到的任何資金都會被您的夥伴竊取。 如果有任何餘額分配給您,您將不得不支付鏈上費用來收取該餘額。

與強制關閉一樣,所有待處理的路由嘗試也必須在承諾交易中解決。

協議違規可以比互相關閉執行得更快,因為您不需要等待與您的夥伴協商關閉,也比強制關閉更快,因為您不需要等待您的時間鎖過期。

賽局理論預測作弊不是一個有吸引力的策略,因為很容易檢測到作弊者,而且作弊者冒著失去「所有」資金的風險,而只能獲得他們在較早狀態中的收益。 此外,隨著閃電網路的成熟和瞭望塔變得廣泛可用,即使被欺騙的通道夥伴離線,作弊者也會被第三方檢測到。

因此,我們不建議作弊。 然而,我們確實建議任何抓住作弊者的人透過拿走他們的資金來懲罰他們。

那麼,您如何在日常活動中抓住作弊或協議違規? 您透過運行監控公開比特幣區塊鏈的軟體來做到這一點,該軟體監控與您任何通道的任何承諾交易相對應的鏈上交易。 此軟體是三種類型之一:

  • 正確維護的閃電網路節點,全天候運行

  • 您運行來監視通道的單一用途瞭望塔節點

  • 您付費來監視通道的第三方瞭望塔節點

請記住,承諾交易有一個以給定區塊數指定的超時期限,最多 2,016 個區塊。 只要您在超時期限到達之前運行閃電網路節點一次,它就會抓住所有作弊嘗試。 不建議冒這種風險;保持一個維護良好的節點持續運行很重要(參見 為什麼可靠性對運行閃電網路節點很重要?)。

3.5. 發票

閃電網路上的大多數支付都是從接收者創建的發票開始的。在我們之前的範例中,Bob 創建了一張發票來請求 Alice 付款。

有一種方法可以在沒有發票的情況下發送未經請求的支付,使用協議中稱為 keysend 的解決方法。我們將在 Keysend 自發付款 中檢查這一點。

發票是一個簡單的支付指令,包含諸如唯一支付識別碼(稱為支付雜湊)、接收者、金額和可選文字描述等資訊。

發票最重要的部分是支付雜湊,它允許支付以「原子」方式跨多個通道傳輸。在計算機科學中,原子意味著任何完全成功完成或根本不完成的動作或狀態變化——沒有中間狀態或部分動作的可能性。在閃電網路中,這意味著支付要麼走完整條路徑,要麼完全失敗。它不能部分完成,使得路徑上的中間節點可以收到支付並保留它。 沒有「部分支付」或「部分成功支付」這回事。

發票不透過閃電網路傳輸。相反,它們「帶外」傳輸,使用任何其他通訊機制。這類似於比特幣地址如何在比特幣網路之外傳輸給發送者:作為 QR 碼、透過電子郵件或簡訊。例如,Bob 可以向 Alice 展示閃電網路發票作為 QR 碼、透過電子郵件或透過任何其他訊息通道。

發票通常編碼為長的 bech32 編碼字串或 QR 碼,由智慧手機閃電網路錢包掃描。發票包含請求的比特幣金額和接收者的簽名。發送者使用簽名來提取接收者的公鑰(也稱為節點 ID),這樣發送者就知道將支付發送到哪裡。

您注意到這與比特幣的對比以及使用了不同的術語嗎?在比特幣中,接收者將地址傳遞給發送者。在閃電網路中,接收者創建發票並將發票發送給發送者。在比特幣中,發送者將資金發送到地址。在閃電網路中,發送者支付發票,支付被路由到接收者。比特幣基於「地址」的概念,而閃電網路是基於「發票」概念的支付網路。在比特幣中,我們創建「交易」,而在閃電網路中,我們發送「支付」。

3.5.1. 支付雜湊和原像

發票最重要的部分是「支付雜湊」。當構建發票時,Bob 會這樣做支付雜湊:

  1. Bob 選擇一個隨機數 r。這個隨機數稱為「原像」或「支付秘密」。

  2. Bob 使用 SHA-256 計算 r 的雜湊 H,稱為「支付雜湊」:H = SHA-256(r)。

術語「原像」來自數學。在任何函數 y = f(x) 中,產生某個值 y 的輸入集合稱為 y 的原像。在這種情況下,函數是 SHA-256 雜湊演算法,任何產生雜湊 H 的值 r 都稱為原像。

沒有已知的方法可以找到 SHA-256 的逆(即從雜湊計算原像)。只有 Bob 知道值 r,所以它是 Bob 的秘密。但一旦 Bob 透露 r,任何擁有雜湊 H 的人都可以透過計算 SHA-256(r) 並看到它與 H 匹配來檢查 r 是否是正確的秘密。

只有當 r 完全隨機選擇且不可預測時,閃電網路的支付過程才是安全的。這種安全性依賴於雜湊函數不能被反轉或可行地暴力破解的事實,因此沒有人可以從 H 找到 r

3.5.2. 額外元資料

發票可以選擇性地包含其他有用的元資料,例如簡短的文字描述。如果使用者有多張發票要支付,使用者可以閱讀描述並被提醒發票是關於什麼的。

發票還可以包含一些「路由提示」,允許發送者使用未宣布的通道來構建到接收者的路徑。路由提示也可以用於建議公開通道,例如接收者知道有足夠入站容量來路由支付的通道。

如果發送者的閃電網路節點無法透過閃電網路發送支付,發票可以選擇性地包含一個鏈上比特幣地址作為備用。

雖然總是可以「回退」到鏈上比特幣交易,但實際上更好的做法是向接收者開啟一個新通道。如果您必須產生鏈上費用來進行支付,您不如產生這些費用來開啟一個通道並透過閃電網路進行支付。支付完成後,您會留下一個在接收者端有流動性的開啟通道,可以用於將來將支付路由回您的閃電網路節點。一筆鏈上交易給您一筆支付和一個未來使用的通道。

閃電網路發票包含一個過期日期。由於接收者必須為每張發出的發票保留原像 r,讓發票過期是有用的,這樣這些原像就不需要永遠保留。一旦發票過期或被支付,接收者可以丟棄原像。

3.6. 傳遞支付

我們已經看到接收者如何創建包含支付雜湊的發票。這個支付雜湊將用於透過一系列支付通道從發送者移動支付到接收者,即使他們之間沒有直接的支付通道。

在接下來的幾節中,我們將深入了解用於透過閃電網路傳遞支付的想法和方法,並使用我們迄今為止呈現的所有概念。

首先,讓我們看看閃電網路的通訊協議。

3.6.1. 點對點 Gossip 協議

正如我們之前提到的,當構建支付通道時,通道夥伴可以選擇公開它,向整個閃電網路宣布其存在和細節。

通道宣布透過點對點「gossip 協議」傳播。gossip 協議是一種通訊協議,每個節點連接到網路中隨機選擇的其他節點,通常透過 TCP/IP。直接連接到您節點(透過 TCP/IP)的每個節點稱為您的「對等節點」。您的節點反過來是他們的對等節點之一。請記住,當我們說您的節點連接到其他對等節點時,我們不是指您有支付通道,而只是您透過 gossip 協議連接。

開啟通道後,節點可以選擇透過 channel_announcement 訊息向其對等節點發送通道的宣布。 每個對等節點驗證來自 channel_announcement 訊息的資訊,並驗證資金交易是否在比特幣區塊鏈上確認。 驗證後,節點會將 gossip 訊息轉發給其自己的對等節點,他們會將其轉發給他們的對等節點,依此類推,將宣布傳播到整個網路。 為了避免過度通訊,只有當節點之前尚未轉發該宣布時,才會轉發通道宣布。

gossip 協議還用於透過 node_announcement 訊息宣布有關已知節點的資訊。 為了轉發此訊息,節點必須至少有一個公開通道在 gossip 協議上宣布,再次是為了避免過度通訊流量。

支付通道有各種元資料,對網路的其他參與者有用。 這些元資料主要用於做出路由決策。 因為節點可能偶爾會更改其通道的元資料,這些資訊透過 channel_update 訊息共享。 這些訊息大約每天只會轉發四次(每個通道),以防止過度通訊。 gossip 協議還有各種查詢和訊息,用於最初同步節點與網路視圖,或在離線一段時間後更新節點的視圖。

閃電網路參與者的一個主要挑戰是,由 gossip 協議共享的拓撲資訊只是部分的。 例如,支付通道的容量透過 channel_announcement 訊息在 gossip 協議上共享。 然而,這些資訊不如兩個通道夥伴之間本地餘額方面的容量實際分配那麼有用。 一個節點只能轉發它在該通道內實際擁有(本地餘額)的比特幣數量。

雖然閃電網路本可以設計為共享通道的餘額資訊和精確拓撲,但由於以下幾個原因而沒有這樣做:

  • 為了保護使用者的隱私,它不會大聲廣播每一筆金融交易和支付。通道餘額更新會透露支付已通過通道移動。這些資訊可能會被關聯以揭示所有支付來源和目的地。

  • 為了擴展可以透過閃電網路進行的支付數量。請記住,閃電網路首先被創建是因為通知每個參與者每一筆支付無法很好地擴展。因此,閃電網路不能以在參與者之間共享通道餘額更新的方式設計。

  • 閃電網路是一個動態系統。它不斷且頻繁地變化。節點被添加,其他節點被關閉,餘額變化等。即使一切都始終被傳達,資訊也只會在短時間內有效。事實上,資訊在收到時通常已經過時。

我們將在後面的章節中檢查 gossip 協議的細節。

現在,只需要知道 gossip 協議存在,並且它用於共享閃電網路的拓撲資訊。 這種拓撲資訊對於透過支付通道網路傳遞支付至關重要。

3.6.2. 路徑搜尋和路由

閃電網路上的支付沿著由連接一個參與者到另一個參與者的通道組成的「路徑」轉發,從支付來源到支付目的地。找到從來源到目的地路徑的過程稱為「路徑搜尋」。使用該路徑進行支付的過程稱為「路由」。

對閃電網路的一個常見批評是路由沒有解決,甚至是「無法解決」的問題。事實上,路由是微不足道的。另一方面,路徑搜尋是一個困難的問題。這兩個術語經常被混淆,需要明確定義以確定我們試圖解決哪個問題。

正如我們接下來將看到的,閃電網路目前使用「基於來源」的協議進行路徑搜尋,使用「洋蔥路由」協議進行支付路由。基於來源意味著支付的發送者必須找到一條穿過網路到達預期目的地的路徑。洋蔥路由意味著路徑的元素是分層的(像洋蔥一樣),每一層都加密,所以一次只能被一個節點看到。我們將在下一節討論洋蔥路由。

3.7. 基於來源的路徑搜尋

如果我們知道每個通道的確切通道餘額,我們可以使用任何計算機科學課上教授的標準路徑搜尋演算法輕鬆計算支付路徑。這甚至可以以優化支付給節點轉發支付的費用的方式來解決。

然而,所有通道的餘額資訊不是也不能被網路的所有參與者知道。我們需要更創新的路徑搜尋策略。

由於只有網路拓撲的部分資訊,路徑搜尋是一個真正的挑戰,對閃電網路這部分的積極研究仍在進行中。路徑搜尋問題在閃電網路中沒有「完全解決」的事實是對該技術的一個主要批評點。

對閃電網路中路徑搜尋的一個常見批評是它無法解決,因為它等同於 NP 完全的「旅行推銷員問題」(TSP),這是計算複雜性理論中的一個基本問題。事實上,閃電網路中的路徑搜尋不等同於 TSP,屬於不同類別的問題。每次我們要求 Google 給我們避開交通的駕駛方向時,我們都成功地解決了這些類型的問題(在資訊不完整的圖中進行路徑搜尋)。每次我們在閃電網路上路由支付時,我們也成功地解決了這個問題。

路徑搜尋和路由可以以多種不同的方式實現,多種路徑搜尋和路由演算法可以在閃電網路上共存,就像多種路徑搜尋和路由演算法存在於網際網路上一樣。基於來源的路徑搜尋是許多可能解決方案之一,在閃電網路目前的規模下是成功的。

閃電網路節點目前實現的路徑搜尋策略是迭代嘗試路徑,直到找到一條有足夠流動性來轉發支付的路徑。這是一個試錯的迭代過程,直到成功或找不到路徑。該演算法目前不一定會產生費用最低的路徑。雖然這不是最優的,肯定可以改進,但即使這種簡單的策略也運作得相當好。

這種「探測」由閃電網路節點或錢包完成,使用者不會直接看到。 使用者可能只有在支付沒有立即完成時才意識到正在進行探測。

在網際網路上,我們使用網際網路協議和 IP 轉發演算法將網際網路封包從發送者轉發到目的地。雖然這些協議具有允許網際網路主機協作找到資訊流經網際網路路徑的良好特性,但我們不能重用和採用這個協議來在閃電網路上轉發支付。與網際網路不同,閃電網路支付必須是「原子的」,通道餘額必須保持「私密」。此外,閃電網路中的通道容量變化頻繁,不像網際網路中連接容量相對靜態。這些約束需要新穎的策略。

當然,如果我們想向我們的直接通道夥伴支付,並且我們在通道一側有足夠的餘額來這樣做,路徑搜尋是微不足道的。在所有其他情況下,我們的節點使用來自 gossip 協議的資訊進行路徑搜尋。這包括目前已知的公開支付通道、已知節點、已知拓撲(已知節點如何連接)、已知通道容量,以及節點所有者設定的已知費用政策。

3.7.1. 洋蔥路由

閃電網路使用類似於著名的 Tor(洋蔥路由器)網路的「洋蔥路由協議」。 閃電網路中使用的洋蔥路由協議稱為 SPHINX Mix Format[2]將在後面的章節中詳細解釋。

閃電網路的洋蔥路由 SPHINX Mix Format 在概念上只與 Tor 網路路由相似,但協議和實現與 Tor 網路中使用的完全不同。

用於路由的支付封包稱為「洋蔥」。[3]

讓我們用洋蔥的類比來跟隨路由支付。在從支付發送者(付款人)到支付目的地(收款人)的路線上,洋蔥沿著路徑從一個節點傳遞到另一個節點。發送者從中心向外構建整個洋蔥。首先,發送者為支付的(最終)接收者創建支付資訊,並用只有接收者可以解密的加密層對其加密。然後,發送者用路徑中「緊接最終接收者之前」的節點的指令包裹該層,並用只有該節點可以解密的層加密。

各層是用指令構建的,向後工作直到整個路徑被編碼在各層中。然後發送者將完整的洋蔥交給路徑中的第一個節點,該節點只能讀取最外層。每個節點剝掉一層,發現裡面的指令揭示路徑中的下一個節點,並將洋蔥傳遞下去。當每個節點剝掉一層時,它無法讀取洋蔥的其餘部分。它所知道的只是洋蔥剛從哪裡來和它要去哪裡,沒有任何關於誰是原始發送者或最終接收者的指示。

這種情況繼續,直到洋蔥到達支付目的地(收款人)。然後,目的地節點打開洋蔥,發現沒有更多層可以解密,可以讀取裡面的支付資訊。

與真正的洋蔥不同,當剝掉每一層時,節點會添加一些加密填充以保持洋蔥的大小對下一個節點相同。正如我們將看到的,這使得任何中間節點都無法知道路徑的大小(長度)、涉及多少節點進行路由、前面有多少節點或後面有多少節點。這增加了隱私,防止了瑣碎的流量分析攻擊。

閃電網路中使用的洋蔥路由協議具有以下特性:

  • 中介節點只能看到它在哪個通道上收到洋蔥以及在哪個通道上轉發洋蔥。這意味著沒有路由節點可以知道誰發起了支付以及支付的目的地是誰。這是最重要的特性,它帶來高度的隱私。

  • 洋蔥足夠小,可以放入單個 TCP/IP 封包甚至鏈路層(例如乙太網)幀中。這使得支付的流量分析變得更加困難,進一步增加了隱私。

  • 洋蔥的構建使得無論處理節點在路徑上的位置如何,它們都將具有相同的長度。當每一層被「剝掉」時,洋蔥會用加密的「垃圾」資料填充以保持洋蔥的大小相同。這防止中介節點知道他們在路徑中的位置。

  • 洋蔥在每一層都有 HMAC(基於雜湊的訊息認證碼),因此洋蔥的操縱被防止且實際上是不可能的。

  • 洋蔥最多可以有約 26 跳,如果您願意也可以稱為洋蔥層。這允許足夠長的路徑。精確的可用路徑長度取決於分配給每跳路由負載的位元組數。

  • 每一跳的洋蔥加密使用不同的臨時加密金鑰。如果金鑰(特別是節點的私鑰)在某個時間點洩露,攻擊者無法解密它們。簡單來說,金鑰永遠不會重用以實現更高的安全性。

  • 錯誤可以使用相同的洋蔥路由協議從出錯節點發送回原始發送者。對於外部觀察者和中介節點,錯誤洋蔥與路由洋蔥無法區分。錯誤路由使用於找到有足夠容量成功路由支付的路徑的試錯「探測」方法成為可能。

洋蔥路由將在 洋蔥路由 中詳細檢查。

3.7.2. 支付轉發演算法

一旦支付的發送者找到了一條可能的跨網路路徑並構建了洋蔥,支付就會由路徑中的每個節點轉發。每個節點處理洋蔥的一層並將其轉發給路徑中的下一個節點。

每個中介節點收到一條稱為 update_add_htlc 的閃電網路訊息,其中包含支付雜湊和洋蔥。中介節點執行一系列步驟,稱為「支付轉發演算法」:

  1. 節點解密洋蔥的外層並檢查訊息的完整性。

  2. 它確認它可以根據通道費用和出站通道上的可用容量來滿足路由提示。

  3. 它與入站通道上的通道夥伴一起更新通道狀態。

  4. 它在洋蔥末端添加一些填充以保持其恆定長度,因為它從開頭移除了一些資料。

  5. 它遵循路由提示在其出站支付通道上轉發修改後的洋蔥封包,也發送一條包含相同支付雜湊和洋蔥的 update_add_htlc 訊息。

  6. 它與出站通道上的通道夥伴一起更新通道狀態。

當然,如果檢測到錯誤,這些步驟會被中斷和中止,並向 update_add_htlc 訊息的發起者發送錯誤訊息。錯誤訊息也被格式化為洋蔥,並在入站通道上向後發送。

隨著錯誤在路徑上的每個通道向後傳播,通道夥伴移除待處理支付,以與開始相反的方式回滾支付。

雖然如果支付沒有快速結算,支付失敗的可能性很高,但節點永遠不應該在洋蔥帶著錯誤返回之前沿著不同的路徑發起另一次支付嘗試。如果兩次支付嘗試最終都成功,發送者將支付兩次。

3.8. 點對點通訊加密

閃電網路協議主要是其參與者之間的點對點協議。正如我們在前面章節中看到的,網路中有兩個重疊的功能,形成兩個邏輯網路,共同構成「閃電網路」:

  1. 一個廣泛的點對點網路,使用 gossip 協議傳播拓撲資訊,對等節點隨機相互連接。對等節點之間不一定有支付通道,所以他們不一定是通道夥伴。

  2. 通道夥伴之間的支付通道網路。通道夥伴也 gossip 拓撲資訊,這意味著他們是 gossip 協議中的對等節點。

對等節點之間的所有通訊都透過稱為「閃電網路訊息」的訊息發送。這些訊息都是加密的,使用稱為「Noise 協議框架」的密碼學通訊框架。Noise 協議框架允許構建提供身份驗證、加密、前向保密和身份隱私的密碼學通訊協議。Noise 協議框架還用於許多流行的端到端加密通訊系統,如 WhatsApp、WireGuard 和 I2P。更多資訊可以在 Noise 協議框架網站 找到。

在閃電網路中使用 Noise 協議框架確保網路上的每條訊息都經過身份驗證和加密,增加了網路的隱私性及其對流量分析、深度封包檢測和竊聽的抵抗力。然而,作為副作用,這使得協議開發和測試有點棘手,因為人們不能簡單地用封包擷取或網路分析工具(如 Wireshark)觀察網路。相反,開發者必須使用專門的外掛程式,從一個節點的角度解密協議,例如 lightning dissector,一個 Wireshark 外掛程式。

3.9. 關於信任的思考

只要一個人遵循協議並保護其節點安全,在參與閃電網路時就沒有重大的資金損失風險。 然而,開啟通道時需要支付鏈上費用。 任何成本都應該伴隨著相應的收益。 在我們的案例中,Alice 承擔開啟通道成本的回報是,Alice 可以隨時在閃電網路上發送和(在將一些幣移動到通道另一端後)接收比特幣支付,並且她可以透過為其他人轉發支付來賺取比特幣費用。 Alice 知道理論上 Bob 可以在開啟後立即關閉通道,導致 Alice 產生鏈上關閉費用。 Alice 需要對 Bob 有少量的信任。 Alice 去過 Bob’s Cafe,Bob 顯然有興趣賣給她咖啡,所以 Alice 在這個意義上可以信任 Bob。 Alice 和 Bob 都有共同的利益。 Alice 決定回報足以讓她承擔創建與 Bob 通道的鏈上費用成本。 相比之下,Alice 不會向一個不請自來發電子郵件要求她開啟新通道的未知人開啟通道。

3.10. 與比特幣的比較

雖然閃電網路建立在比特幣之上並繼承了它的許多特性和屬性,但有一些重要的差異需要兩個網路的使用者注意。

其中一些差異是術語差異。還有架構差異和使用者體驗差異。在接下來的幾節中,我們將檢查差異和相似之處,解釋術語,並調整我們的期望。

3.10.1. 地址與發票,交易與支付

在使用比特幣進行典型支付時,使用者收到一個比特幣地址(例如,掃描網頁上的 QR 碼,或在即時訊息或電子郵件中從朋友那裡收到)。然後他們使用比特幣錢包創建交易,將資金發送到這個地址。

在閃電網路上,支付的接收者創建發票。閃電網路發票可以被視為類似於比特幣地址。預期接收者將閃電網路發票作為 QR 碼或字元字串給發送者,就像比特幣地址一樣。

發送者使用他們的閃電網路錢包支付發票,複製發票文字或掃描發票 QR 碼。閃電網路支付類似於比特幣「交易」。

然而,使用者體驗有一些差異。比特幣地址是「可重用的」。比特幣地址永不過期,如果地址的所有者仍然持有金鑰,其中的資金始終可以存取。發送者可以向以前使用的地址發送任意數量的比特幣,接收者可以發布單一靜態地址來接收許多支付。雖然出於隱私原因這違背了最佳實踐,但它在技術上是可能的,實際上相當常見。

然而,在閃電網路中,每張發票只能用於特定支付金額的一次支付。您不能支付更多或更少,您不能重複使用發票,發票有內建的過期時間。在閃電網路中,接收者必須為每次支付生成一張新發票,預先指定支付金額。有一個例外,一種稱為 keysend 的機制,我們將在 Keysend 自發付款 中檢查。

3.10.2. 選擇輸出與尋找路徑

要在比特幣網路上進行支付,發送者需要消耗一個或多個未花費的交易輸出(UTXO)。 如果使用者有多個 UTXO,他們(或者更確切地說是他們的錢包)將需要選擇使用哪個 UTXO。 例如,進行 1 BTC 支付的使用者可以使用單一價值 1 BTC 的輸出、兩個價值 0.25 BTC 和 0.75 BTC 的輸出,或四個各價值 0.25 BTC 的輸出。

在閃電網路上,支付不需要消耗輸入。相反,每次支付都會導致通道餘額的更新,在兩個通道夥伴之間重新分配。發送者將此視為將通道餘額從他們的通道一端「移動」到另一端,到他們的通道夥伴。閃電網路支付使用一系列通道從發送者路由到接收者。這些通道中的每一個都必須有足夠的容量來路由支付。

因為許多可能的通道和路徑可以用於進行支付,閃電網路使用者對通道和路徑的選擇在某種程度上類似於比特幣使用者對 UTXO 的選擇。

透過原子多路徑支付(AMP)和多部分支付(MPP)等技術,我們將在後續章節中回顧,多條閃電網路路徑可以聚合成單一原子支付,就像多個比特幣 UTXO 可以聚合成單一原子比特幣交易一樣。

3.10.3. 比特幣上的找零輸出與閃電網路上無找零

要在比特幣網路上進行支付,發送者需要消耗一個或多個未花費的交易輸出(UTXO)。UTXO 只能完整花費;它們不能被分割和部分花費。因此,如果使用者希望花費 0.8 BTC,但只有 1 BTC 的 UTXO,他們需要花費整個 1 BTC UTXO,發送 0.8 BTC 給接收者,0.2 BTC 作為找零返回給自己。0.2 BTC 找零支付創建了一個新的 UTXO,稱為「找零輸出」。

在閃電網路上,資金交易花費一些比特幣 UTXO,創建一個多重簽名 UTXO 來開啟通道。一旦比特幣被鎖定在該通道內,它的一部分可以在通道內來回發送,而不需要創建任何找零。 這是因為通道夥伴只是更新通道餘額,只有在通道最終使用通道關閉交易關閉時才創建新的 UTXO。

3.10.4. 挖礦費用與路由費用

在比特幣網路上,使用者支付費用給礦工,讓他們的交易被包含在區塊中。 這些費用支付給開採該特定區塊的礦工。 費用金額基於交易在區塊中使用的「位元組」大小,以及使用者希望該交易被開採的速度。 因為礦工通常會首先開採最有利可圖的交易,想要立即開採交易的使用者將支付每位元組「更高」的費用,而不著急的使用者將支付每位元組「更低」的費用。

在閃電網路上,使用者支付費用給其他(中介節點)使用者,以透過他們的通道路由支付。 為了路由支付,中介節點必須在他們擁有的兩個或更多通道中移動資金,以及為發送者的支付傳輸資料。通常,路由使用者會根據支付的「價值」向發送者收費,已建立最低「基本費用」(每次支付的固定費用)和「費率」(與支付價值成比例的按比例費用)。因此,價值較高的支付路由成本較高,形成流動性市場,不同使用者對透過其通道路由收取不同的費用。

3.10.5. 根據流量變化的費用與宣布的費用

在比特幣網路上,礦工是追求利潤的,通常會在區塊中包含盡可能多的交易,同時保持在稱為「區塊權重」的區塊容量內。

如果佇列中的交易(稱為 mempool)多於一個區塊可以容納的,他們會首先開採每單位(位元組)「交易權重」支付最高費用的交易。 因此,當佇列中有許多交易時,使用者必須支付更高的費用才能被包含在下一個區塊中,否則他們必須等到佇列中的交易較少。 這自然導致費用市場的出現,使用者根據他們需要將交易包含在下一個區塊中的緊迫程度來支付。

比特幣網路上的稀缺資源是區塊中的空間。比特幣使用者競爭區塊空間,比特幣費用市場基於可用區塊空間。閃電網路中的稀缺資源是「通道流動性」(通道中可用於路由的資金容量)和「通道連接性」(通道可以到達多少連接良好的節點)。閃電網路使用者競爭容量和連接性;因此,閃電網路費用市場由容量和連接性驅動。

在閃電網路上,使用者向路由其支付的使用者支付費用。在經濟學術語中,路由支付無非是向發送者提供和分配容量。自然,對相同容量收取較低費用的路由器將更有吸引力進行路由。因此,存在一個費用市場,路由器就透過其通道路由支付的費用相互競爭。

3.10.6. 公開的比特幣交易與私密的閃電網路支付

在比特幣網路上,每筆交易都在比特幣區塊鏈上公開可見。雖然涉及的地址是假名的,通常不與身份關聯,但它們仍然被網路上的每個其他使用者看到和驗證。 此外,區塊鏈監控公司大規模收集和分析這些資料,並將其出售給感興趣的各方,如私人公司、政府和情報機構。

另一方面,閃電網路支付幾乎完全私密。通常,只有發送者和接收者完全知道特定支付的來源、目的地和交易金額。此外,接收者甚至可能不知道支付的來源。因為支付是洋蔥路由的,路由支付的使用者只知道支付金額,他們無法確定來源或目的地。

總結來說,比特幣交易是公開廣播的,永久儲存。閃電網路支付在幾個選定的對等節點之間執行,有關它們的資訊只在通道關閉前私密儲存。創建與比特幣上使用的類似的大規模監控和分析工具在閃電網路上將困難得多。

3.10.7. 等待確認與即時結算

在比特幣網路上,交易只有在被包含在區塊中後才結算,在這種情況下,它們被稱為在該區塊中「確認」。隨著更多區塊被開採,交易獲得更多「確認」並被認為更安全。

在閃電網路上,確認只對開啟和關閉鏈上通道有意義。一旦資金交易達到適當的確認數(例如 3 次),通道夥伴就認為通道已開啟。因為通道中的比特幣由管理該通道的智慧合約保護,支付在最終接收者收到後「即時」結算。 實際上,即時結算意味著支付只需要幾秒鐘即可執行和結算。與比特幣一樣,閃電網路支付是不可逆的。

最後,當通道關閉時,會在比特幣網路上進行交易;一旦該交易被確認,通道就被認為已關閉。

3.10.8. 發送任意金額與容量限制

在比特幣網路上,使用者可以向另一個使用者發送他們擁有的任意數量的比特幣,沒有容量限制。理論上,單筆交易可以發送高達 2100 萬比特幣作為支付。

在閃電網路上,使用者只能發送其特定通道一側目前存在的比特幣數量給通道夥伴。例如,如果使用者擁有一個通道,其一側有 0.4 BTC,另一個通道一側有 0.2 BTC,那麼他們用一筆支付可以發送的最大金額是 0.4 BTC。無論使用者目前在其比特幣錢包中有多少比特幣,這都是真的。

多部分支付(MPP)是一項功能,在上述範例中,允許使用者組合其 0.4 BTC 和 0.2 BTC 通道,用一筆支付發送最多 0.6 BTC。MPP 目前正在閃電網路上測試,預計在本書完成時將被廣泛使用。有關 MPP 的更多詳情,請參見 多部分付款

如果支付被路由,路由路徑上的每個路由節點都必須擁有容量至少與路由的支付金額相同的通道。對於支付路由通過的每個通道,這都必須成立。路徑中容量最低的通道設定了整個路徑容量的上限。

因此,容量和連接性是閃電網路中關鍵且稀缺的資源。

3.10.9. 大額支付與小額支付的激勵

比特幣的費用結構與交易價值無關。 一筆 100 萬美元的交易與 1 美元的交易在比特幣上費用相同,假設類似的交易大小(以位元組計,更具體地說是 SegWit [隔離見證協議] 後的「虛擬」位元組)。 在閃電網路中,費用是固定基本費用加上交易價值的百分比。 因此,在閃電網路中,支付費用隨支付價值增加。 這些相反的費用結構創造了不同的激勵,並導致在交易價值方面的不同使用。 較高價值的交易在比特幣上會更便宜;因此,使用者會更傾向於用比特幣進行大額交易。同樣,在另一端,使用者會更傾向於用閃電網路進行小額交易。

3.10.10. 使用區塊鏈作為帳本與作為法院系統

在比特幣網路上,每筆交易最終都記錄在區塊鏈上的一個區塊中。 區塊鏈因此形成了自比特幣創建以來每筆交易的完整歷史,以及完全審計每一個存在的比特幣的方式。 一旦交易被包含在區塊鏈中,它就是最終的。 因此,不會出現爭議,在區塊鏈的特定點上,特定地址控制多少比特幣是明確的。

在閃電網路上,特定時間通道中的餘額只有兩個通道夥伴知道,只有在通道關閉時才對網路的其餘部分可見。 當通道關閉時,通道的最終餘額提交到比特幣區塊鏈,每個夥伴收到他們在該通道中的比特幣份額。 例如,如果開啟餘額是 Alice 支付的 1 BTC,Alice 向 Bob 支付了 0.3 BTC,那麼通道的最終餘額是 Alice 0.7 BTC,Bob 0.3 BTC。 如果 Alice 試圖透過向比特幣區塊鏈提交通道的開啟狀態來作弊,Alice 1 BTC,Bob 0 BTC,那麼 Bob 可以透過提交通道的真實最終狀態來報復,並創建一筆懲罰交易,給他通道中的所有比特幣。 對於閃電網路,比特幣區塊鏈充當法院系統。 像一個機器人法官,比特幣記錄每個通道的初始和最終餘額,如果其中一方試圖作弊,則批准懲罰。

3.10.11. 離線與線上,非同步與同步

當比特幣使用者向目標地址發送資金時,他們不需要知道接收者的任何資訊。接收者可能離線或線上,發送者和接收者之間不需要互動。互動是在發送者和比特幣區塊鏈之間進行的。在比特幣區塊鏈上接收比特幣是一種「被動」和「非同步」活動,不需要接收者的任何互動或接收者在任何時候都線上。比特幣地址甚至可以離線生成,永遠不會在比特幣網路上「註冊」。只有花費比特幣需要互動。

在閃電網路中,接收者必須線上才能在支付過期之前完成支付。 接收者必須運行一個節點或有人代表他們運行節點(第三方託管人)。準確地說,發送者和接收者的節點在支付時都必須線上,並且必須協調。接收閃電網路支付是發送者和接收者之間的「主動」和「同步」活動,沒有大部分閃電網路或比特幣網路的參與(除了中介路由節點,如果有的話)。

閃電網路的同步和始終線上的性質可能是使用者體驗中最大的差異,這經常讓習慣於比特幣的使用者感到困惑。

3.10.12. 聰與毫聰

在比特幣網路上,最小單位是「聰」,不能再細分。閃電網路更靈活一些,閃電網路節點使用「毫聰」(千分之一聰)。這允許透過閃電網路發送微小的支付。單一毫聰支付可以透過支付通道發送,這個金額如此之小,應該恰當地被描述為「納米支付」。

當然,毫聰單位不能以這種精度在比特幣區塊鏈上結算。在通道關閉時,餘額四捨五入到最接近的聰。但在通道的生命週期內,數以百萬計的納米支付可以以毫聰級別進行。閃電網路突破了微支付障礙。

3.11. 比特幣和閃電網路的共同點

雖然閃電網路在許多方面與比特幣不同,包括在架構和使用者體驗方面,但它建立在比特幣之上並保留了比特幣的許多核心特徵。

3.11.1. 貨幣單位

比特幣網路和閃電網路都使用相同的貨幣單位:比特幣。閃電網路支付使用與比特幣交易完全相同的比特幣。作為一個含義,因為貨幣單位相同,貨幣限制也相同:少於 2100 萬比特幣。在比特幣的 2100 萬總比特幣中,一些已經作為閃電網路支付通道的一部分分配給 2-of-2 多重簽名地址。

3.11.2. 支付的不可逆性和最終性

比特幣交易和閃電網路支付都是不可逆和不可變的。任何一個系統都沒有「撤消」操作或「退款」。作為任何一個的發送者,您必須負責任地行動,但同樣,作為接收者,您可以保證交易的最終性。

3.11.3. 信任和對手方風險

與比特幣一樣,閃電網路只要求使用者信任數學、加密,以及軟體沒有任何關鍵錯誤。無論是比特幣還是閃電網路都不需要使用者信任個人、公司、機構或政府。 因為閃電網路位於比特幣之上並依賴比特幣作為其底層基礎層,很明顯閃電網路的安全模型歸結為比特幣的安全性。這意味著閃電網路在大多數情況下提供與比特幣大致相同的安全性,只有在某些狹窄情況下安全性略有降低。

3.11.4. 無需許可的操作

比特幣和閃電網路都可以由任何有網際網路存取和適當軟體(例如節點和錢包)的人使用。 任何一個網路都不要求使用者獲得第三方、公司、機構或政府的許可、審查或授權。政府可以在其管轄範圍內禁止比特幣或閃電網路,但不能阻止其全球使用。

3.11.5. 開源和開放系統

比特幣和閃電網路都是由去中心化的全球志願者社群構建的開源軟體系統,在開放許可下提供。兩者都基於開放和可互操作的協議,作為開放系統和開放網路運行。全球、開放、自由。

3.12. 結論

在本章中,我們研究了閃電網路的實際運作方式以及所有組成部分。我們檢查了構建、操作和關閉通道的每個步驟。我們研究了支付如何路由,最後,我們將閃電網路與比特幣進行了比較,分析了它們的差異和共同點。

在接下來的幾章中,我們將更詳細地重新審視所有這些主題。


1. 維基百科 賽局理論條目 提供了更多資訊。
2. Joseph Poon and Thaddeus Dryja. "The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments." DRAFT Version 0.5.9.2. January 14, 2016. https://lightning.network/lightning-network-paper.pdf.
1. Andreas M. Antonopoulos, Mastering Bitcoin, 2nd Edition, Chapter 1 (O’Reilly)
2. ACINQ:Eclair Mobile 閃電網路錢包的開發者。
3. 通常不建議為多筆付款重複使用同一個比特幣地址,因為所有比特幣交易都是公開的。 經過的好奇者可能會掃描 Alice 的 QR 碼,並在比特幣區塊鏈上看到 Alice 已經收到了多少小費到這個地址。 幸運的是,閃電網路為此提供了更私密的解決方案,將在本書後面討論!
4. Eclair 錢包不提供自動計算必要費用並將最大資金分配給通道的選項,所以 Alice 必須自己計算。
1. 雖然原始閃電網路白皮書描述了由兩個通道夥伴注資的通道,但截至 2020 年的當前規範假設只有一個夥伴向通道承諾資金。截至 2021 年 5 月,雙重注資閃電網路通道在 c-lightning 閃電網路實現中處於實驗階段。
2. George Danezis and Ian Goldberg, "Sphinx: A Compact and Provably Secure Mix Format," in IEEE Symposium on Security and Privacy (New York: IEEE, 2009), 269–282.
3. 「洋蔥」一詞最初由 Tor 專案使用。此外,Tor 網路也被稱為洋蔥網路,該專案使用洋蔥作為其標誌。Tor 服務在網際網路上使用的頂級域名是 onion