<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                現在,讓我們從比特幣作為一個應用平臺的角度來看,進一步加強理解。 現在很多人使用“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](https://www.coinprism.info/)查找。 Colu染色幣兼容的錢包應用程序和區塊鏈探索器可以在[Blockchain Explorer](http://coloredcoins.org/explorer/)中找到。 Copay錢包插件可以在[Colored Coins Copay Addon](http://coloredcoins.org/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](https://coinprism.info/)的錢包和瀏覽器,它使用了Open Assets染色幣協議。 下圖12-1[在coinprism.info上查看的發行交易](https://github.com/bitcoinbook/bitcoinbook/blob/second_edition/ch12.asciidoc#the_issuance_transaction_as_viewed_on_coinprismio) 顯示使用Coinprism塊瀏覽器的發行交易:[(<https://www.coinprism.info/tx/10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec>) [![圖12-1. 在coinprism.info上查看的發行交易](https://camo.githubusercontent.com/cc017b7221e56cee73004872939642275a481f2d/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d356531343361613431616165343239642e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/cc017b7221e56cee73004872939642275a481f2d/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d356531343361613431616165343239642e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)正如你所看到的那樣,coinprism顯示了發行的20個“精通比特幣的免費拷貝”,簡稱為MasterBTC的資產,發給了一個特殊的彩色幣地址: > akTnsDt5uzpioRST76VFRQM8q8sBFnQiwcx **警告** 發送到該地址的任何資金或染色幣將永遠丟失。 不要發送到這個示例地址! 發行交易的交易ID是“正常”比特幣交易ID。下圖12-2**[不對染色幣進行解碼的區塊鏈瀏覽器中看到的發行交易](https://github.com/bitcoinbook/bitcoinbook/blob/second_edition/ch12.asciidoc#the_issuance_transaction_on_a_block)** 顯示同一筆交易(和12.1同一筆)在不會對區塊鏈解碼的區塊瀏覽器中的樣子。 我們將使用blockchain.info:<https://blockchain.info/tx/10d7c4e022f35288779be6713471151ede967caaa39eecd35296aa36d9c109ec> [![圖12-2. 不對染色幣進行解碼的區塊鏈瀏覽器中看到的發行交易](https://camo.githubusercontent.com/b6a382a9268ff42d277fbfb3115aa2c360eed6d8/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d626262343238393438303633643232332e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/b6a382a9268ff42d277fbfb3115aa2c360eed6d8/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d626262343238393438303633643232332e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)正如你所看到的,blockchain.info不認為這是一個染色幣交易。 事實上,它以紅色字母表示第二個輸出“無法解碼輸出地址”。 如果您在該屏幕上選擇“顯示腳本和coinbase”,可以看到有關交易的更多詳細信息(下圖12-3 [發行交易的腳本](https://github.com/bitcoinbook/bitcoinbook/blob/second_edition/ch12.asciidoc#the_scripts_in_the_issuance_transaction)). [![圖12-3. 發行交易的腳本](https://camo.githubusercontent.com/e5062914700116046992086abfce4a4293499a2c/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d343063306334336639646338663964652e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/e5062914700116046992086abfce4a4293499a2c/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d343063306334336639646338663964652e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)再次,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://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之間的支付通道,顯示了資金,承諾和結算交易](https://camo.githubusercontent.com/58b5342dee25c341ccf11efa48326ad6d9f1431e/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d313833643130393262656266383861302e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/58b5342dee25c341ccf11efa48326ad6d9f1431e/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d313833643130393262656266383861302e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) ### 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購買視頻流服務](https://camo.githubusercontent.com/885c851a60310739b1ce367bc8017ea069b71e3e/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d366437393639323266333333333463312e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/885c851a60310739b1ce367bc8017ea069b71e3e/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d366437393639323266333333333463312e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) 在這個例子中,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之間的支付通道,承諾交易不斷的更新通道余額](https://camo.githubusercontent.com/e30ea2c45783d671e8049e962be307ac5b2c7df5/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d343961623438383339383634643430642e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/e30ea2c45783d671e8049e962be307ac5b2c7df5/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d343961623438383339383634643430642e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) ### 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. 每個承諾交易設置較短的時間鎖,允許在它在之前的承諾變為有效前被花費 ](https://camo.githubusercontent.com/31efbdf647e92af331af447ef95f00ca604f4a31/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d616662386639396532646232633530612e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/31efbdf647e92af331af447ef95f00ca604f4a31/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d616662386639396532646232633530612e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) 每個后續承諾交易必須具有較短的時間鎖,以便可以在其前任之前和退款交易之前進行廣播。能夠盡早廣播承諾交易的能力確保了承諾交易能夠花費資金輸出,并排除任何其他承諾交易通過花費資金輸出來贖回。比特幣區塊鏈提供的擔保,即防止雙重支出和執行時間鎖定,有效地允許每個承諾交易廢止其前任有效性。 狀態通道使用時間鎖來在時間維度中執行智能合約。在這個例子中,我們看到時間維度如何保證最近的承諾交易在任何早先的承諾之前變得有效。因此,最近的承諾交易可以傳輸,消費輸入和使先前的承諾交易無效。絕對時間鎖定的智能合同的執行可以防止其中任何一方的欺騙。此實現只需要絕對的交易級時間鎖(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顯示兩個不對稱承諾交易,其中承諾持有人的有延遲支付](https://camo.githubusercontent.com/4fb604873e4f374f40207b990c4fcb203ce59326/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d346161373331663063666666336164642e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) 現在我們介紹這個方案的最后一個要素:一個撤銷密鑰,允許被欺詐的一方通過占有通道的所有余額來懲罰騙子。 撤銷密鑰由兩個密語組成,每個密語由每個通道參與者獨立生成。它類似于2/2的多重簽名,使用橢圓曲線算法構造,使得雙方都知道撤銷公鑰,但每一方只知道撤銷密鑰的一半。 在每一輪交易中,雙方都將其撤銷秘密的一半透露給另一方,從而使另一方(現在雙方都有)在廣播此撤銷的交易時,可以要求獲得懲罰輸出。 每個承諾交易都有一個“延遲”的輸出。 該輸出的兌換腳本允許一方在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的付款](https://camo.githubusercontent.com/1f2a5c1dbf6f8c03097444f78075ff7321f7dc7c/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d656466393061356365666635613336652e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/1f2a5c1dbf6f8c03097444f78075ff7321f7dc7c/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d656466393061356365666635613336652e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) Alice想要支付給Eric1個比特幣。 不過,Alice并未通過支付通道連接到Eric。 創建支付通道需要資金交易,而這筆交易必須首先提交給比特幣區塊鏈。 Alice不想打開一個新的支付通道并支出更多的手續費。 有沒有辦法間接支付Eric? 下圖12-10 顯示了通過在連接各方參與者的支付通道上通過一系列HTLC承諾將付款從Alice路由到Eric的逐步過程。 [![圖12-10 ](https://camo.githubusercontent.com/6c36ebad622e0fcbabea4123ce1339bb0b1a3eb0/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d346137363030663431656538343939612e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)](https://camo.githubusercontent.com/6c36ebad622e0fcbabea4123ce1339bb0b1a3eb0/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313738353935392d346137363030663431656538343939612e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430) 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節點之間的所有通信都是點對點加密的。 另外,節點有一個長期公鑰,[它們用作標識符并且彼此認證對方](http://bit.ly/2r5TACm)。 每當節點希望向另一個節點發送支付時,它必須首先通過連接具有足夠容量的支付通道來構建通過網絡的路徑。節點宣傳路由信息,包括他們已經打開了什么通道,每個通道擁有多少容量,以及他們收取多少路由支付費用。路由信息可以以各種方式共享,并且隨著閃電網絡技術的進步,不同的路由協議可能會出現。一些閃電網絡實施使用IRC協議作為節點宣布路由信息的一種方便的機制。路由發現的另一種實現方式是使用P2P模型,其中節點將通道宣傳傳播給他們的對等體,在“洪水泛濫”模型中,這類似于比特幣傳播交易的方法。未來的計劃包括一個名為[Flare](http://bit.ly/2r5TACm)的建議,它是一種具有本地節點“鄰居”和較長距離的信標節點的混合路由模型。 在我們前面的例子中,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結論 我們僅研究了幾個可以使用比特幣區塊鏈作為信任平臺構建的新興應用程序。這些應用程序將比特幣的范圍擴大到超出付款和超越金融工具的范圍,以涵蓋許多信任至關重要的其他應用程序。通過去中性化的信任基礎,比特幣區塊鏈是一個會釋放將在各種行業中產生許多革命性應用的平臺。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看