區塊鏈概述及技術分析_風聞
Science_北京-不惧过往,不畏将来!2019-05-17 10:18
區塊鏈概述
l 區塊鏈定義
區塊鏈是一種以密碼學算法為基礎的點對點分佈式賬本技術,其本質是一種互聯網共享數據庫。區塊鏈首次從技術上解決了基於信任的中心化模型帶來的安全問題,它基於密碼學算法保證價值的安全轉移,基於哈希鏈及時間戳機制保證數據的可追溯、不可篡改特性,基於共識算法保證節點間區塊數據的一致性。區塊鏈以其分佈式、公開透明、安全等特性使得人們可以在互聯網上方便快捷、低成本地進行價值交換,是實現價值互聯網的基石。
l 區塊鏈分類
區塊鏈主要分為三大類,公有鏈、私有鏈和聯盟鏈。
公有鏈(PublicBlockChains),是指像比特幣區塊鏈這樣的完全多中心的、不受任何機構控制的區塊鏈。公有鏈上的所有人都可以發送交易,且交易能夠獲得該區塊鏈的有效確認,任何人都可以參與其共識過程,共識過程的參與者(對應比特幣中的礦工)通過密碼學技術以及內建的經濟激勵維護數據庫安全。特點是完全公開、不受控制,依靠加密技術來保證安全。
私有鏈(privateBlockChains),參與的節點只有用户自己,可以是一個公司,也可以是個人,數據的訪問和使用有嚴格的權限管理,是指存在一定的中心化控制的區塊鏈,聯盟鏈由於也存在一定的中心化控制,所以也屬於私有鏈的範疇。私有鏈與其他分佈式存儲方式沒有太大區別,相當於傳統意義上的共享數據庫用上Merkle Tree等方式試圖説明數據的可校驗。
聯盟鏈(Consortium BlockChains),參與區塊鏈的節點是事先選擇好的,是多個預選的節點,節點間有很好的網絡連接,這樣區塊鏈上可以採用非工作量證明的其他共識算法,聯盟鏈可以很好地做到節點間的連接,只需要極少的成本就能運行,提供迅速的交易處理和低廉的交易費用,有很好的擴展性(但是擴展性會隨着節點的增加而下降),數據可以有一定的隱私,三種區塊鏈的對比分析見表1。
l 區塊鏈特徵
區塊鏈有五個基本特徵:多中心、開放性、自治性、信息不可篡改和匿名性。
1)多中心,指的是不存在中心化的硬件或管理機構,這是由於使用分佈式核算和存儲,使得任意節點的權利和義務都是均等的,最終系統中的數據塊由整個系統中具有維護功能的節點來共同維護。
2)開放性,系統是開放的,除了交易各方的私有信息被加密外,其他鏈上的數據對所有人公開,這意味着任何人都可以通過公開的接口查詢區塊鏈數據和開發相關應用,因此整個系統信息高度透明。
3)自治性,區塊鏈採用基於協商一致的規範和協議(比如一套開源的公開透明的算法)使得整個系統中的所有節點能夠在去信任的環境自由安全地交換數據,使得對“人”的信任改成了對計算機的信任,任何人為的干預不起作用。
4)信息不可篡改,一旦經過驗證並添加至區塊鏈,信息就會被永久的存儲起來,除非能夠同時控制住系統中超過51%的節點,否則單個節點上對數據庫的修改是無效的。因此區塊鏈的數據穩定性和可靠性極高。
5)匿名性,由於節點之間的交換遵循固定的算法,通過區塊鏈中的程序規則使得其數據交互是無需信任的,因此交易對手無需通過公開身份的方式讓對方產生信任,對信用的累積非常有幫助。
區塊鏈技術分析
l 區塊鏈技術基礎模型
區塊鏈原本是比特幣等加密貨幣存儲數據的一種獨特方式,是一種自引用的數據結構,用來存儲大量交易信息,每條記錄從後向前有序鏈接起來,具備公開透明、無法篡改、方便追溯的特點。實際上,這種特性也直接體現了整個比特幣的特點,因此使用區塊鏈來概括加密貨幣背後的技術實現是非常直觀和恰當的。區塊鏈是一項技術,加密貨幣是其開發實現的一類產品(含有代幣,也有不含代幣的區塊鏈產品),不能等同或混淆。
所以廣義區塊鏈技術,是實現了數據公開、透明、可追溯的產品的架構設計方法。具體產品中的區塊鏈技術,可以指類似比特幣的數據存儲方式,或許是數據庫設計,或許是文件形式的設計,被稱作狹義的區塊鏈。廣義的區塊鏈技術,必須包含點對點網絡設計、加密技術應用、分佈式算法的實現、數據存儲技術的使用等4個方面,其他的可能涉及到分佈式存儲、機器學習、VR、物聯網、大數據等。狹義的區塊鏈僅僅涉及到數據存儲技術、數據庫或文件操作等。本文的區塊鏈,指的是廣義的區塊鏈。
1) 區塊鏈架構圖
圖1:區塊鏈架構設計圖(圖片來自chainclub.org)
2) 協議層
所謂的協議層,是指最底層的技術。這個層次通常是一個完整的區塊鏈產品,類似於我們電腦的操作系統,它維護着網絡節點,僅提供Api供調用。通常官方會提供簡單的客户端(通稱為錢包),這個客户端錢包功能也很簡單,只能建立地址、驗證簽名、轉賬支付、查看餘額等。這個層次是一切的基礎,構建了網絡環境、搭建了交易通道、制定了節點獎勵規則,至於交易規則、交易方式它一概不過問,也過問不了。典型的例子就是比特幣,還有各種二代幣,比如萊特幣等。
從用到的技術來説,協議層主要包括網絡編程、分佈式算法、加密簽名、數據存儲技術等4個方面,其中網絡編程能力是大家選擇編程語言的主要考慮因素,因為分佈式算法基本上屬於業務邏輯上的實現,什麼語言都可以做到,加密簽名技術是直接簡單的使用,數據庫技術也主要在使用層面,只有點對點網絡的實現和併發處理才是開發的難點。所以對於那些網絡編程能力強,對併發處理簡單的語言,人們就特別偏愛。也因此,Node.js開發區塊鏈應用,逐漸變得更加流行,Go語言也在逐漸興起。
上面的架構設計圖裏,把這個層面進一步分成了存儲層和網絡層。數據存儲可以相對獨立,選擇自由度大一些,可以單獨來討論。選擇的原則是性能和易用性。系統的整體性能,主要取決於網絡或數據存儲的I/O性能,網絡I/O優化空間不大,但是本地數據存儲的I/O是可以優化的。比如,比特幣選擇的是谷歌的LevelDB,據説這個數據庫讀寫性能很好,但是很多功能需要開發者自己實現。目前,困擾業界的一個重大問題是,加密貨幣交易處理量遠不如現在中心化的支付系統(銀行等),除了I/O,需要全方位的突破。
分佈式算法、加密簽名等都要在實現點對點網絡的過程中加以使用,所以是網絡層的事情,也是編碼的重點和難點。也有把點對點網絡的實現單獨分開的,把節點查找、數據傳輸和驗證等邏輯獨立出來,而把共識算法、加密簽名、數據存儲等操作放在一起組成核心層。無論怎麼組合,這兩個部分都是最核心、最底層的部分,都是協議層的內容。
3) 擴展層
這個層面類似於電腦的驅動程序,是為了讓區塊鏈產品更加實用。目前有兩類,一是各類交易市場,是法幣兑換加密貨幣的重要渠道,實現簡單,來錢快,成本低,但風險也大。二是針對某個方向的擴展實現,比如基於億書側鏈,可為第三方出版機構、論壇網站等內容生產商提供定製服務等。特別值得一提的就是大家聽得最多的“智能合約”的概念,這是典型的擴展層面的應用開發。所謂“智能合約”就是“可編程合約”,或者叫做“合約智能化”,其中的“智能”是執行上的智能,也就是説達到某個條件,合約自動執行,比如自動轉移證券、自動付款等,目前還沒有比較成型的產品,但不可否認,這將是區塊鏈技術重要的發展方向。
擴展層使用的技術就沒有什麼限制了,可以包括很多,分佈式存儲、機器學習、VR、物聯網、大數據等等,都可以使用。編程語言的選擇上,可以更加自由,因為可以與協議層完全分離,編程語言也可以與協議層使用的開發語言不相同。這個層面與應用層更加接近,也可以理解為B/S架構的產品中的服務端(Server)。這樣不僅在架構設計上更加科學,讓區塊鏈數據更小,網絡更獨立,同時也可以保證擴展層開發不受約束。
從這個層面來看,區塊鏈可以架構開發任何類型的產品,不僅僅是用在金融行業。在未來,隨着底層協議的更加完善,任何需要第三方支付的產品都可以方便地使用區塊鏈技術;任何需要確權、徵信和追溯的信息,都可以藉助區塊鏈來實現。
4) 應用層
這個層面類似於電腦中的各種軟件程序,是普通人可以真正直接使用的產品,也可以理解為B/S架構的產品中的瀏覽器端(Browser)。在這個層面市場亟待出現這樣的應用,引爆市場,形成真正的擴張之勢,讓區塊鏈技術快速走進尋常百姓,服務於大眾。大家使用的各類輕錢包(客户端),應該算作應用層最簡單、最典型的應用。
限於當前區塊鏈技術的發展,現在從協議層出發,把目標指向應用層,同時為第三方開發者提供擴展層的強大支持。這樣做既可以避免貪多,又可以避免無法落地,是真正理性的開發路線。因為純粹的開發協議層或擴展層,無法真正理解和驗證應用層,會脱離實際,讓第三方開發者很難使用。如果僅僅考慮應用層,市面上又找不到真正牢固、易用的協議層或擴展層的產品。
l 區塊鏈核心技術分析
1) 比特幣客户端
比特幣核心,也叫“中本聰客户端”(satoshi client)。它實現了比特幣系統的所有方面,包括錢包、對整個交易賬簿(區塊鏈)完整拷貝的交易確認引擎,和點對點比特幣網絡中的一個完整網絡節點。
根據操作系統不同,可以下載不同的可執行安裝工具。對於Windows,是一個ZIP歸檔文件或.exe格式的可執行文件。對於Mac OS,是一個.dmg格式的磁盤映像。Linux版本包括用於Ubuntu系統的PPA包,或是 tar.gz格式的壓縮包。目前可以完整運行的客户端有Bitcoin Wallet、breadwallet、Mycelium、Green Address、Airbitz、Hive等。
第一次運行比特幣核心時,它會開始下載整個區塊鏈,比特幣核心擁有交易賬簿(區塊鏈)的一份完整拷貝,裏面記錄了自2009年比特幣網絡被髮明以來發生在比特幣網絡上的每一筆交易。這個數據集有幾個GB(在2013年底大約是16GB),並且需要幾天的時間完成增量形式的下載(從區塊0順次下載到最新區塊)。在整個區塊鏈數據集下載完成前,客户端將不能處理任何交易或是更新賬户餘額。
2) 密鑰、地址、錢包
比特幣的所有權是通過數字密鑰、比特幣地址和數字簽名來確立的。數字密鑰實際上並不是存儲在網絡中,而是由用户生成並存儲在一個文件或簡單的數據庫中,稱為錢包。存儲在用户錢包中的數字密鑰完全獨立於比特幣協議,可由用户的錢包軟件生成並管理,而無需區塊鏈或網絡連接。密鑰實現了比特幣的許多有趣特性,包括多中心信任和控制、所有權認證和基於密碼學證明的安全模型。
每筆比特幣交易都需要一個有效的簽名才會被存儲在區塊鏈。只有有效的數字密鑰才能產生有效的數字簽名,因此擁有比特幣的密鑰副本就擁有了該帳户的比特幣控制權。密鑰是成對出現的,由一個私鑰和一個公鑰所組成。公鑰就像銀行的帳號,而私鑰就像控制賬户的PIN碼或支票的簽名。比特幣的用户很少會直接看到數字密鑰。一般情況下,它們被存儲在錢包文件內,由比特幣錢包軟件進行管理。
在比特幣交易的支付環節,收件人的公鑰是通過其數字指紋表示的,稱為比特幣地址,就像支票上的支付對象的名字(即“收款方”)。一般情況下,比特幣地址由一個公鑰生成並對應於這個公鑰。然而,並非所有比特幣地址都是公鑰;他們也可以代表其他支付對象,譬如腳本。這樣一來,比特幣地址把收款方抽象起來了,使得交易的目的地更靈活,就像支票一樣,這個支付工具可支付到個人賬户、公司賬户,進行賬單支付或現金支付。比特幣地址是用户經常看到的密鑰的唯一代表,他們只需要把比特幣地址告訴其他人即可。
圖2:私鑰、公鑰及地址關係(圖片來源於《精通比特幣》)
a) 密鑰
公鑰加密發明於20世紀70年代。它是計算機和信息安全的數學基礎。
自從公鑰加密被髮明之後,一些合適的數學函數被提出,譬如:素數冪和橢圓曲線乘法。這些數學函數都是不可逆的、就是説很容易向一個方向計算,但不可以向相反方向倒推。基於這些數學函數的密碼學,使得生成數字密鑰和不可偽造的數字簽名成為可能。比特幣正是使用橢圓曲線乘法作為其公鑰加密的基礎算法。
在比特幣系統中,用公鑰加密創建一個密鑰對,用於控制比特幣的獲取。密鑰對包括一個私鑰,和由其衍生出的唯一的公鑰。公鑰用於接收比特幣,而私鑰用於比特幣支付時的交易簽名。
公鑰和私鑰之間的數學關係,使得私鑰可用於生成特定消息的簽名。此簽名可以在不泄露私鑰的同時對公鑰進行驗證支付比特幣時,比特幣的當前所有者需要在交易中提交其公鑰和簽名(每次交易的簽名都不同,但均從同一個私鑰生成)。比特幣網絡中的所有人都可以通過所提交的公鑰和簽名進行驗證,並確認該交易是否有效,即確認支付者在該時刻對所交易的比特幣擁有所有權。
一個比特幣錢包中包含一系列的密鑰對,每個密鑰對包括一個私鑰和一個公鑰。私鑰(k)是一個數字,通常是隨機選出的。有了私鑰,我們就可以使用橢圓曲線乘法這個單向加密函數產生一個公鑰(K)。有了公鑰(K),我們就可以使用一個單向加密哈希函數生成比特幣地址(A)。
私鑰就是一個隨機選出的數字而已。一個比特幣地址中的所有資金的控制取決於相應私鑰的所有權和控制權。在比特幣交易中,私鑰用於生成支付比特幣所必需的簽名以證明資金的所有權。私鑰必須始終保持機密,因為一旦被泄露給第三方,相當於該私鑰保護之下的比特幣也拱手相讓了。私鑰還必須進行備份,以防意外丟失,因為私鑰一旦丟失就難以復原,其所保護的比特幣也將永遠丟失。
生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機性來源。生成一個比特幣私鑰在本質上與“在1到2256之間選一個數字”無異。只要選取的結果是不可預測或不可重複的,那麼選取數字的具體方法並不重要。比特幣軟件使用操作系統底層的隨機數生成器來產生256位的熵(隨機性)。
更準確地説,私鑰可以是1和n-1之間的任何數字,其中n是一個常數(n=1.158 * 10^77,略小於2^256),並由比特幣所使用的橢圓曲線的階所定義。要生成這樣的一個私鑰,我們隨機選擇一個256位的數字,並檢查它是否小於n-1。從編程的角度來看,一般是通過在一個密碼學安全的隨機源中取出一長串隨機字節,對其使用SHA256哈希算法進行運算,這樣就可以方便地產生一個256位的數字。如果運算結果小於n-1,我們就有了一個合適的私鑰。否則,我們就用另一個隨機數再重複一次。
通過橢圓曲線算法可以從私鑰計算得到公鑰,這是不可逆轉的過程:K = k * G 。其中k是私鑰,G是被稱為生成點的常數點,而K是所得公鑰。其反向運算,被稱為“尋找離散對數”——已知公鑰K來求出私鑰k——是非常困難的,就像去試驗所有可能的k值,即暴力搜索。
橢圓曲線加密法是一種基於離散對數問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。
圖3:在曲線上得到 G、 2G、 4G 的幾何操作(圖片來源於《精通比特幣》)
比特幣地址是一個由數字和字母組成的字符串,可以與任何想給你比特幣的人分享。由公鑰(一個同樣由數字和字母組成的字符串)生成的比特幣地址以數字“1”開頭。
b) 地址
在交易中,比特幣地址通常以收款方出現。如果把比特幣交易比作一張支票,比特幣地址就是收款人,也就是我們要寫入收款人一欄的內容。一張支票的收款人可能是某個銀行賬户,也可能是某個公司、機構甚至是現金支票。支票不需要指定一個特定的賬户,而是用一個普通的名字作為收款人,這使它成為一種相當靈活的支付工具。與此類似,比特幣地址的使用也使比特幣交易變得很靈活。比特幣地址可以代表一對公鑰和私鑰的所有者。比特幣地址可由公鑰經過單向的加密哈希算法得到。哈希算法是一種單向函數,接收任意長度的輸入產生指紋摘要。加密哈希函數在比特幣中被廣泛使用:比特幣地址、腳本地址以及在挖礦中的工作量證明算法。
c) 錢包
錢包是私鑰的容器,通常通過有序文件或者簡單的數據庫實現。另外一種製作私鑰的途徑是確定性密鑰生成。在這裏你可以用原先的私鑰,通過單向哈希函數來生成每一個新的私鑰,並將新生成的密鑰按順序連接。
在最早的一批比特幣客户端中,錢包只是隨機生成的私鑰集合。這種類型的錢包被稱作零型非確定錢包。舉個例子,比特幣核心客户端預先生成100個隨機私鑰,從最開始就生成足夠多的私鑰並且每把鑰匙只使用一次。這種類型的錢包有一個暱稱“Just a Bunch Of Keys(一堆私鑰)”簡稱JBOK。這種錢包現在正在被確定性錢包替換,因為它們難以管理、備份以及導入。隨機鑰匙的缺點就是如果你生成很多,你必須保存它們所有的副本,這就意味着這個錢包必須被經常性地備份。每一把鑰匙都必須備份,否則一旦錢包不可訪問時,錢包所控制的資金就付之東流。這種情況直接與避免地址重複使用的原則相沖突——每個比特幣地址只能用一次交易。地址通過關聯多重交易和對方的地址重複使用會減少隱私。0型非確定性錢包並不是錢包的好選擇,尤其是當你不想重複使用地址而創造過多的私鑰並且要保存它們。雖然比特幣核心客户包含0型錢包,但比特幣的核心開發者並不想鼓勵大家使用。
確定性,或者“種子”錢包包含通過使用單項離散方程而可從公共的種子生成的私鑰。種子是隨機生成的數字。這個數字也含有比如索引號碼或者可生成私鑰的“鏈碼”。在確定性錢包中,種子足夠收回所有的已經產生的私鑰,所以只用在初始創建時的一個簡單備份就足以搞定。並且種子也足夠讓錢包輸入或者輸出,這就很容易允許使用者的私鑰在錢包之間輕鬆轉移輸入。
3) 交易
比特幣交易是比特幣系統中最重要的部分。根據比特幣系統的設計原理,系統中任何其他的部分都是為了確保比特幣交易可以被生成、能在比特幣網絡中得以傳播和通過驗證,並最終添加入全球比特幣交易總賬簿(比特幣區塊鏈)。比特幣交易的本質是數據結構,這些數據結構中含有比特幣交易參與者價值轉移的相關信息。比特幣區塊鏈是全球複式記賬總賬簿,每個比特幣交易都是在比特幣區塊鏈上的一個公開記錄。
圖4:比特幣交易結構
一筆比特幣交易的生命週期起始於它被創建的那一刻,也就是誕生。隨後,比特幣交易會被一個或者多個簽名加密,這些簽名標誌着對該交易指向的比特幣資金的使用許可。接下來,比特幣交易被廣播到比特幣網絡中。在比特幣網絡中,每一個節點(比特幣交易參與者)驗證、並將交易在網絡中進行廣播,直到這筆交易被網絡中大多數節點接收。最終,比特幣交易被一個挖礦節點驗證,並被添加到區塊鏈上一個記錄着許多比特幣交易的區塊中。
一筆比特幣交易一旦被記錄到區塊鏈上並被足夠多的後續區塊確認,便成為比特幣總賬簿的一部分,並被所有比特幣交易參與者認可為有效交易。於是,被這筆交易分配到一個新所有者名下的比特幣資金可以在新的交易中被使用——這使得所有權鏈得以延伸且再次開啓一個新的比特幣交易生命週期。
比特幣交易可以被任何人在線上或線下創建,即便創建這筆交易的人不是這個賬户的授權簽字人。比如,一個負責應付賬款的櫃員在處理應付票據時可能會需要CEO簽名。相似地,這個負責應付賬款的櫃員可以創建比特幣交易,然後讓CEO對它進行數字簽名,從而使之有效。一張支票是指定一個特定賬户作為資金來源的,但是比特幣交易指定以往的一筆交易作為其資金來源,而不是一個特定賬户。
一旦一筆比特幣交易被創建,它會被資金所有者(們)簽名。如果它是合法創建並簽名的,則該筆交易現在就是有效的,它包含了轉移這筆資金所需要的所有信息。最終,有效的比特幣交易必須能接入比特幣網絡,從而使之能被傳送,直至抵達下一個登記在公共總賬薄(區塊鏈)的挖礦節點。
首先,一筆交易需要傳遞至比特幣網絡,才能被傳播,也才能加入區塊鏈中。本質上,一筆比特幣交易只是300到400字節的數據,而且它們必須被髮送到成千上萬個比特幣節點中的任意一個。只要發送者能使用多於一個比特幣節點來確保這筆交易被傳播,那麼發送者並不需要信任用來傳播該筆交易的單一節點。相應地,這些節點不需要信任發送者,也不用建立發送者的“身份檔案”。由於這筆交易是經過簽名且不含任何機密信息、私鑰或密碼,因此它可被任何潛在的便利網絡公開地傳播。信用卡交易包含敏感信息,而且依賴加密網絡連接完成信息傳輸,但比特幣交易可在任意網絡環境下被髮送。只要這筆交易可以到達能將它廣播到比特幣網絡的比特幣節點,這筆交易是如何被傳輸至第一個節點的並不重要。
一旦一筆比特幣交易被髮送到任意一個連接至比特幣網絡的節點,這筆交易將會被該節點驗證。如果交易被驗證有效,該節點將會將這筆交易傳播到這個節點所連接的其他節點;同時,交易發起者會收到一條表示交易有效並被接受的返回信息。如果這筆交易被驗證為無效,這個節點會拒絕接受這筆交易且同時返回給交易發起者一條表示交易被拒絕的信息。
比特幣網絡是一個點對點網絡,這意味着每一個比特幣節點都連接到一些其他的比特幣節點(這些其他的節點是在啓動點對點協議時被發現的)。整個比特幣網絡形成了一個鬆散的連接、且沒有固定拓撲或任何結構的“蛛網”——這使得所有節點的地位都是同等的。比特幣交易相關信息(包括交易和區塊)被傳播——從每一個節點到它連接的其他節點。一筆剛通過驗證且並被傳遞到比特幣網絡中任意節點的交易會被髮送到三到四個相鄰節點,而每一個相鄰節點又會將交易發送到三至四個與它們相鄰的節點。以此類推,在幾秒鐘之內,一筆有效的交易就會像指數級擴散的波一樣在網絡中傳播,直到所有連接到網絡的節點都接收到它。
比特幣交易的基本單位是未經使用的一個交易輸出,簡稱UTXO。UTXO是不能再分割、被所有者鎖住或記錄於區塊鏈中的並被整個網絡識別成貨幣單位的一定量的比特幣貨幣。比特幣網絡監測着以百萬為單位的所有可用的(未花費的)UTXO。當一個用户接收比特幣時,金額被當作UTXO記錄到區塊鏈裏。這樣,一個用户的比特幣會被當作UTXO分散到數百個交易和數百個區塊中。實際上,並不存在儲存比特幣地址或賬户餘額的地點,只有被所有者鎖住的、分散的UTXO。“一個用户的比特幣餘額”,這個概念是一個通過比特幣錢包應用創建的派生之物。比特幣錢包通過掃描區塊鏈並聚合所有屬於該用户的UTXO來計算該用户的餘額。
一筆比特幣交易可以有任意數值,但必須從用户可用的UTXO中創建出來。用户不能再把UTXO進一步細分,就像不能把一元紙幣撕開而繼續當貨幣使用一樣。用户的錢包應用通常會從用户可用的UTXO中選取多個可用的個體來拼湊出一個大於或等於一筆交易所需的比特幣量。
被交易消耗的UTXO被稱為交易輸入,由交易創建的UTXO被稱為交易輸出。通過這種方式,一定量的比特幣價值在不同所有者之間轉移,並在交易鏈中消耗和創建UTXO。一筆比特幣交易通過使用所有者的簽名來解鎖UTXO,並通過使用新的所有者的比特幣地址來鎖定並創建UTXO。
對於輸出和輸入鏈來説,有一個例外,它是一種特殊的交易類型,稱為Coinbase交易。這是每個區塊中的首個交易。這種交易存在的原因是作為對挖礦的獎勵而產生全新的可用於支付的比特幣給“贏家”礦工。這也就是為什麼比特幣可以在挖礦過程中被創造出來。
每一筆比特幣交易創造輸出,輸出都會被比特幣賬簿記錄下來。除特例之外幾乎所有的輸出都能創造一定數量的可用於支付的比特幣,也就是UTXO。這些UTXO被整個網絡識別,並且所有者可在未來的交易中使用它們。給某人發送比特幣實際上是創造新的UTXO,註冊到那個人的地址,並且能被他用於新的支付。
UTXO被每一個全節點比特幣客户端在一個儲存於內存中的數據庫所追蹤,該數據庫也被稱為“UTXO集”或者“UTXO池”。新的交易從UTXO集中消耗(支付)一個或多個輸出。
簡單地説,交易輸入是指向UTXO的指針。它們指向特定的UTXO,並被交易哈希和在區塊鏈中記錄UTXO的序列號作為參考。若想支付UTXO,一個交易的輸入也需要包含一個解鎖腳本,用來滿足UTXO的支付條件。解鎖腳本通常是一個簽名,用來證明對於在鎖定腳本中的比特幣地址擁有所有權。當用户付款時,他的錢包通過選擇可用的UTXO來構造一筆交易。
大多數交易包含交易費,這是為了在網絡安全方面給比特幣礦工一種補償。交易費可當作是為了包含(挖礦)一筆交易到下一個區塊中的一種鼓勵,也可當作是對於欺詐交易和任何種類的系統濫用,在每一筆交易上通過徵收一筆小成本的税而造成的一種妨礙。交易費被挖出這個區塊的礦工得到,並且記錄在這個交易的區塊鏈中。
交易費基於交易的尺寸,用千字節來計算,而不是比特幣的價值。總的來説,交易費基於市場所設置,生效於比特幣網絡中。礦工依據許多不同的標準,按重要性對交易進行排序,這包括費用,並且甚至可能在某種特定情況下免費處理交易。交易費影響處理優先級,這意味着有足夠費用的交易會更可能地被包含在下一個挖出的區塊中;與此同時,交易費不足或者沒有交易費的交易可能會被推遲,基於盡力而為的原則在幾個區塊之後被處理,甚至可能根本不被處理。交易費不是強制的,而且沒有交易費的交易也許最終會被處理,但是,包含交易費將提高處理優先級。
隨着時間的過去,交易費的計算方式和交易費在交易優先級上的影響一直在發展。起初,交易費是網絡中的一個固定常數。漸漸地,交易費的結構被放寬了,以便被市場基於網絡容量和交易量而強制影響。目前最小交易費被固定在每千字節0.0001比特幣,或者説是每千字節萬分之一比特幣,最近一次改變是從千分之一比特幣減少到這個數值的。大多數交易少於一千字節,但是那些包含多個輸入和輸出的交易尺寸可能更大。在未來的比特幣協議修訂版中,錢包應用預計會使用統計學分析,基於最近的幾筆交易的平均費用,來計算最恰當的費用並附在交易上。
4) 比特幣網絡
比特幣採用了基於國際互聯網(Internet)的P2P(peer-to-peer)網絡架構。P2P是指位於同一網絡中的每台計算機都彼此對等,各個節點共同提供網絡服務,不存在任何“特殊”節點。每個網絡節點以“扁平(flat)”的拓撲結構相互連通。
圖5: 擴展比特幣網絡(圖片來源於《精通比特幣》)
在P2P網絡中不存在任何服務端(server)、中央化的服務、以及層級結構。P2P網絡的節點之間交互運作、協同處理:每個節點在對外提供服務的同時也使用網絡中其他節點所提供的服務。P2P網絡也因此具有可靠性、多中心,以及開放性。早期的國際互聯網就是P2P網絡架構的一個典型用例:IP網絡中的各個節點完全平等。當今的互聯網架構具有分層架構,但是IP協議仍然保留了扁平拓撲的結構。
“比特幣網絡”是按照比特幣P2P協議運行的一系列節點的集合。除了比特幣P2P協議之外,比特幣網絡中也包含其他協議。例如Stratum協議就被應用於挖礦、以及輕量級或移動端比特幣錢包之中。網關(gateway)路由服務器提供這些協議,使用比特幣P2P協議接入比特幣網絡,並把網絡拓展到運行其他協議的各個節點。例如,Stratum服務器通過Stratum協議將所有的Stratum挖礦節點連接至比特幣主網絡、並將Stratum協議橋接(bridge)至比特幣P2P協議之上。 “擴展比特幣網絡(extended bitcoin network)”指代所有包含比特幣P2P協議、礦池挖礦協議、Stratum協議以及其他連接比特幣系統組件相關協議的整體網絡結構。
每個節點都參與全網絡的路由功能,同時也可能包含其他功能。每個節點都參與驗證並傳播交易及區塊信息,發現並維持與對等節點的連接。一些節點保有一份完整的、最新的區塊鏈拷貝,這樣的節點被稱為“全節點”。全節點能夠獨立自主地校驗所有交易,而不需藉由任何外部參照。另外還有一些節點只保留了區塊鏈的一部分,它們通過一種名為“簡易支付驗證(SPV)”的方式來完成交易驗證。這樣的節點被稱為“SPV節點”,又叫“輕量級節點”。挖礦節點通過運行在特殊硬件設備上的工作量證明(proof-of-work)算法,以相互競爭的方式創建新的區塊。一些挖礦節點同時也是全節點,保有區塊鏈的完整拷貝;還有一些參與礦池挖礦的節點是輕量級節點,它們必須依賴礦池服務器維護的全節點進行工作。
在比特幣P2P協議中,除了這些主要的節點類型之外,還有一些服務器及節點也在運行着其他協議,例如特殊礦池挖礦協議、輕量級客户端訪問協議等。
在比特幣發展的早期,所有節點都是全節點;當前的比特幣核心客户端也是完整區塊鏈節點。但在過去的兩年中出現了許多新型客户端,它們不需要維持完整的區塊鏈,而是作為輕量級客户端運行。完整區塊鏈節點保有完整的、最新的包含全部交易信息的比特幣區塊鏈拷貝,這樣的節點可以獨立地進行建立並校驗區塊鏈,從第一區塊(創世區塊)一直建立到網絡中最新的區塊。完整區塊鏈節點可以獨立自主地校驗任何交易信息,而不需要藉助任何其他節點或其他信息來源。完整區塊節點通過比特幣網絡獲取包含交易信息的新區塊更新,在驗證無誤後將此更新合併至本地的區塊鏈拷貝之中。
並非所有的節點都有能力儲存完整的區塊鏈。許多比特幣客户端被設計成運行在空間和功率受限的設備上,如智能電話、平板電腦、嵌入式系統等。對於這樣的設備,通過簡化的支付驗證(SPV)的方式可以使它們在不必存儲完整區塊鏈的情況下進行工作。這種類型的客端被稱為SPV客户端或輕量級客户端。隨着比特幣的使用熱潮,SPV節點逐漸變成比特幣節點(尤其是比特幣錢包)所採用的最常見的形式。
SPV節點只需下載區塊頭,而不用下載包含在每個區塊中的交易信息。由此產生的不含交易信息的區塊鏈,大小隻有完整區塊鏈的1/1000。SPV節點不能構建所有可用於消費的UTXO的全貌,這是由於它們並不知道網絡上所有交易的完整信息。SPV節點驗證交易時所使用的方法略有不同,這個方法需依賴對等節點“按需”提供區塊鏈相關部分的局部視圖。打個比方來説,每個全節點就像是一個在陌生城市裏的遊客,他帶着一張包含每條街道、每個地址的詳細地圖。相比之下,SPV節點就像是這名陌生城市裏的遊客只知道一條主幹道的名字,通過隨機詢問該城市的陌生人來獲取分段道路指示。雖然兩種遊客都可以通過實地考察來驗證一條街是否存在,但沒有地圖的遊客不知道每個小巷中有哪些街道,也不知道附近還有什麼其他街道。沒有地圖的遊客在“和平街23號”的前面,並不知道這個城市裏是否還有其他若干條“和平街23號”,也不知道面前的這個是否是要找的那個。對他來説,最好的方式就是向足夠多的人問路,並且希望其中一部分人不是要試圖搶劫他。
簡易支付驗證是通過參考交易在區塊鏈中的深度,而不是高度,來驗證它們。一個擁有完整區塊鏈的節點會構造一條驗證鏈,這條鏈是由沿着區塊鏈按時間倒序一直追溯到創世區塊的數千區塊及交易組成。而一個SPV節點會驗證所有區塊的鏈(但不是所有的交易),並且把區塊鏈和有關交易鏈接起來。
比特幣網絡中幾乎每個節點都會維護一份未確認交易的臨時列表,被稱為內存池或交易池。節點們利用這個池來追蹤記錄那些被網絡所知曉、但還未被區塊鏈所包含的交易。例如,保存用户錢包的節點會利用這個交易池來記錄那些網絡已經接收但還未被確認的、屬於該用户錢包的預支付信息。
隨着交易被接收和驗證,它們被添加到交易池並通知到相鄰節點處,從而傳播到網絡中。
有些節點的實現還維護一個單獨的孤立交易池。如果一個交易的輸入與某未知的交易有關,如與缺失的父交易相關,該孤立交易就會被暫時儲存在孤立交易池中直到父交易的信息到達。
當一個交易被添加到交易池中,會同時檢查孤立交易池,看是否有某個孤立交易引用了此交易的輸出(子交易)。任何匹配的孤立交易會被進行驗證。如果驗證有效,它們會從孤立交易池中刪除,並添加到交易池中,使以其父交易開始的鏈變得完整。對新加入交易池的交易來説,它不再是孤立交易。前述過程重複遞歸尋找進一步的後代,直至所有的後代都被找到。通過這一過程,一個父交易的到達把整條鏈中的孤立交易和它們的父級交易重新結合在一起,從而觸發了整條獨立交易鏈進行級聯重構。
交易池和孤立交易池(如有實施)都是存儲在本地內存中,並不是存儲在永久性存儲設備(如硬盤)裏。更準確的説,它們是隨網絡傳入的消息動態填充的。節點啓動時,兩個池都是空閒的;隨着網絡中新交易不斷被接收,兩個池逐漸被填充。
有些比特幣客户端的實現還維護一個UTXO數據庫,也稱UTXO池,是區塊鏈中所有未支付交易輸出的集合。“UTXO池”的名字聽上去與交易池相似,但它代表了不同的數據集。UTXO池不同於交易池和孤立交易池的地方在於,它在初始化時不為空,而是包含了數以百萬計的未支付交易輸出條目,有些條目的歷史甚至可以追溯至2009年。UTXO池可能會被安置在本地內存,或者作為一個包含索引的數據庫表安置在永久性存儲設備中。
交易池和孤立交易池代表的是單個節點的本地視角。取決於節點的啓動時間或重啓時間,不同節點的兩池內容可能有很大差別。相反地,UTXO池代表的是網絡的突顯共識,因此,不同節點間UTXO池的內容差別不大。此外,交易池和孤立交易池只包含未確認交易,而UTXO池之只包含已確認交易。
5) 區塊鏈
區塊鏈是由包含交易信息的區塊從後向前有序鏈接起來的數據結構。它可以被存儲為flat file(一種包含沒有相對關係記錄的文件),或是存儲在一個簡單數據庫中。區塊被從後向前有序地鏈接在這個鏈條裏,每個區塊都指向前一個區塊。區塊鏈經常被視為一個垂直的棧,第一個區塊作為棧底的首區塊,隨後每個區塊都被放置在其他區塊之上。對每個區塊頭進行SHA256加密哈希,可生成一個哈希值。通過這個哈希值,可以識別出區塊鏈中的對應區塊。同時,每一個區塊都可以通過其區塊頭的“父區塊哈希值”字段引用前一區塊(父區塊)。也就是説,每個區塊頭都包含它的父區塊哈希值。這樣把每個區塊鏈接到各自父區塊的哈希值序列就創建了一條一直可以追溯到第一個區塊(創世區塊)的鏈條。
雖然每個區塊只有一個父區塊,但可以暫時擁有多個子區塊。每個子區塊都將同一區塊作為其父區塊,並且在“父區塊哈希值”字段中具有相同的(父區塊)哈希值。一個區塊出現多個子區塊的情況被稱為“區塊鏈分叉”。區塊鏈分叉只是暫時狀態,只有當多個不同區塊幾乎同時被不同的礦工發現時才會發生。最終,只有一個子區塊會成為區塊鏈的一部分,同時解決了“區塊鏈分叉”的問題。儘管一個區塊可能會有不止一個子區塊,但每一區塊只有一個父區塊,這是因為一個區塊只有一個“父區塊哈希值”字段可以指向它的唯一父區塊。由於區塊頭裏麪包含“父區塊哈希值”字段,所以當前區塊的哈希值因此也受到該字段的影響。如果父區塊的身份標識發生變化,子區塊的身份標識也會跟着變化。當父區塊有任何改動時,父區塊的哈希值也發生變化。父區塊的哈希值發生改變將迫使子區塊的“父區塊哈希值”字段發生改變,從而又將導致子區塊的哈希值發生改變。而子區塊的哈希值發生改變又將迫使孫區塊的“父區塊哈希值”字段發生改變,又因此改變了孫區塊哈希值,等等以此類推。一旦一個區塊有很多代以後,這種瀑布效應將保證該區塊不會被改變,除非強制重新計算該區塊所有後續的區塊。正是因為這樣的重新計算需要耗費巨大的計算量,所以一個長區塊鏈的存在可以讓區塊鏈的歷史不可改變,這也是比特幣安全性的一個關鍵特徵。
區塊鏈裏的第一個區塊創建於2009年,被稱為創世區塊。它是區塊鏈裏面所有區塊的共同祖先,這意味着你從任一區塊,循鏈向後回溯,最終都將到達創世區塊。創世區塊包含一個隱藏的信息。在其Coinbase交易的輸入中包含這樣一句話“The Times 03/Jan/2009 Chancellor onbrink of second bailout forbanks.”這句話是泰晤士報當天的頭版文章標題,引用這句話,既是對該區塊產生時間的説明,也可視為半開玩笑地提醒人們一個獨立的貨幣制度的重要性,同時告訴人們隨着比特幣的發展,一場前所未有的世界性貨幣革命將要發生。該消息是由比特幣的創立者中本聰嵌入創世區塊中。
比特幣的完整節點保存了區塊鏈從創世區塊起的一個本地副本。隨着新的區塊的產生,該區塊鏈的本地副本會不斷地更新用於擴展這個鏈條。當一個節點從網絡接收傳入的區塊時,它會驗證這些區塊,然後鏈接到現有的區塊鏈上。為建立一個連接,一個節點將檢查傳入的區塊頭並尋找該區塊的“父區塊哈希值”。
區塊鏈中的每個區塊都包含了產生於該區塊的所有交易,且以Merkle樹表示。Merkle樹是一種哈希二叉樹,它是一種用作快速歸納和校驗大規模數據完整性的數據結構。這種二叉樹包含加密哈希值。在比特幣網絡中,Merkle樹被用來歸納一個區塊中的所有交易,同時生成整個交易集合的數字指紋,且提供了一種校驗區塊是否存在某交易的高效途徑。生成一棵完整的Merkle樹需要遞歸地對哈希節點對進行哈希,並將新生成的哈希節點插入到Merkle樹中,直到只剩一個哈希節點,該節點就是Merkle樹的根。在比特幣的Merkle樹中兩次使用到了SHA256算法,因此其加密哈希算法也被稱為double-SHA256。當N個數據元素經過加密後插入Merkle樹時,你至多計算2log2(N)次就能檢查出任意某數據元素是否在該樹中,這使得該數據結構非常高效。Merkle樹被SPV節點廣泛使用。SPV節點不保存所有交易也不會下載整個區塊,僅僅保存區塊頭。它們使用認證路徑或者Merkle路徑來驗證交易存在於區塊中,而不必下載區塊中所有交易。
6) 挖礦和共識
挖礦是增加比特幣貨幣供應的一個過程。挖礦同時還保護着比特幣系統的安全,防止欺詐交易,避免“雙重支付”,“雙重支付”是指多次花費同一筆比特幣。礦工們通過為比特幣網絡提供算力來換取獲得比特幣獎勵的機會。礦工們驗證每筆新的交易並把它們記錄在總帳簿上。每10分鐘就會有一個新的區塊被“挖掘”出來,每個區塊裏包含着從上一個區塊產生到目前這段時間內發生的所有交易,這些交易被依次添加到區塊鏈中。包含在區塊內且被添加到區塊鏈上的交易稱為“確認”交易,交易經過“確認”之後,新的擁有者才能夠花費他在交易中得到的比特幣。
礦工們在挖礦過程中會得到兩種類型的獎勵:創建新區塊的新幣獎勵,以及區塊中所含交易的交易費。為了得到這些獎勵,礦工們爭相完成一種基於加密哈希算法的數學難題,這些難題的答案包括在新區塊中,作為礦工的計算工作量的證明,被稱為 “工作量證明”。該算法的競爭的機制以及獲勝者有權在區塊鏈上進行交易記錄的機制,這二者是比特幣安全的基石。
新比特幣的生成過程被稱為挖礦是因為它的獎勵機制被設計為速度遞減模式,類似於貴重金屬的挖礦過程。比特幣的貨幣是通過挖礦發行的,類似於中央銀行通過印刷銀行紙幣來發行貨幣。礦工通過創造一個新區塊得到的比特幣數量大約每四年(或準確説是每210,000個塊)減少一半。開始時為2009年1月每個區塊獎勵50個比特幣,然後到2012年11月減半為每個區塊獎勵25個比特幣。之後將在2016年的某個時刻再次減半為每個新區塊獎勵12.5個比特幣。基於這個公式,比特幣挖礦獎勵以指數方式遞減,直到2140年。屆時所有的比特幣(20,999,999,980)全部發行完畢。換句話説在2140年之後,不會再有新的比特幣產生。
礦工們同時也會獲取交易費。每筆交易都可能包含一筆交易費,交易費是每筆交易記錄的輸入和輸出的差額。在挖礦過程中成功“挖出”新區塊的礦工可以得到該區塊中包含的所有交易“小費”。目前,這筆費用佔礦工收入的0.5%或更少,大部分收益仍來自挖礦所得的比特幣獎勵。然而隨着挖礦獎勵的遞減,以及每個區塊中包含的交易數量增加,交易費在礦工收益中所佔的比重將會逐漸增加。在2140年之後,所有的礦工收益都將由交易費構成。
“挖礦”這個詞有一定的誤導性。它容易引起對貴重金屬採礦的聯想,從而使我們的注意力都集中在每個新區塊產生的獎勵上。儘管挖礦帶來的獎勵是一種激勵,但它最主要的目的並不是獎勵本身或者新幣的產生。挖礦是一種將結算所多中心的過程,每個結算所對處理的交易進行驗證和結算。挖礦保護了比特幣系統的安全,並且實現了在沒有中心機構的情況下,也能使整個比特幣網絡達成共識。
挖礦這個發明使比特幣變得很特別,這種多中心的安全機制是點對點的電子貨幣的基礎。鑄造新幣的獎勵和交易費是一種激勵機制,它可以調節礦工行為和網絡安全,同時又完成了比特幣的貨幣發行。
通過創造出新區塊,比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鐘產生一個新區塊,每一個新區塊都伴隨着一定數量從無到有的全新比特幣。每開採210,000個塊,大約耗時4年,貨幣發行速率降低50%。在比特幣運行的第一個四年中,每個區塊創造出50個新比特幣。
2012年11月,比特幣的新發行速度降低到每區塊25個比特幣,並且預計會在2016年的某個時刻,在第420,000個區塊被“挖掘”出來之後降低到12.5比特幣/區塊。在第13,230,000個區塊(大概在2137年被挖出)之前,新幣的發行速度會以指數形式進行64次“二等分”。到那時每區塊發行比特幣數量變為比特幣的最小貨幣單位——1聰。最終,在經過1,344萬個區塊之後,所有的共2,099,999,997,690,000聰比特幣將全部發行完畢。換句話説,到2140年左右,會存在接近2,100萬比特幣。在那之後,新的區塊不再包含比特幣獎勵,礦工的收益全部來自交易費。
區塊鏈可以看作是一本記錄所有交易的公開總帳簿(列表),比特幣網絡中的每個參與者都把它看作一本所有權的權威記錄。但在不考慮相信任何人的情況下,比特幣網絡中的所有參與者如何達成對任意一個所有權的共識呢?所有的傳統支付系統都依賴於一箇中心認證機構,依靠中心機構提供的結算服務來驗證並處理所有的交易。比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳的備份,這份總帳可以被視為認證過的記錄。區塊鏈並不是由一箇中心機構創造的,它是由比特幣網絡中的所有節點各自獨立競爭完成的。換句話説比特幣網絡中的所有節點,依靠着節點間的不穩定的網絡連接所傳輸的信息,最終得出同樣的結果並維護了同一個公共總帳。
中本聰的主要發明就是這種多中心的自發共識機制。這種自發,是指沒有經過明確選舉或者沒有固定達成的共識的時間。換句話説,共識是數以千計的獨立節點遵守了簡單的規則通過異步交互自發形成的產物。所有的比特幣屬性,包括貨幣、交易、支付以及不依靠中心機構和信任的安全模型等都是這個機制的衍生物。
比特幣的多中心共識由所有網絡節點的4種獨立過程相互作用而產生:
a) 每個全節點依據綜合標準對每個交易進行獨立驗證
b) 通過完成工作量證明算法的驗算,挖礦節點將交易記錄獨立打包進新區塊
c) 每個節點獨立的對新區塊進行校驗並組裝進區塊鏈
d) 每個節點對區塊鏈進行獨立選擇,在工作量證明機制下選擇累計工作量最大的區塊鏈
在區塊鏈中,共識可以使各個節點維護相同內容和順序的交易記錄。在 PoW 機制中,各節點獨立構造自己的區塊,並通過求解數學難題競爭記賬權,最先計算出答案的節點將自己的區塊發送至其他節點。PoW 的優勢在於,某個節點若打算使已經被確認的區塊失效,必須具備超過 50%的算力,這通常是難以做到的此外,採用 PoW 機制的比特幣是一個開放的系統,任何節點都能夠自由地加入和退出比特幣網絡。但是,PoW 機制具有一定的侷限性。首先,為了降低區塊鏈分叉的概率,區塊的生成頻率不能過快,這直接影響了交易的處理速度。例如,比特幣每秒僅能將7筆交易寫入區塊鏈。其次,為了防止新產生的區塊因為分叉而失效,網絡中各節點必須等待足夠長的時間,才能確認區塊的有效性。由於交易包含在區塊之中,一筆交易在提交後,需要等待很長的時間才能夠確認交易有效。最後,由於 PoW 機制採用求解數學難題的方式,會消耗一定的計算資源,造成資源浪費。
共識(Consensus)過程是一個非常有趣的過程。在我們的日常生活中,幾乎所有的事情都是達成共識的過程。達成共識越分散的過程,其效率就越低,但滿意度越高,因此也越穩定;相反,達成共識越集中的過程,效率越高,也越容易出現獨裁和腐敗現象。達成共識常用的一種方法就是通過物質上的激勵以對某個事件達成共識;但是這種共識存在的問題就是容易被外界其它更大的物質激勵所破壞。還有一種就是羣體中的個體按照符合自身利益或整個羣體利益的方向來對某個事件自發地達成共識;當然形成這種自發式的以維護羣體利益為核心的共識過程還是需要時間和環境因素的,但是一旦達成這樣的共識趨勢,其共識結果也越穩定,越不容易被破壞。
比特幣實現這個共識的方法主要包括兩個部分:
激勵,即通過每個區塊產生一定量的新比特幣來激勵參與者。
引入外部資源確保安全;即通過大量的外部計算來確保共識的安全性,也就是工作量證明(Proof of Power)。
這也是幾乎所有PoW幣種所採用的方法。而這套方法要能持續長期運行下去的前提就是:這種激勵對參與者要有足夠的吸引力,也就是説比特幣要一直漲價,才能吸引參與者持續參與挖礦計算,以維護整個網絡的運行,否則就會導致參與的人減少,破壞網絡安全,沒有外部攻擊;由於比特幣引入了外部計算來確保安全,因此只要有足夠的挖礦算力(超過維護系統算力的51%)就能對系統成功進行攻擊,這也是比特幣長期存在的安全隱患之一,因為只要有錢,就能買到設備和算力。
正是由於比特幣存在的問題,例如消耗大量的資源、外部51%攻擊等,出現了PoS(Proof of Stake)共識機理。總體上,PoS共識理論和實踐目前仍處在探索階段。
最原始的PoS機理就是用股權代替PoW中的挖礦算力,來模擬比特幣的挖礦過程。請注意,這個過程沒有引入外部資源,而是僅僅依靠自身的幣種股份來維護網絡安全,因此其不需要消耗大量能源來進行計算;而且由於其沒有引入外部的資源,因此不會擔心外部攻擊,例如外界的算力攻擊。
看起來PoS是很完美的,但是它存在一個嚴重漏洞。PoS存在內部的Nothing-at-Stake攻擊。什麼是Nothing-at-Stake(常寫作N@S)攻擊?假設系統中出現了兩個分支鏈,那麼對於持有幣的“挖礦者”來講,最佳的操作策略就是同時在兩個分支上進行“挖礦”,這樣,無論哪個分支勝出,對幣種持有者來講,都會獲得本屬於他的利益,即不會有利益損失。而且由於不需要算力消耗,因此PoS中在兩個分支上挖礦是可行的。這導致的問題是,只要系統存在分叉,“礦工們”都會同時在這幾個分支上挖礦。因此在某個情況下,發起攻擊的分叉鏈是極有可能成功的,因為所有人也都在這個分叉鏈上達成了共識,而且甚至不用持有51%的幣量,就可以成功發起分叉攻擊;而這在PoW中是不可行的,因為挖礦需要消耗算力,礦工只能在一個分支上進行挖礦。第二個問題是重寫歷史攻擊,即攻擊者可以通過購買原始持有幣種的賬户來從頭髮起攻擊,重新分叉一個區塊鏈。因為原始的幣種持有者可以將幣轉移至其它賬户,因此他是可以在沒有損失的情況下將原始賬户出售給攻擊者的,攻擊者需要的就是有足夠數量幣的原始賬户。當然了,這也只是概率問題,因為有可能原始賬户持有者不會出售他們的賬户,但是理論上確實存在這種攻擊。第三個問題是,儘管PoS中的挖礦不用消耗算力,運行成本很低,但是也存在如何激勵礦工的問題。因為一般的PoS系統是沒有新幣產生的,礦工只能賺取交易費,而且在交易費不高的情況下,對礦工的激勵也是很有限的。
從以上可以看出,無論是PoW還是PoS機理的共識過程,其必要條件有兩個:信息公開共享和個體參與。以現實為例,事件的信息越透明,所涉及到的人員參與度越高,最終形成的共識也就越穩定、越持久,這與區塊鏈共識是一致的。
a)區塊鏈中的典型共識算法
(1)POW:Proof of Work,工作量證明
比特幣在Block的生成過程中使用了POW機制,一個符合要求的Block Hash由N個前導零構成,零的個數取決於網絡的難度值。要得到合理的Block Hash需要經過大量嘗試計算,計算時間取決於機器的哈希運算速度。當某個節點提供出一個合理的Block Hash值,説明該節點確實經過了大量的嘗試計算,當然,並不能得出計算次數的絕對值,因為尋找合理hash是一個概率事件。當節點擁有佔全網n%的算力時,該節點即有n/100的概率找到Block Hash。
(2)POS:Proof of Stake,股權證明
POS:也稱股權證明,類似於財產儲存在銀行,這種模式會根據你持有數字貨幣的量和時間,分配給你相應的利息。
簡單來説,就是一個根據你持有貨幣的量和時間,給你發利息的一個制度,在股權證明POS模式下,有一個名詞叫幣齡,每個幣每天產生1幣齡,比如你持有100個幣,總共持有了30天,那麼,此時你的幣齡就為3000,這個時候,如果你發現了一個POS區塊,你的幣齡就會被清空為0。你每被清空365幣齡,你將會從區塊中獲得0.05個幣的利息(假定利息可理解為年利率5%),那麼在這個案例中,利息 = 3000 * 5% / 365 = 0.41個幣,這下就很有意思了,持幣有利息。
(3)DPOS:Delegated Proof of Stake,委任權益證明
比特股的DPoS機制,中文名叫做股份授權證明機制(又稱受託人機制),它的原理是讓每一個持有比特股的人進行投票,由此產生101位代表 , 我們可以將其理解為101個超級節點或者礦池,而這101個超級節點彼此的權利是完全相等的。從某種角度來看,DPOS有點像是議會制度或人民代表大會制度。如果代表不能履行他們的職責(當輪到他們時,沒能生成區塊),他們會被除名,網絡會選出新的超級節點來取代他們。DPOS的出現最主要還是因為礦機的產生,大量的算力在不瞭解也不關心比特幣的人身上,類似演唱會的黃牛,大量囤票而絲毫不關心演唱會的內容。
(4)PBFT:Practical Byzantine Fault Tolerance,實用拜占庭容錯算法
PBFT是一種狀態機副本複製算法,即服務作為狀態機進行建模,狀態機在分佈式系統的不同節點進行副本複製。每個狀態機的副本都保存了服務的狀態,同時也實現了服務的操作。將所有的副本組成的集合使用大寫字母R表示,使用0到|R|-1的整數表示每一個副本。為了描述方便,假設|R|=3f+1,這裏f是有可能失效的副本的最大個數。儘管可以存在多於3f+1個副本,但是額外的副本除了降低性能之外不能提高可靠性。
作者:郝燕
※ ※ ※
創新體系工程基礎理論和方法
推動系統工程理論再發展