精通比特幣(第十二章)【比特幣應用】

風靈使發表於2018-10-09

現在,讓我們從比特幣作為一個應用平臺的角度來看,進一步加強理解。 現在很多人使用“blockchain”(區塊鏈)這個詞來表示任何共享了比特幣設計原則的應用平臺。 該術語經常被濫用,並被應用於許多不能提供比特幣區塊鏈主要功能的事情。

在本章中,我們將介紹比特幣區塊鏈作為應用平臺所提供的功能。 我們將考慮應用程式構建原語,即構成任何區塊鏈應用程式的構建塊。 我們將研究使用這些原語的幾個重要應用程式,例如彩色幣,付款(狀態)渠道和路由支付渠道(閃電網路)。

12.1介紹

比特幣系統被設計為一個分散式的貨幣及支付系統。 然而,它的大部分功能源於可用於更廣泛應用中的較低階別的結構。 比特幣不是由帳戶,使用者,餘額和付款等元件構建的。 相反的,我們在[交易]章節中看到,它使用的是具有低階加密功能的交易指令碼語言。 就像賬戶,餘額和付款的更高層次的概念可以從基本原語中衍生出來一樣,許多其他複雜的應用也是如此。 因此,比特幣區塊鏈可以成為一個向諸如智慧合同等應用程式提供信任服務的應用平臺,遠遠超出了作為數字貨幣和支付的原始目的。

12.2構建區塊(原語)

當執行正常且長期執行時,比特幣系統提供了一定的保證,可以作為構建區塊來建立應用程式。 這些包括:

杜絕雙重支出 比特幣分散式共識演算法的最根本保證是確保UTXO不會花費兩次。

不可改變性 一旦交易被記錄在區塊中,並且隨後的區塊中新增了足夠的工作,交易資料就變得不可篡改。 不可改變性是由能源進行承保的,因為重寫區塊鏈需要消耗能源才能產生工作證明。 所需的能源以及由此帶來的不可變性的程度隨著在包含交易的區塊之後被提交的工作量而增加。

中立 去中心化的比特幣網路傳播有效的交易,而不管這些交易的來源或內容如何。 這意味著任何人都可以支付足夠的費用來建立有效的交易,並相信他們可以隨時傳輸該交易並使其包含在區塊鏈中。

安全時間戳

共識規則拒絕任何時間戳距離現在太遠(過去和將來)的塊。 這可以確保塊上的時間戳可以被信任。 塊上的時間戳意味著對所有其包含的交易的輸入之前從未被花過的保證。

授權 被去中心化網路中驗證過的數字簽名可提供授權保證。沒有指令碼中指定的私鑰的持有人的授權,包含數字簽名要求的指令碼就不能被執行。

審計能力 所有交易都是公開的,可以被審計。 所有的交易和交易所屬的區塊都可以以一個不間斷的區塊鏈連結起來並最終連結到創始區塊。

會計 在任何交易中(coinbase交易除外),輸入的金額等於輸出的金額加上交易費用。 在交易中不可能建立或銷燬比特幣價值數值。 輸出不能超過輸入。

永不過期 有效的交易永遠不會過期。 如果今天有效,它將在不久的將來仍然有效,只要輸入仍然沒有被花費,共識規則沒有改變。

公正性 使用SIGHASH_ALL簽名的比特幣交易或由另一個部分由SIGHASH型別簽署的交易,不能在簽名還有效的情況下被修改,從而導致交易本身無效。

交易原子性 比特幣交易是原子的(譯者注:原子性是指交易要麼全部執行,要麼完全不執行,不存在中間狀態)。 它們要麼是有效的並且經過確認的(挖礦),要麼不是。 不存在挖礦出交易的一部分,交易也不存在中間狀態。 在任何時間點,交易要麼被挖出,要麼沒有被挖,不存在中間狀態。

離散(不可分割)價值單位 交易輸出是離散和不可分割的價值單位。 他們要麼整體被花費要麼整體沒有花費。 他們不能被分割或者部分被花費。

法定人數(注:讓任何預定事物有效的最低參與人數) 指令碼中的多重簽名限制規定了多重簽名方案中的預定義的法定許可權。 M-of-N要求由共識規則執行。

時間鎖/老化 包含相對或絕對時間鎖的任何指令碼語句只能在其時間超過指定時間後執行。

複製 區塊鏈的去中心化儲存確保了在交易在被開採之後,經過充分的確認,它被複制到整個網路上,並且變得可以耐受得起電力損失,資料丟失等的影響。

偽造保護 每筆交易只能花費現有的經過驗證的輸出。不可能建立或偽造價值。

一致性 在沒有礦工分割槽的情況下,根據記錄的深度,記錄在區塊鏈中的塊可能會被從新組織或者被不認可的可能性將呈指數級下降。一旦被記錄在深層,改變所需的計算和能量將大到不可行的程度。

記錄外部狀態 每個交易可以通過OP_RETURN提交一個值,表示外部狀態機中的狀態轉換。

可預測發行量 總計不到2100萬比特幣將會以可以預測的速度發行。

上述構建塊區的列表並不完整,還會有新功能都被介紹新增到比特幣中。

12.3源於構建區塊的應用

由比特幣提供的構建區塊是可信平臺的組成部分,可用於構成各種應用程式。 以下是今天在用的應用程式及其使用的構建區塊的一些示例:

Proof-of-Existence(Digital Notary)數字公證

不可篡改性+時間戳+永久性。數字指紋可以通過一個交易提交給區塊鏈,以證明檔案在此存檔的時間內是存在的(Timestamp安全時間戳)。數字指紋不能在事後修改(Immutability不可改變性),證據將被永久儲存(Durability耐久性)。

Kickstarter(Lighthouse)

一致性+原子性+可信。如果您發起眾籌活動的一個輸入和輸出(Integrity公正性),別人可以參與眾籌,但在目標(output value輸出值)完成之前(Consistency一致性),這筆錢不能被花費出去(Atomicity交易原子性 )。

Payment Channels

控制法定人數+時間鎖+杜絕雙重支付+永不過期+耐審查+授權。一個帶有時間鎖(Timelock時間鎖)的法定人數為2-2的(Quorum法定人數)多重簽名被作為支付通道的“結算”交易時,可以被持有(Nonexpiration永不過期)或者可以在任何時間由任何一方授權(Authorization授權)的情況下(Censorship Resistance耐審查)進行花費。然後雙方可以在更短的時間鎖(Timelock)建立雙重支出(No Double-Spend)結算的確認交易。

(譯者注:本段原文如下:Quorum of Control + Timelock + No Double Spend + Nonexpiration + Censorship Resistance + Authorization. A multisig 2-of-2 (Quorum) with a timelock (Timelock) used as the “settlement” transaction of a payment channel can be held (Nonexpiration) and spent whenever (Censorship Resistance) by either party (Authorization). The two parties can then create commitment transactions that double-spend (No Double-Spend) the settlement on a shorter timelock (Timelock).)

12.4染色幣(Colored Coins)

我們將討論的第一個區塊鏈應用是染色幣。

染色幣是指利用比特幣交易來記錄除比特幣之外的外部資產的建立,所有權和轉讓的這類技術。 所謂“外部資產”我們是指這些資產不直接儲存在比特幣區塊上,而不是指比特幣本身,因為比特幣是本身就是這個區塊鏈的固有資產。

染色幣用於跟蹤第三方持有的數字資產和實物資產,並通過染色幣所有權證書來進行交易。 數字資產染色幣可以代表無形資產,如股票證書,許可證,虛擬財產(遊戲裝備)或大多數任何形式的許可智慧財產權(商標,版權等)。 有形資產染色幣可以代表商品(黃金,白銀,石油),土地所有權,汽車,船隻,飛機等所有權。

該術語源於“著色”或標記某名義金額的比特幣的想法,例如,1聰,用來表示比特幣價值本身以外的東西。打個比方,我們給一美元的鈔票標上一行資訊說:“這是ACME的股票證書”,或者“這張鈔票可以兌換1盎司的銀”,然後使用這個1美元鈔票與作為其他資產權益證明來進行交易。染色幣的第一次實施,名為“基於增強填充訂單的著色”或“EPOBC”,將外部資產標記於1聰輸出上。這樣,因為每個資產作為1聰的屬性(顏色)被新增了,它就成了一個真正的“染色幣”。

染色幣的最新實施使用OP_RETURN指令碼操作碼將交易中的後設資料與將後設資料與特定資產相關聯的外部資料儲存結合在一起。

今天染色幣的兩個最突出的實現是 Open Assets和Colu的染色幣。這兩個系統使用不同的方法來染色,並不相容。在一個系統中建立的染色幣在其他系統中無法看到或被使用。

12.4.1使用染色幣

染色幣被建立,轉移,並且通常用特殊的可以理解含有染色幣協議後設資料的比特幣交易的錢包來檢視。 必須特別注意避免在常規的比特幣錢包中使用染色幣相關的金鑰,因為常規錢包可能會破壞後設資料。 同樣地,染色幣也不應該被髮送到由常規錢包管理的地址,而只能傳送到由染色幣能夠識別的錢包管理的地址。Colu和Open Assets這兩個系統都使用特殊的染色幣地址來減輕這種風險,並確保染色幣不會傳送到不能識別的錢包。

染色幣對大多數通用的區塊鏈瀏覽器也是不可見的。 相反,您必須使用染色幣瀏覽器來闡釋染色幣交易的後設資料。

Open Assets相容的錢包應用程式和區塊鏈瀏覽器可以在coinprism查詢。

Colu染色幣相容的錢包應用程式和區塊鏈探索器可以在Blockchain Explorer中找到。

Copay錢包外掛可以在Colored Coins Copay Addon中找到。

12.4.2發行染色幣

每個染色幣的實現都通過不同的方法創造染色幣,但它們都提供類似的功能。創造染色幣資產的過程稱為發行。作為初始交易,發行交易將資產登記在比特幣區塊鏈上,並建立用於引用資產的資產ID。一旦發行,資產可以使用轉賬交易在地址之間傳遞。

作為染色幣發行的資產可以有多種屬性。它們可以是可分割的或不可分割的,這意味著轉賬中的資產量可以是整數(比如5)或具有十進位制細分(比如4.321)。資產也可以固定發行,意思是一定數量的資產只可以發行一次,或者可以被再次發行,後者意味著原始發行人在初始發行後可以發行新資產單位。

最後,一些染色幣啟用分紅,即允許按照擁有權成比例分配比特幣付款給染色幣資產的所有者。

12.4.3染色幣交易

給染色幣交易提供意義的後設資料通常使用OP_RETURN操作碼儲存在其中一個輸出中。不同顏色的硬幣協議對OP_RETURN資料的內容使用不同的編碼。包含OP_RETURN的輸出稱為標記輸出

輸出的順序和標記輸出的位置在染色幣協議中可能具有特殊含義。例如,在Open Assets中,標記輸出之前的任何輸出都代表資產發行。標記輸出後的任何輸出表示資產轉賬。通過參考各個輸出在轉賬中的順序標記輸出將特定值和顏色分配給其他輸出。

在Colored Coins (Colu)中,通過比較,標記輸出編碼一個定義後設資料該如何被理解的操作碼。操作碼0x01至0x0F表示發行交易。發行操作碼通常後面是資產ID或可用於從外部來源(例如bittorrent)取得資產資訊的其他識別符號。操作碼0x10到0x1F表示轉賬交易。轉賬交易後設資料包含簡單的指令碼,通過參考輸入輸出的索引(順序),將特定數量的資產從輸入轉賬到輸出。因此,輸入和輸出的排序對指令碼的解釋很重要。

如果後設資料太長而不能放入OP_RETURN,則染色幣協議可能會使用其他“技巧”在交易中儲存後設資料。示例包括將後設資料放在兌換指令碼中,緊接著OP_DROP操作碼,以確保指令碼忽略後設資料。另一種被使用的機制是1-N 多重簽名指令碼,其中只有第一個公鑰是可以花費輸出的真實公鑰,隨後的“金鑰”則用被編碼的後設資料替代。

為了正確解釋染色幣交易中的後設資料,您必須使用相容的錢包或塊資源瀏覽器。否則,該交易會看起來像一個具有OP_RETURN輸出的“正常”比特幣交易。

例如,我使用染色幣建立併發行了MasterBTC資產。 “MasterBTC”代表了可以獲取本書免費拷貝的兌換券。這些兌換券可以使用染色幣相容的錢包進行轉讓,交易和兌換。

對於這個特定的例子,我使用了https://coinprism.info的錢包和瀏覽器,它使用了Open Assets染色幣協議。

下圖12-1在coinprism.info上檢視的發行交易 顯示使用Coinprism塊瀏覽器的發行交易:[(https://www.coinprism.info/tx/10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec)

圖12-1. 在coinprism.info上檢視的發行交易
正如你所看到的那樣,coinprism顯示了發行的20個“精通比特幣的免費拷貝”,簡稱為MasterBTC的資產,發給了一個特殊的彩色幣地址:

akTnsDt5uzpioRST76VFRQM8q8sBFnQiwcx

警告 傳送到該地址的任何資金或染色幣將永遠丟失。 不要傳送到這個示例地址!

發行交易的交易ID是“正常”比特幣交易ID。下圖12-2**不對染色幣進行解碼的區塊鏈瀏覽器中看到的發行交易** 顯示同一筆交易(和12.1同一筆)在不會對區塊鏈解碼的區塊瀏覽器中的樣子。 我們將使用blockchain.infohttps://blockchain.info/tx/10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec

圖12-2. 不對染色幣進行解碼的區塊鏈瀏覽器中看到的發行交易
正如你所看到的,blockchain.info不認為這是一個染色幣交易。 事實上,它以紅色字母表示第二個輸出“無法解碼輸出地址”。

如果您在該螢幕上選擇“顯示指令碼和coinbase”,可以看到有關交易的更多詳細資訊(下圖12-3 發行交易的指令碼).

圖12-3. 發行交易的指令碼

再次,blockchain.info並不能理解第二個輸出。 它以紅色字母表示“奇怪”。 但是,我們可以看到,標記輸出中的一些後設資料是可讀的:

OP\_RETURN 4f41010001141b753d68747470733a2f2f6370722e736d2f466f796b777248365559\(decoded\) "OAu=[https://cpr.sm/FoykwrH6UY](https://cpr.sm/FoykwrH6UY)

讓我們使用bitcoin-cli檢索交易:

$ bitcoin-cli decoderawtransaction`bitcoin-cli getrawtransaction 10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec

剝離其餘的交易,第二個輸出如下所示:

{
    "value": 0.00000000,
    "n": 1,
    "scriptPubKey": "OP\_RETURN 4f41010001141b753d68747470733a2f2f6370722e736d2f466f796b777248365559"
}

字首4F41表示字母“OA”,代表“Open Assets”,並幫助我們確定以下後設資料是由Open Assets協議定義的緊接著的ASCII編碼的字串是指向資產定義的連結:

u=[https://cpr.sm/FoykwrH6UY](https://cpr.sm/FoykwrH6UY)

如果我們檢索此URL,我們將獲得JSON編碼的資產定義,如下所示:

{
    "asset\_ids": \[
    "AcuRVsoa81hoLHmVTNXrRD8KpTqUXeqwgH"
    \],
    "contract\_url": null,
    "name\_short": "MasterBTC",
    "name": "Free copy of \"Mastering Bitcoin\"",
    "issuer": "Andreas M. Antonopoulos",
    "description": "This token is redeemable for a free copy of the book \"Mastering Bitcoin\"",
    "description\_mime": "text/x-markdown; charset=UTF-8",
    "type": "Other",
    "divisibility": 0,
    "link\_to\_website": false,
    "icon\_url": null,
    "image\_url": null,
    "version": "1.0"
}

12.5合約幣(Counterparty)

合約幣是在比特幣之上建立的協議層。與“染色幣”類似的“合約幣協議”提供了建立和交易虛擬資產和代幣的能力。此外,合約幣提供了去中心化的資產交換。合約幣還在實施基於Ethereum虛擬機器(EVM)的智慧合同。

像染色幣協議一樣,合約幣使用OP_RETURN操作碼或1-N多重簽名的公鑰地址將後設資料嵌入到比特幣交易中,該地址用於代替公共金鑰進行後設資料編碼。使用這些機制,合約幣實現了在比特幣交易中編碼的協議層。額外的協議層可以由能理解合約幣的應用程式來解讀,如錢包和區塊鏈瀏覽器,或使用合約幣庫(library)構建的任何應用程式。

反過來合約幣可以用作給其他應用程式和服務的平臺。例如,Tokenly是一個建立在合約幣之上的平臺,允許內容創作者,藝術家和公司發行表達數字所有權的代幣,並可用於租賃,訪問,交易或購買內容,產品和服務。利用交易合約幣的其他應用包括遊戲(Spells of Genesis)和網格計算專案((Folding Coin)。

更多關於合約幣的內容參見https://counterparty.io。開源專案可以在https://github.com/CounterpartyXCP中找到。

12.6支付通道和狀態通道

支付通道是在比特幣區塊鏈之外雙方之間交換的比特幣交易的無信任機制。這些交易,如果在比特幣區塊鏈上結算,則是有效的,然而他們卻是在鏈外被持有的,以期票的形式等待最終批量結算。由於交易尚未結算,因此他們可以在沒有通常的結算延遲的情況下進行交換,從而可以滿足極高的交易吞吐量,低(亞毫秒)延遲和精細(satoshi級)粒度。

實際上,通道 一詞是一個比喻。狀態通道是區塊鏈外,由雙方之間的交換狀態代表的虛擬結構。實際上沒有“渠道”,底層資料傳輸機制並不是渠道。我們使用通道這個術語來表示鏈外雙方之間的關係和共享狀態。

為了進一步解釋這個概念,想一想TCP流。從高層協議的角度來看,它是一個橫跨網際網路連線兩個應用程式的“socket”。但是,如果您檢視網路流量,TCP流只是IP資料包之上的虛擬通道。 TCP流的每個端點通過排序並組裝IP資料包以產生位元組流的錯覺。實際上在背後,所有的資料包都是斷開分散的。同理,支付通道只是一系列交易。如果妥善排序和連線,即使您不信任通道的另一方,(經過排序連線後的交易)也可以建立可以信任的可兌換的債務。

在本節中,我們將介紹各種形式的支付通道。首先,我們將檢視用於構建計量小額支付服務(如流媒體視訊)的單行(單向)支付通道的機制。然後,我們將擴大這一機制,引入雙向付費渠道。最後,我們將看看首先在 閃電網路 中提出的,如何將路由網路中的雙向通道端到端連結從而形成多跳通道。

支付通道是 狀態通道的引申概念之一,代表了鏈外狀態的變化,通過區塊鏈上的最終的結算得到保障。支付通道是一種狀態通道,其中被改變的狀態是虛擬貨幣餘額。

12.6.1狀態通道基本概念和術語

通過一個交易在區塊鏈上所鎖定的共享狀態,在交易兩方之間建立了一個狀態通道。這被稱為資金交易或錨點交易。這筆交易必須傳送到網路並開始挖礦被挖礦確認以建立通道。在支付通道的示例中,鎖定的狀態即為通道的初始餘額(以貨幣計)。

隨後雙方交換已簽名的交易,這被稱為“承諾交易”。承諾交易會改變初始狀態。這些交易都是有效的,因為任何一方都可以提交結算的請求,不需要等到通道關閉再做結算。任何一方給對方建立、簽名和傳送交易時就會更新狀態。實踐中,這意味著每秒可進行數千筆交易。

當交換承諾交易時,雙方同時廢止之前的狀態,如此一來最新的承諾交易總是唯一可以贖回的承諾交易。這樣可以防止任何一方在通道中某個先前狀態比最新狀態更有利於己方的時候通過單方面關閉通道來進行欺騙。我們將在本章的其餘部分中檢視可用於廢止先前狀態的各種機制。

最後,通道可以合作關閉,即向區塊鏈提交最後的結算交易,或者單方面由任何一方提交最後承諾交易到鏈上。單方面關閉的選項是必要的,以防萬一交易中的一方意外斷開連線。結算交易代表通道的最終狀態,並在鏈上進行結算。

在通道的整個生命週期中,只有兩個交易需要提交給鏈上進行挖礦:資金交易和結算交易。在這兩個狀態之間,雙方可以交換任何數量的承諾交易,任何其他人永遠不會看到,也不會提交到鏈上。

下圖12-4說明了Bob和Alice之間的支付通道,顯示了資金,承諾和結算交易。

圖12-4. Bob和Alice之間的支付通道,顯示了資金,承諾和結算交易

12.6.2簡單支付通道示例

要說明狀態通道,我們必須從一個非常簡單的例子開始。 我們展示一個單向通道,意味著價值只向著一個方向流動。 為了便於解釋,我們以一個天真的假設開始,假設沒有人要試圖欺騙他人。 一旦我們解釋了基本的通道概念,我們將會接著看看是什麼使得支付通道可以無信任化,從而讓交易雙方哪怕去嘗試進行欺騙都無法成功。

對於這個例子,我們假設兩個參與者:Emma和Fabian。 Fabian提供由微支付通道支援以秒為單位時長計費的視訊流服務。Fabian每秒視訊收費0.01毫比(millibits)(0.00001 BTC),相當於每小時36毫比(0.036 BTC)的視訊。 Emma是從Fabian那裡使用以秒計費的支付通道來購買流媒體視訊服務的使用者。下圖12-5顯示Emma使用支付通道從Fabian購買視訊流服務。

圖12-5.Emma使用以秒計費的支付通道從Fabian購買視訊流服務

在這個例子中,Fabian和Emma正在使用專門的處理支付通道和視訊流的軟體。 Emma在瀏覽器中執行該軟體,Fabian從伺服器端執行該軟體。該軟體包括基本的比特幣錢包功能,可以建立和簽署比特幣交易。“支付通道”的概念和術語對於使用者都是完全不可見的。他們看到的是以秒為單位支付了的視訊。

為了設定支付通道,Emma和Fabian建立了一個2-2的多重簽名地址,雙方各持一個金鑰。從Emma的角度來看,她的瀏覽器中的軟體提供了一個帶有P2SH地址的二維碼(以“3”開頭),並要求她提交最多1小時視訊的“押金”。該地址因而得到了Emma的注資。支付給該多重地址的Emma交易,就是支付通道的資金交易或錨點交易。

就這個例子而言,我們假設Emma支付了36個毫比(0.036 BTC)到通道中。這將允許Emma消費長達1小時的流媒體視訊。這筆資金交易設定了可以在這個通道上傳送的最大數量(資料量),即設定了通道容量。

資金交易從Emma的錢包中消耗一個或多個輸入以整合資金。它建立一個價值為36毫比的輸出,支付給Emma和Fabian之間共同控制的多重簽名2-2地址。它也可能有一個作為找零錢到Emma的錢包的額外輸出。

一旦資金交易得到確認,Emma可以開始觀看視訊。Emma的軟體建立並簽署一筆承諾交易,改變通道餘額,將0.01毫比歸入Fabian的地址,並退回給Emma的35.99毫比。Emma簽署的交易消耗了由資金交易創造的36毫比輸出,並建立了兩個輸出:一個用於找錢,另一個用於Fabian的付款。交易只是部分被簽署了 - 它需要兩個簽名(2 - 2),但只有Emma的簽名。當Fabian的伺服器接收到此交易時,它會新增第二個簽名(用於2-2輸入),並將其返回給Emma並附帶時長1秒的視訊。現在雙方都有誰都可以兌換的完全簽署的承諾交易,這個承諾交易代表著通道中的最新正確餘額。雙方都不會將此交易廣播到網路中。

在下一輪,Emma的軟體建立並簽署另一個承諾交易(承諾2號),該交易從資金交易中消耗相同的2-2輸出。二號承諾交易分配一個0.2毫比的一個輸出到Fabian的地址,還有一個一個輸出為35.98毫比,作為找零返回給Emma的地址。這個新交易支付的是連續兩秒的視訊內容。 Fabian的軟體簽署並返回第二個承諾交易,再加上視訊的另一秒內容。

利用上述的方法,Emma的軟體繼續向Fabian的伺服器傳送承諾交易,以換取流媒體視訊。因為Emma觀看了更多秒數的視訊,通道中屬於Fabian的錢逐漸累積變多。假設Emma觀看600秒(10分鐘)的視訊,建立和簽署600筆承諾交易。最後的承諾交易(#600)將有兩個輸出,將通道的餘額分成兩半,分別為6毫比屬於Fabian和30毫比屬於Emma。

最後,Emma點選“停止”停止流媒體視訊。 Fabian或Emma現在可以傳送最終狀態交易以進行結算。最後一筆交易即為結算交易,向Fabian支付所有Emma消費的視訊,並向Emma退還資金交易中剩餘的資金。

圖12-6顯示了Emma和Fabian之間的通道以及更新通道餘額的承諾交易。

最後,只有兩個交易記錄在塊上:建立通道的資金交易和在兩個參與者之間正確分配最終餘額的結算交易。

圖12-6 Emma和Fabian之間的支付通道,承諾交易不斷的更新通道餘額

12.6.3製造無需信任的通道

我們剛剛描述的通道只有在雙方合作,沒有任何失敗或企圖欺騙的情況下工作。我們來看看破壞這個通道的一些場景,並且看看需要什麼來修復這類場景:

  • 一旦資金交易發生,Emma需要Fabian的簽名才能獲得給自己的找零。如果Fabian消失,Emma的資金將被鎖定在2-2中,並徹底損失。這個通道一旦建立,如果在雙方共同簽署至少一個承諾交易之前,有任何一方斷開,就會導致資金的流失。
  • 當通道正在執行時,Emma可以採取Fabian已經簽署的任何承諾交易,並將它發回鏈上。如果她可以傳送承諾交易#1,只支付1秒的視訊,為什麼要支付600秒的視訊?通道失敗是因為Emma可以通過廣播對她比較有利的先前的承諾來欺騙。

這兩個問題都可以用時間鎖(timelocks)來解決 - 我們來看看我們如何使用交易級時間鎖(nLocktime)。

除非她有保證的找零退款,否則Emma不能冒風險進行2-of-2 簽名。為了解決這個問題,Emma同時建立了資金和退款交易。她簽署資金交易,但不傳送給任何人。Emma只將退款交易傳送給Fabian,並獲得他的簽名。

退款交易作為第一承諾交易,其時間鎖確立了通道生命的上限。在這種情況下,Emma可以將nLocktime設定為30天或將來的第4320個區塊。所有後續承諾交易必須具有較短的時間鎖,以便在退款交易之前能把它們贖回。

現在,Emma已經有一個完全簽署的退款交易,她可以自信地傳送簽署過的資金交易,因為她知道她最終可以在時間到期後最終贖回退款交易,即使Fabian消失也不會有問題。

在通道生命中雙方交換的每一項承諾交易都會被時間鎖鎖進未來時間點。但是,對於每個承諾,延遲時間會稍短一點,所以最新的承諾可以在被它廢止的前一承諾之前被贖回(譯者注:上文提到如果有個最新承諾,前面的承諾就已經作廢)。由於nLocktime,任何一方都只有其時間到期後才能成功傳播任何承諾交易。如果一切順利,他們將合作並通過結算交易合理地關閉通道,這樣一來傳送中間的承諾交易就不必要了。實質上說,承諾交易只在一方斷線而另一方不得不單方面關閉通道時才使用。

例如,如果將來承諾交易#1被時間鎖定到將來的第4320個塊,則將來承諾交易#2被時間鎖定到將來的4319個塊。(同理可知)承諾交易#600則可以在承諾交易#1變為有效之前600個塊的時間被消費。

圖12-7顯示每個承諾交易設定較短的時間鎖,允許在它在之前的承諾變為有效前被花費

圖12-7. 每個承諾交易設定較短的時間鎖,允許在它在之前的承諾變為有效前被花費

每個後續承諾交易必須具有較短的時間鎖,以便可以在其前任之前和退款交易之前進行廣播。能夠儘早廣播承諾交易的能力確保了承諾交易能夠花費資金輸出,並排除任何其他承諾交易通過花費資金輸出來贖回。比特幣區塊鏈提供的擔保,即防止雙重支出和執行時間鎖定,有效地允許每個承諾交易廢止其前任有效性。

狀態通道使用時間鎖來在時間維度中執行智慧合約。在這個例子中,我們看到時間維度如何保證最近的承諾交易在任何早先的承諾之前變得有效。因此,最近的承諾交易可以傳輸,消費輸入和使先前的承諾交易無效。絕對時間鎖定的智慧合同的執行可以防止其中任何一方的欺騙。此實現只需要絕對的交易級時間鎖(nLocktime)。接下來,我們將看到如何使用指令碼級時間鎖定,CHECKLOCKTIMEVERIFY和CHECKSEQUENCEVERIFY來構建更靈活,有用和複雜的狀態通道。

第一次出現的單向支付通道在2015年由阿根廷開發商團隊演示為視訊流應用樣板。你仍然可以在streamsium.io看到它。

時間鎖並不是使先前的承諾交易無效的唯一方法。在接下來的章節中,我們將看到如何使用撤銷金鑰來實現相同的結果。時間鎖是有效的,但其有兩個明顯的缺點。在通道首次開啟時建立最大時間鎖,限制了通道的使用壽命。更糟糕的是,他們迫使通道實現以在允許長期通道,和迫使其中一位參與者在提前關閉的情況下等待很長時間的退款之間取得平衡。例如,如果允許頻道保持開放30天,通過將退款時間設定為30天,如果其中一方立即消失,則另一方必須等待30天才能退款。終點設定越遠,退款時間越遠。

第二個問題是,由於每個後續的承諾交易必須減短時間鎖,所以在雙方之間可以交換的承諾交易數量有明確的限制。例如,一個30天的通道,設定了位於未來第4320個塊的時間鎖**,**在必須被關閉前只能容納4320箇中間承諾交易。將時間鎖定承諾交易的間隔設定為1個區塊存在危險。通過將承諾交易之間的時間鎖設定為1個區塊,開發者給通道參與者帶來了非常高的負擔,參與者必須保持警惕,保持線上並監視,並隨時準備傳送正確的承諾交易。

現在我們瞭解如何使用時間鎖來使先前的承諾無效,我們可以看到合作關閉通道和通過廣播承諾交易單方面關閉通道之間的區別。所有承諾交易都是時間鎖定的,因廣播承諾交易總是要等待時間到期。但是,如果雙方同意最後的餘額是多少,並且知道他們都承擔最終實現餘額的承諾交易,那麼他們可以構建一個沒有時間鎖代表相同餘額的結算交易。在合作關閉中,任一方都可以提取最近的承諾交易,並建立一個各方面完全相同的結算交易,唯一差別就是結算交易省略了時間鎖。雙方都可以簽署這筆結算交易,因為知道無法作弊以得到更多的餘額。通過合作簽署和傳送結算交易,可以立即關閉通道並兌換餘額。最差的情況下,當事人之一可以是卑鄙小人,拒絕合作,強迫另一方單方面關閉最近的承諾交易。但是如果他們這樣做,他們也必須等待他們的資金。

12.6.4不對稱可撤銷承諾

處理先前承諾狀態的更好方法是明確撤銷它們。但是,這不容易實現。比特幣的一個關鍵特徵是,一旦交易有效,它一直有效,不會過期。取消交易的唯一方法是在交易被挖礦前用另一筆交易雙重支出它的輸入。這就是為什麼我們在上述簡單支付通道示例中使用時間鎖定,以確保最新的承諾交易可以在舊承諾生效之前被花費。然而,把承諾在時間上排序造成了許多限制,使得支付通道難以使用。

雖說一個交易無法取消,但是它可以被構造成無法再使用的樣子。我們這樣做我們實現它的方法是通過給予每一方一個 撤銷金鑰,如果對方試圖欺騙,可以用來進行懲罰。撤銷先前承諾交易的這種機制首先被作為閃電網路的一部分提出。

為了解釋撤銷金鑰,我們將在由Hitesh和Irene經營的兩個交易所之間構建一個更加複雜的支付通道。 Hitesh和Irene分別在印度和美國運營比特幣交易所。 Hitesh的印度交易所的客戶經常向Irene的美國交易所的客戶傳送付款,反之亦然。目前,這些交易發生在比特幣鏈上,但這意味著支付手續費用並等待幾個塊進行確認。在交易所之間設定支付通道將大大降低成本並加快交易流程。

Hitesh和Irene通過合作建立資金交易來啟動通道,每人向通道注資5個比特幣。初始餘額為Hitesh有5比特幣且Irene有5比特幣。資金交易將通道狀態鎖定在2-2多重簽名中,就像在簡單通道的例子中一樣。

資金交易可能有一個或多個來自Hitesh的輸入(加起來5個比特幣或更多),以及Irene的一個或多個輸入(加起來5個比特幣或更多)。投入必須略微超過通道容量才夠支付交易費用。該交易有一個將總共10個比特幣鎖定到由Hitesh和Irene控制的2-of-2多重地址的輸出。如果他們的輸入超過他們需要貢獻的數值,資金交易也可能有一個或多個輸出將找零返回給Hitesh和Irene。這是由雙方提供和簽署的多個輸入形成的單一交易。在傳送之前,它必須被合作構建起來並且由各方簽署。

現在,代替雙方簽署單一承諾交易的是, Hitesh和Irene創造了兩個不對稱 的承諾交易。

Hitesh有一個帶有兩個輸出的承諾交易。第一個輸出立即支付Irene欠她的5比特幣。第二個輸出支付Hitesh欠他自己的5比特幣,但條件是隻有在1000個區塊的時間鎖之後。交易輸出如下所示:

Input: 2-of-2 funding output, signed by Irene 

Output 0 <5 bitcoin>:
    <Irene's Public Key> CHECKSIG

Output 1:
    <1000 blocks>
    CHECKSEQUENCEVERIFY
    DROP
    <Hitesh's Public Key> CHECKSIG

Irene有帶有兩個輸出的不同的承諾交易。 第一個輸出支付Hitesh欠他的5比特幣。 第二個輸出支付Irene,欠她自己的5比特幣,但同樣只有經過1000個區塊的時間鎖。 Irene持有的承諾交易(由Hitesh簽署)看起來像這樣:

Input: 2-of-2 funding output, signed by Hitesh

Output 0<5 bitcoin>:
    <Hitesh's Public Key> CHECKSIG

Output 1:
    <1000 blocks>
    CHECKSEQUENCEVERIFY
    DROP
    <Irene's Public Key> CHECKSIG

這樣一來,雙方各有一筆承諾交易,以花費2 -2的資金輸出。 該承諾交易的輸入是由對方簽署的。 在任何時候,持有承諾交易的一方都可以簽字(完成2-2簽名)並進行廣播。 然而,如果他們廣播承諾交易,承諾交易會立即支付對方,而他們自己的必須等待短時間鎖到期。通過在其中一個輸出強制執行贖回拖延,我們可以做到讓各方在選擇單方面廣播承諾交易時處於輕微的不利地位。 但是單靠時間延遲還不足以鼓勵公平的行為。

下圖12-8顯示兩個不對稱承諾交易,其中承諾持有人的有延遲支付
圖12-8顯示兩個不對稱承諾交易,其中承諾持有人的有延遲支付

現在我們介紹這個方案的最後一個要素:一個撤銷金鑰,允許被欺詐的一方通過佔有通道的所有餘額來懲罰騙子。

每個承諾交易都有一個“延遲”的輸出。 該輸出的兌換指令碼允許一方在1000個區塊後兌換它,或者另一方如果擁有撤銷金鑰也可兌換它。 所以當Hitesh為Irene簽署承諾交易時,他將把第二個輸出定義為在1000塊之後可輸出支付給自己,或者是任何可以出示撤銷金鑰的人。 Hitesh構建了這個交易,並建立了一個由他祕密保管的撤銷金鑰。當他準備轉移到新的通道狀態並希望撤銷這一承諾時, 他才會把撤銷金鑰透露給Irene 第二個輸出指令碼如下所示:

Output 0<5 bitcoin>:
    <Irene's Public Key> CHECKSIG

Output 1<5 bitcoin>:
IF # Revocation penalty output
    <Revocation Public Key>
ELSE
    <1000 blocks>
    CHECKSEQUENCEVERIFY
    DROP
    <Hitesh's Public Key>
ENDIF
CHECKSIG


Irene可以自信地簽署這筆交易,因為一旦被髮送它將立即支付她被欠的欠款。 Hitesh持有交易,但知道如果他在單方通道關閉時傳送,他將不得不等待1000個塊才能獲得支付。

當通道進入下一個狀態時,Hitesh必須在Irene同意簽署下一個承諾交易之前撤銷此承諾交易。要做到這一點,他所要做的就是將撤銷金鑰傳送給Irene。一旦Irene擁有這一承諾的撤銷金鑰,她就可以自信地簽署下一個承諾。她知道,如果Hitesh試圖通過釋出先前的承諾交易來作弊,她可以使用撤銷金鑰來兌換Hitesh的延遲輸出。如果Hitesh作弊,Irene會得到BOTH(兩方)輸出。

撤銷協議是雙邊的,這意味著在每一輪中,隨著通道狀態的進一步發展,雙方交換新的承諾,交換用於之前承諾的撤銷金鑰,並簽署彼此的承諾交易。當他們接受新的狀態時,他們通過給予對方必要的撤銷金鑰來懲罰任何作弊行為,使先前的狀態不可能再被使用。

我們來看一個它的工作例子。 Irene的客戶之一希望向Hitesh的客戶傳送2比特幣。要通過通道傳輸2比特幣,Hitesh和Irene必須更新通道狀態以反映新的餘額。他們將承諾一個新的狀態(狀態號2),通道的10個比特幣分裂,7個比特幣屬於Hitesh和3個比特幣屬於Irene。為了更新通道的狀態,他們將各自建立反映新通道餘額的新承諾交易。

如上述內容所說,這些承諾交易是不對稱的,所以每一方所持的承諾交易都迫使他們等待兌換。至關重要的是,在簽署新的承諾交易之前,他們必須首先交換撤銷金鑰以使先前的承諾無效。在這種情況下,Hitesh的利益與通道的真實狀態是一致的,因此他沒有理由廣播先前的狀態。然而,對於Irene來說,狀態號1中留給她的餘額比狀態2中的更高。當Irene給予Hitesh她以前的承諾交易(狀態號1)的撤銷金鑰時,她實際上廢除了自己可以回滾通道狀態到前一狀態而從中獲益的能力。因為有了撤銷金鑰,Hitesh可以毫不拖延地兌換先前承諾交易的兩個輸出。也就是說一旦Irene廣播先前的狀態,Hitesh可以行使其佔有所有輸出的權利。

重要的是,撤銷不會自動發生。雖然Hitesh有能力懲罰Irene的作弊行為,但他必須勤勉地觀察區塊鏈中作弊的跡象。如果他看到先前的承諾交易廣播,他有1000個區塊時間採取行動,並使用撤銷金鑰來阻止Irene的欺騙行為並佔有所有餘額也就是全部10比特幣來懲罰她。

帶有相對時間鎖(CSV)的不對稱可撤銷承諾是實現支付通道的更好方法,也是區塊鏈技術非常重要的創新。通過這種結構,通道可以無限期地保持開放,並且可以擁有數十億的中間承諾交易。在閃電網路的原型實現中,承諾狀態由48位索引識別,允許在任何單個通道中有超過281兆(2.8×10^14)個狀態轉換!

12.6.5雜湊時間鎖合約(Hash Time Lock Contracts,HTLC)

支付通道可以通過特殊型別的智慧合同進一步擴充套件,以允許參與者將資金用於可贖回的具有到期時間的祕密(secret)。 此功能稱為雜湊時間鎖定合約或HTLC,並用於雙向和路由的支付通道。

首先我們來解釋HTLC的“雜湊”部分。 要建立一個HTLC,預期的收款人將首先建立一個祕密(secret)R。他們然後計算這個R的雜湊H:

H = Hash\(R\)

這步產生可以包含在輸出的鎖定指令碼中的雜湊H。 知道祕密的任何人可以用它來兌換輸出。 祕密R也被稱為雜湊函式的前影象。 前影象就是用作雜湊函式輸入的資料。

HTLC的第二部分是“時間鎖”元件。 如果祕密沒有被透露,HTLC的付款人可以在一段時間後得到“退款”。 這是通過使用絕對時間鎖CHECKLOCKTIMEVERIFY來實現的。實現HTLC的指令碼可能如下所示:

IF
   # Payment if you have the secret R
   HASH160 <H> EQUALVERIFY
ELSE
  # Refund after timeout.
  <locktime>
  CHECKLOCKTIMEVERIFY DROP
  <Payee Pubic Key> CHECKSIG
ENDIF

任何知道可以讓雜湊等於H的對應祕密R的人,可以通過行使IF語句的第一個子句來兌換該輸出。

如果祕密沒有被透露,HTLC中寫明瞭,在一定數量的塊之後,收款人可以使用IF語句中的第二個子句申請退款。

這是HTLC的基本實現。 任何 擁有祕密R的人都可以兌換這種型別的HTLC。通過對指令碼進行微調,HTLC可以採用許多不同的形式。 例如,在第一個子句中新增一個CHECKSIG運算子和一個公鑰來限制將雜湊值兌換成一個指定的收件人,這個人必須知道祕密R.

12.7可路由的支付通道(閃電網路)

閃電網路是一種端到端連線的雙向支付通道的可路由網路。這樣的網路可以允許任何參與者穿過一個通道路由到另一個通道進行支付,而不需要信任任何中間人。閃電網路由Joseph Poon和Thadeus Dryja於2015年2月首次描述,其基礎是許多其他人提出和闡述的支付通道概念。

“閃電網路”是指路由支付通道網路的具體設計,現已由至少五個不同的開源團隊實施。這些的獨立實施是由“閃電技術基礎”(BOLT)論文中描述的一組互通性標準進行協作。

閃電網路的原型實施已經由幾個團隊釋出。現在,這些實現只能在testnet上執行,因為它們使用segwit,還沒有在比特幣區塊主鏈(mainnet)上啟用。

閃電網路是實現可路由支付通道的一種可能方式。還有其他幾種旨在實現類似目標的設計,如Teechan和Tumblebit。

12.7.1閃電網路示例

讓我們看看它是如何工作的。

在這個例子中,我們有五個參與者:Alice, Bob, Carol, Diana, and Eric。這五名參與者已經彼此之間開設了支付通道。Alice和Bob有支付通道。Bob連線Carol,Carol連線到Diana,Diana連線Eric。為了簡單起見,我們假設每個通道每個參與者都注資2個比特幣資金,每個通道的總容量為4個比特幣。

下圖12-9顯示一系列通過雙向支付的通道連線在一起形成閃電網路以支援一筆從Alice到Eric的付款 展示了閃電網路中五名參與者,通過雙向支付通道連線,可從Alice付款到Eric(路由支付通道(閃電網路))。

圖12-9顯示一系列通過雙向支付的通道連線在一起形成閃電網路以支援一筆從Alice到Eric的付款

Alice想要支付給Eric1個比特幣。 不過,Alice並未通過支付通道連線到Eric。 建立支付通道需要資金交易,而這筆交易必須首先提交給比特幣區塊鏈。 Alice不想開啟一個新的支付通道並支出更多的手續費。 有沒有辦法間接支付Eric?

下圖12-10 顯示了通過在連線各方參與者的支付通道上通過一系列HTLC承諾將付款從Alice路由到Eric的逐步過程。

圖12-10

Alice正在執行閃電網路(LN)節點,該節點正在跟蹤其向Bob的付費通道,並且能夠發現支付通道之間的路由。Alice的LN節點還具有通過網際網路連線到Eric的LN節點的能力。 Eric的LN節點使用隨機數生成器建立一個祕密R。Eric的節點沒有向任何人洩漏這個祕密。相反,Eric的節點計算祕密R對應的雜湊H,並將此雜湊傳送到Alice的節點(請參閱圖12-10步驟1)。

現在Alice的LN節點構建了Alice的LN節點和Eric的LN節點之間的路由。所使用的路由演算法將在後面進行更詳細的解釋,但現在我們假設Alice節點可以找到一個高效的路由。

然後,Alice的節點構造一個HTLC,支付到雜湊H,具有10個區塊時間的退款超時(當前塊+10),數量為1.003比特幣(參見圖12-10的步驟2)。額外的0.003將用於補償參與此支付路由的中間節點。Alice將此HTLC提供給Bob,從和Bob之間的通道餘額中扣除1.003比特幣,並將其提交給HTLC。 該HTLC具有以下含義:“如果Bob知道祕密,Alice將其通道餘額的1.003支付給Bob,或者如果超過10個區塊時間後,則退還入Alice的餘額”。 Alice和Bob之間的通道餘額現在由承諾交易表示,其中有三個輸出:Bob的2比特幣餘額,Alice的0.997比特幣餘額,Alice的HTLC中承諾的1.003比特幣。承諾在HTLC中的金額從Alice的餘額中被減去。

Bob現在有一個承諾,如果他能夠在接下來的10個區塊生產時間內獲得祕密R,他可以獲取Alice鎖定的1.003。手上有了這一承諾,Bob的節點在和Carol的支付通道上構建了一個HTLC。Bob的HTLC提交1.002比特幣到雜湊H共9個區塊時間,這個HTLC中如果Carol有祕密R她可以兌換(參見圖12-10步驟3)。Bob知道,如果Carol要獲取他的HTLC,她必須出示祕密R。如果Bob在9個區塊的時間內有R,他可以用它來獲取Alice的HTLC給自己。通過承諾自己的通道餘額9個區塊的時間,他也賺了0.001比特幣。如果Carol無法獲取他的HTLC,並且他也無法獲取Alice的HTLC,那麼一切都將恢復到以前的通道餘額,沒有人會虧損。 Bob和Carol之間的通道餘額現在是:2比特幣給Carol,0.998給Bob,1.002由Bob承諾給HTLC。

Carol現在有一個承諾,如果她在接下來的9個區塊時間內獲得R,她可以獲取Bob的鎖定1.002比特幣。現在她可以在她與Diana的通道上構建HTLC承諾。她提交了一個1.001比特幣的HTLC到雜湊H,共計8個區塊時間,如果Diana有祕密R ,她就可以兌換(參見圖12-10步驟4)。從Carol的角度來看,如果能夠實現,她就可以獲得的0.001比特幣,否則也沒有失去任何東西。她提交給Diana的HTLC,只有在R被洩漏的情況下才可行,到那時候她可以從Bob那裡索取HTLC。Carol和Diana之間的通道餘額現在是:2給Diana,0.999給Carol,1.001由Carol承諾給HTLC。

最後,Diana可以提供給Eric一個HTLC,承諾1比特幣,7個區塊時間,到雜湊H(參見圖12-10的步驟5)。Diana與Eric之間的通道餘額現在是:2給Eric,1給Diana,1由Diana承諾給HTLC。

然而,在這條路上,Eric擁有祕密R,他可以獲取Diana提供的HTLC。他將R傳送給Diana,並獲取1個比特幣,新增到他的通道餘額中(參見圖12-10的步驟6)。通道平衡現在是:1給Diana,3給Eric。

現在,Diana有祕密R,因此,她現在可以獲取來自Carol的HTLC。Diana將R傳送給Carol,並將1.001比特幣新增到其通道餘額中(參見圖12-10的步驟7。現在Carol與Diana之間的通道餘額是:0.999給Carol,3.001給Diana。Diana已經“賺了”參與這個付款路線0.001比特幣。

通過路由回傳,祕密R允許每個參與者獲取未完成的HTLC。Carol從Bob那裡獲取1.002個比特幣,將他們通道餘額設為:0.998給Bob,3.002給Carol(參見閃電網路步驟8)。最後,Bob獲取來自Alice的HTLC(參見閃電網路步驟9)。他們的通道餘額更新為:0.997給Alice,3.003給Bob。

在沒有向Eric開啟通道的情況下,Alice已經支付了Eric 1比特幣。付款路線中的中間方不必要互相信任。在他們的通道內做一個短時間的資金承諾,他們可以賺取一小筆費用,唯一的風險是,如果通道關閉或路由付款失敗,退款有段短短的延遲時間。

12.7.2閃電網路傳輸和路由

LN節點之間的所有通訊都是點對點加密的。 另外,節點有一個長期公鑰,它們用作識別符號並且彼此認證對方

每當節點希望向另一個節點傳送支付時,它必須首先通過連線具有足夠容量的支付通道來構建通過網路的路徑。節點宣傳路由資訊,包括他們已經開啟了什麼通道,每個通道擁有多少容量,以及他們收取多少路由支付費用。路由資訊可以以各種方式共享,並且隨著閃電網路技術的進步,不同的路由協議可能會出現。一些閃電網路實施使用IRC協議作為節點宣佈路由資訊的一種方便的機制。路由發現的另一種實現方式是使用P2P模型,其中節點將通道宣傳傳播給他們的對等體,在“洪水氾濫”模型中,這類似於比特幣傳播交易的方法。未來的計劃包括一個名為Flare的建議,它是一種具有本地節點“鄰居”和較長距離的信標節點的混合路由模型。

在我們前面的例子中,Alice的節點使用這些路由發現機制之一來查詢將她的節點連線到Eric的節點的一個或多個路徑。一旦Alice的節點構建了路徑,她將通過網路初始化該路徑,傳播一系列加密和巢狀的指令來連線每個相鄰的支付通道。

重要的是,這個路徑只有Alice的節點才知道。付款路線上的所有其他參與者只能看到相鄰的節點。從Carol的角度來看,這看起來像是從Bob到Diana的付款。 Carol不知道Bob實際上是中繼轉發Alice的匯款。她也不知道Diana將會向Eric中繼轉發付款。

這是閃電網路的一個重要特徵,因為它確保了付款的隱私,並且使得很難應用監視,審查或黑名單。但是,Alice如何建立這種付款途徑,而不向中間節點透露任何內容?

閃電網路實現了一種基於稱為Sphinx的方案的洋蔥路由協議。該路由協議確保支付傳送者可以通過閃電網路構建和通訊路徑,使得:

  • 中間節點可以驗證和解密其部分路由資訊,並找到下一跳。
  • 除了上一跳和下一跳,他們不能瞭解作為路徑一部分的任何其他節點。
  • 他們無法識別支付路徑的長度,或者他們自己在該路徑中的位置。
  • 路徑的每個部分被加密,使得網路級攻擊者不能將來自路徑的不同部分的資料包彼此關聯。
  • 不同於Tor(網際網路上的洋蔥路由匿名協議),沒有可以被監視的“退出節點”。付款不需要傳輸到比特幣區塊鏈,節點只是更新通道餘額。

使用這種洋蔥路由協議,Alice將路徑的每個元素包裹在一層加密中,從尾端開始倒過來運算。她用Eric的公鑰加密了Eric的訊息。該訊息包裹在加密到Diana的訊息中,將Eric標識為下一個收件人。給Diana的訊息包裹在加密到Carol的公鑰的訊息中,並將Diana識別為下一個收件人。對Carol的訊息被Bob的金鑰加密。這樣一來,Alice已經構建了這個加密的多層“洋蔥”的訊息。她傳送給Bob,他只能解密和解開外層。在裡面,Bob發現一封給Carol的訊息,他可以轉發給Carol,但不能自己破譯。按照路徑,訊息被轉發,解密,轉發等,一路到Eric那裡。每個參與者只知道各自這一跳的前一個和下一個節點。

路徑的每個元素包含承載於HTLC的必須擴充套件到下一跳的資訊,HTLC中的要傳送的數量,要包括的費用以及CLTV鎖定到期時間(以塊為單位)。隨著路由資訊的傳播,節點將HTLC承諾轉發到下一跳。

在這一點上,您可能會想知道節點怎麼知道路徑的長度及其在該路徑中的位置。畢竟,他們收到一個訊息,並將其轉發到下一跳。難道它不會將路徑縮短,或者允許他們推斷出路徑大小和位置?為了防止這種情況,路徑總是固定在20跳,並用隨機資料填充。每個節點都會看到下一跳和一個要轉發的固定長度的加密訊息。只有最終的收件人看得到沒有下一跳。對於其他人來說,似乎總是有20多跳要走。

12.7.3閃電網路優勢

閃電網路是第二層路由技術。它可以應用於支援一些基本功能的任何區塊鏈,如多重簽名交易,時間鎖定和基本的智慧合約。

如果閃電網路搭建在在比特幣網路之上,則比特幣網路可以大大提高容量,隱私性,粒度和速度,而不會犧牲無中介機構的無信任操作原則:

隱私 閃電網路付款比比特幣區塊鏈的付款更私密,因為它們不是公開的。雖然路由中的參與者可以看到在其通道上傳播的付款,但他們並不知道發件人或收件人。

流動性 閃電網路使得在比特幣上應用監視和黑名單變得更加困難,從而增加了貨幣的流動性。

速度 使用閃電網路的比特幣交易將以毫秒為單位,而不是分鐘,因為HTLC在不用提交交易到區塊上的情況下被結算。

粒度 閃電網路可以使支付至少與比特幣“灰塵”限制一樣小,甚至更小。一些建議允許子聰級增量(subsatoshi increments)。

容量 閃電網路將比特幣系統的容量提高了幾個數量級。每秒可以通過閃電網路路由的付費數量沒有具體上限,因為它僅取決於每個節點的容量和速度。

無信任操作閃電網路在不需要互相信任就可以作為對等體使用的節點之間使用比特幣交易。因此,閃電網路保留了比特幣系統的原理,同時顯著擴大了其操作引數。

當然,如前所述,閃電網路協議不是實現路由支付通道的唯一方法。其他被提出的系統包括Tumblebit和Teechan。然而,在這個時候,閃電網路已經部署在testnet上了。幾個不同的團隊已經開發了正在競爭的LN實現,並且正在努力實現一個通用的互操作性標準(稱為BOLT)。閃電網路很可能是第一個部署在生產實際中的路由支付通道網路。

12.8結論

我們僅研究了幾個可以使用比特幣區塊鏈作為信任平臺構建的新興應用程式。這些應用程式將比特幣的範圍擴大到超出付款和超越金融工具的範圍,以涵蓋許多信任至關重要的其他應用程式。通過去中性化的信任基礎,比特幣區塊鏈是一個會釋放將在各種行業中產生許多革命性應用的平臺。

相關文章