區塊鏈共識演算法講解及發展
Ⅰ 鍖哄潡閾劇殑鍏辮瘑鏈哄埗鏄浠涔堬紝鏈夊暐浼樼己鐐癸紵
娣卞叆瑙f瀽錛氬尯鍧楅摼鍏辮瘑鏈哄埗鐨勫ゥ縐樹笌浼樺姡鍖哄潡閾炬妧鏈鐨勬牳蹇冨熀鐭沖湪浜庡叾鐙鐗圭殑鍏辮瘑鏈哄埗錛屽畠濡傚悓紺句細鐨勫叡璇嗚勫垯錛岀『淇濅簡鍒嗗竷寮忕綉緇滀腑鐨勪俊鎮鍚屾ヤ笌鐪熷疄鎬с傚叡璇嗙畻娉曟槸鍖哄潡閾懼備綍鍦ㄥ幓涓蹇冨寲鐨勭幆澧冧腑錛岃╂墍鏈夊弬涓庤呭逛氦鏄撶粨鏋滆揪鎴愪竴鑷寸殑鍏抽敭鏈哄埗銆
鎯寵薄涓涓嬶紝濡傛灉鍖哄潡閾句笘鐣屾病鏈夊叡璇嗙畻娉曪紝姣忎釜鑺傜偣閮芥湁鑷宸辯殑璐︽湰錛屼換浣曚漢閮借兘闅忔剰淇鏀癸紝緋葷粺灝嗛櫡鍏ユ販涔便傚叡璇嗙畻娉曞氨濡傚悓娉曞緥錛屼負鍘諱腑蹇冨寲浜ゆ槗鎻愪緵浜嗙З搴忥紝淇濊瘉浜嗕氦鏄撶殑鍏姝d笌涓鑷存с傛瘮濡傛瘮鐗瑰竵鐨勫紑鍒涜呬腑鏈鑱錛岄氳繃寮曞叆宸ヤ綔閲忚瘉鏄庯紙PoW錛夛紝浠ユ寲鐭跨殑褰㈠紡璧嬩簣浜嗚$畻鑳藉姏寮哄ぇ鐨勮妭鐐硅拌處鏉冿紝榪欎綋鐜頒簡鍏辮瘑綆楁硶鐨勫疄闄呭簲鐢ㄣ
鍏辮瘑綆楁硶鐨勫氭牱鎬у拰閫傜敤鍦烘櫙
涓轟簡婊¤凍鍖哄潡閾劇殑鍘諱腑蹇冨寲銆佸紑鏀炬у拰鍙鎵╁睍鎬э紝鍚勭嶇被鍨嬬殑鍏辮瘑綆楁硶搴旇繍鑰岀敓錛屽傚伐浣滈噺璇佹槑錛圥oW錛夈佹潈鐩婅瘉鏄庯紙PoS錛夈佸旀墭鏉冪泭璇佹槑錛圖PoS錛夈佸疄鐢ㄦ嫓鍗犲涵瀹歸敊綆楁硶錛圥BFT錛夈佹潈濞佽瘉鏄庯紙PoA錛夌瓑錛屾瘡涓縐嶉兘鏈夊叾鐙鐗圭殑浼樺娍鍜岄傜敤鍦烘櫙銆
渚嬪傦紝宸ヤ綔閲忚瘉鏄庯紙PoW錛夎櫧鐒舵晥鐜囬珮錛屼絾鑳芥簮娑堣楀ぇ錛涙潈鐩婅瘉鏄庯紙PoS錛夎В鍐充簡璧勬簮嫻璐歸棶棰橈紝浣嗗彲鑳藉艱嚧涓蹇冨寲瓚嬪娍錛涜孌PoS鍒欑粨鍚堜簡鎶曠エ鏈哄埗錛屾彁楂樹簡鍏辮瘑鏁堢巼錛屽挨鍏墮傚悎澶ц勬ā緗戠粶銆傚尯鍧楅摼鐨勭伒媧繪т嬌鍏惰兘澶熷閥濡欏湴鍦ㄨ繖浜涚畻娉曚箣闂村垏鎹錛屼互閫傚簲涓嶅悓鐨勪笟鍔¢渶奼傘
鍗庝負浜戝尯鍧楅摼鏈嶅姟涓鐨勫叡璇嗙畻娉曞疄璺
鍗庝負浜戝尯鍧楅摼鏈嶅姟錛圔CS錛夊湪瀹為檯搴旂敤涓錛岄噰鐢ㄥ揩閫熸嫓鍗犲涵瀹歸敊鍏辮瘑綆楁硶錛團BFT錛夊拰Raft錛圕FT錛夛紝榪欎簺綆楁硶鍦ㄤ繚璇佸畨鍏ㄦс佹ц兘鍜岄殣縐佷繚鎶ゆ柟闈㈠叿鏈夋樉钁椾紭鍔褲侶yperledger Fabric澧炲己鐗堢粨鍚堜簡榪欎袱縐嶇畻娉曪紝涓轟紒涓氱駭鍜岄噾鋙嶇駭涓氬姟鎻愪緵浜嗗己澶ф敮鎸侊紝鑰屽崕涓洪摼鏈嶅姟鍒欏嚟鍊熻嚜涓葷爺鍙戠殑鍖哄潡閾懼唴鏍稿拰鍙淇$‖浠訛紝灞曠幇浜嗗崜瓚婄殑鎬ц兘鍜岄殣縐佷繚鎶ょ壒鎬с
鍖哄潡閾句笘鐣屼腑鐨勫叡璇嗘満鍒舵槸涓闂ㄦ繁濂ョ殑鑹烘湳錛屽畠鍦ㄦ瘡涓鑺傜偣涔嬮棿鐨勪簰鍔ㄤ腑璧風潃鑷沖叧閲嶈佺殑浣滅敤銆傛棤璁烘槸鍝縐嶅叡璇嗙畻娉曪紝瀹冧滑閮芥槸鍖哄潡閾炬妧鏈瀹炵幇鍒嗗竷寮忎俊浠誨拰鍘諱腑蹇冨寲浠峰間紶閫掔殑鏍稿績椹卞姩鍔涖傞殢鐫鎶鏈鐨勪笉鏂榪涙ワ紝鎴戜滑鏈熷緟鏇村氬壋鏂扮殑鍏辮瘑綆楁硶涓哄尯鍧楅摼甯︽潵鏇撮珮鏁堛佹洿鏅鴻兘鐨勮В鍐蟲柟妗堛
Ⅱ 深入了解區塊鏈的共識機制及演算法原理
所謂「共識機制」,是通過特殊節點的投票,在很短的時間內完成對交易的驗證和確認;對一筆交易,如果利益不相乾的若干個節點能夠達成共識,我們就可以認為全網對此也能夠達成共識。再通俗一點來講,如果中國一名微博大V、美國一名虛擬幣玩家、一名非洲留學生和一名歐洲旅行者互不相識,但他們都一致認為你是個好人,那麼基本上就可以斷定你這人還不壞。
要想整個區塊鏈網路節點維持一份相同的數據,同時保證每個參與者的公平性,整個體系的所有參與者必須要有統一的協議,也就是我們這里要將的共識演算法。比特幣所有的節點都遵循統一的協議規范。協議規范(共識演算法)由相關的共識規則組成,這些規則可以分為兩個大的核心:工作量證明與最長鏈機制。所有規則(共識)的最終體現就是比特幣的最長鏈。共識演算法的目的就是保證比特幣不停地在最長鏈條上運轉,從而保證整個記賬系統的一致性和可靠性。
區塊鏈中的用戶進行交易時不需要考慮對方的信用、不需要信任對方,也無需一個可信的中介機構或中央機構,只需要依據區塊鏈協議即可實現交易。這種不需要可信第三方中介就可以順利交易的前提是區塊鏈的共識機制,即在互不了解、信任的市場環境中,參與交易的各節點出於對自身利益考慮,沒有任何違規作弊的動機、行為,因此各節點會主動自覺遵守預先設定的規則,來判斷每一筆交易的真實性和可靠性,並將檢驗通過的記錄寫入到區塊鏈中。各節點的利益各不相同,邏輯上將它們沒有合謀欺騙作弊的動機產生,而當網路中有的節點擁有公共信譽時,這一點尤為明顯。區塊鏈技術運用基於數學原理的共識演算法,在節點之間建立「信任」網路,利用技術手段從而實現一種創新式的信用網路。
目前區款連行業內主流的共識演算法機制包含:工作量證明機制、權益證明機制、股份授權證明機制和Pool驗證池這四大類。
工作量證明機制即對於工作量的證明,是生成要加入到區塊鏈中的一筆新的交易信息(即新區塊)時必須滿足的要求。在基於工作量證明機制構建的區塊鏈網路中,節點通過計算隨機哈希散列的數值解爭奪記賬權,求得正確的數值解以生成區塊的能力是節點算力的具體表現。工作量證明機制具有完全去中心化的優點,在以工作量證明機制為共識的區塊鏈中,節點可以自由進出。大家所熟知的比特幣網路就應用工作量證明機制來生產新的貨幣。然而,由於工作量證明機制在比特幣網路中的應用已經吸引了全球計算機大部分的算力,其他想嘗試使用該機制的區塊鏈應用很難獲得同樣規模的算力來維持自身的安全。同時,基於工作量證明機制的挖礦行為還造成了大量的資源浪費,達成共識所需要的周期也較長,因此該機制並不適合商業應用。
2012年,化名Sunny King的網友推出了Peercoin,該加密電子貨幣採用工作量證明機制發行新幣,採用權益證明機制維護網路安全,這是權益證明機制在加密電子貨幣中的首次應用。與要求證明人執行一定量的計算工作不同,權益證明要求證明人提供一定數量加密貨幣的所有權即可。權益證明機制的運作方式是,當創造一個新區塊時,礦工需要創建一個「幣權」交易,交易會按照預先設定的比例把一些幣發送給礦工本身。權益證明機制根據每個節點擁有代幣的比例和時間,依據演算法等比例地降低節點的挖礦難度,從而加快了尋找隨機數的速度。這種共識機制可以縮短達成共識所需的時間,但本質上仍然需要網路中的節點進行挖礦運算。因此,PoS機制並沒有從根本上解決PoW機制難以應用於商業領域的問題。
股份授權證明機制是一種新的保障網路安全的共識機制。它在嘗試解決傳統的PoW機制和PoS機制問題的同時,還能通過實施科技式的民主抵消中心化所帶來的負面效應。
股份授權證明機制與董事會投票類似,該機制擁有一個內置的實時股權人投票系統,就像系統隨時都在召開一個永不散場的股東大會,所有股東都在這里投票決定公司決策。基於DPoS機制建立的區塊鏈的去中心化依賴於一定數量的代表,而非全體用戶。在這樣的區塊鏈中,全體節點投票選舉出一定數量的節點代表,由他們來代理全體節點確認區塊、維持系統有序運行。同時,區塊鏈中的全體節點具有隨時罷免和任命代表的權力。如果必要,全體節點可以通過投票讓現任節點代表失去代表資格,重新選舉新的代表,實現實時的民主。
股份授權證明機制可以大大縮小參與驗證和記賬節點的數量,從而達到秒級的共識驗證。然而,該共識機制仍然不能完美解決區塊鏈在商業中的應用問題,因為該共識機制無法擺脫對於代幣的依賴,而在很多商業應用中並不需要代幣的存在。
Pool驗證池基於傳統的分布式一致性技術建立,並輔之以數據驗證機制,是目前區塊鏈中廣泛使用的一種共識機制。
Pool驗證池不需要依賴代幣就可以工作,在成熟的分布式一致性演算法(Pasox、Raft)基礎之上,可以實現秒級共識驗證,更適合有多方參與的多中心商業模式。不過,Pool驗證池也存在一些不足,例如該共識機制能夠實現的分布式程度不如PoW機制等
這里主要講解區塊鏈工作量證明機制的一些演算法原理以及比特幣網路是如何證明自己的工作量的,希望大家能夠對共識演算法有一個基本的認識。
工作量證明系統的主要特徵是客戶端要做一定難度的工作來得到一個結果,驗證方則很容易通過結果來檢查客戶端是不是做了相應的工作。這種方案的一個核心特徵是不對稱性:工作對於請求方是適中中的,對於驗證方是易於驗證的。它與驗證碼不同,驗證碼是易於被人類解決而不是易於被計算機解決。
下圖所示的為工作量證明流程。
舉個例子,給個一個基本的字元創「hello,world!」,我們給出的工作量要求是,可以在這個字元創後面添加一個叫做nonce(隨機數)的整數值,對變更後(添加nonce)的字元創進行SHA-256運算,如果得到的結果(一十六進制的形式表示)以「0000」開頭的,則驗證通過。為了達到這個工作量證明的目標,需要不停地遞增nonce值,對得到的字元創進行SHA-256哈希運算。按照這個規則,需要經過4251次運算,才能找到前導為4個0的哈希散列。
通過這個示例我們對工作量證明機制有了一個初步的理解。有人或許認為如果工作量證明只是這樣一個過程,那是不是只要記住nonce為4521使計算能通過驗證就行了,當然不是了,這只是一個例子。
下面我們將輸入簡單的變更為」Hello,World!+整數值」,整數值取1~1000,也就是說將輸入變成一個1~1000的數組:Hello,World!1;Hello,World!2;...;Hello,World!1000。然後對數組中的每一個輸入依次進行上面的工作量證明—找到前導為4個0的哈希散列。
由於哈希值偽隨機的特性,根據概率論的相關知識容易計算出,預計要進行2的16次方次數的嘗試,才能得到前導為4個0的哈希散列。而統計一下剛剛進行的1000次計算的實際結果會發現,進行計算的平均次數為66958次,十分接近2的16次方(65536)。在這個例子中,數學期望的計算次數實際就是要求的「工作量」,重復進行多次的工作量證明會是一個符合統計學規律的概率事件。
統計輸入的字元創與得到對應目標結果實際使用的計算次數如下:
對於比特幣網路中的任何節點,如果想生成一個新的區塊加入到區塊鏈中,則必須解決出比特幣網路出的這道謎題。這道題的關鍵要素是工作量證明函數、區塊及難度值。工作量證明函數是這道題的計算方法,區塊是這道題的輸入數據,難度值決定了解這道題的所需要的計算量。
比特幣網路中使用的工作量證明函數正是上文提及的SHA-256。區塊其實就是在工作量證明環節產生的。曠工通過不停地構造區塊數據,檢驗每次計算出的結果是否滿足要求的工作量,從而判斷該區塊是不是符合網路難度。區塊頭即比特幣工作量證明函數的輸入數據。
難度值是礦工們挖掘的重要參考指標,它決定了曠工需要經過多少次哈希運算才能產生一個合法的區塊。比特幣網路大約每10分鍾生成一個區塊,如果在不同的全網算力條件下,新區塊的產生基本都保持這個速度,難度值必須根據全網算力的變化進行調整。總的原則即為無論挖礦能力如何,使得網路始終保持10分鍾產生一個新區塊。
難度值的調整是在每個完整節點中獨立自動發生的。每隔2016個區塊,所有節點都會按照統一的格式自動調整難度值,這個公式是由最新產生的2016個區塊的花費時長與期望時長(按每10分鍾產生一個取款,則期望時長為20160分鍾)比較得出來的,根據實際時長一期望時長的比值進行調整。也就是說,如果區塊產生的速度比10分鍾快,則增加難度值;反正,則降低難度值。用公式來表達如下:
新難度值=舊難度值*(20160分鍾/過去2016個區塊花費時長)。
工作量證明需要有一個目標值。比特幣工作量證明的目標值(Target)的計算公式如下:
目標值=最大目標值/難度值,其中最大目標值為一個恆定值
目標值的大小與難度值成反比,比特幣工作量證明的達成就是礦中計算出來的區塊哈希值必須小於目標值。
我們也可以將比特幣工作量的過程簡單的理解成,通過不停變更區塊頭(即嘗試不同nonce值)並將其作為輸入,進行SHA-256哈希運算,找出一個有特定格式哈希值的過程(即要求有一定數量的前導0),而要求的前導0個數越多,難度越大。
可以把比特幣將這道工作量證明謎題的步驟大致歸納如下:
該過程可以用下圖表示:
比特幣的工作量證明,就是我們俗稱「挖礦」所做的主要工作。理解工作量證明機制,將為我們進一步理解比特幣區塊鏈的共識機制奠定基礎。