深入了解區塊鏈的共識機制及算法原理

文章推薦指數: 80 %
投票人數:10人

區塊鏈共識

什麼是共識機制

所謂「共識機制」,是通過特殊節點的投票,在很短的時間內完成對交易的驗證和確認;對一筆交易,如果利益不相干的若干個節點能夠達成共識,我們就可以認為全網對此也能夠達成共識。

再通俗一點來講,如果中國一名微博大V、美國一名虛擬幣玩家、一名非洲留學生和一名歐洲旅行者互不相識,但他們都一致認為你是個好人,那麼基本上就可以斷定你這人還不壞。


區塊鏈為什麼需要共識機制(算法)

要想整個區塊鏈網絡節點維持一份相同的數據,同時保證每個參與者的公平性,整個體系的所有參與者必須要有統一的協議,也就是我們這裡要將的共識算法。

比特幣所有的節點都遵循統一的協議規範。

協議規範(共識算法)由相關的共識規則組成,這些規則可以分為兩個大的核心:工作量證明與最長鏈機制。

所有規則(共識)的最終體現就是比特幣的最長鏈。

共識算法的目的就是保證比特幣不停地在最長鏈條上運轉,從而保證整個記帳系統的一致性和可靠性。


四種主流的共識機制

區塊鏈中的用戶進行交易時不需要考慮對方的信用、不需要信任對方,也無需一個可信的中介機構或中央機構,只需要依據區塊鏈協議即可實現交易。

這種不需要可信第三方中介就可以順利交易的前提是區塊鏈的共識機制,即在互不了解、信任的市場環境中,參與交易的各節點出於對自身利益考慮,沒有任何違規作弊的動機、行為,因此各節點會主動自覺遵守預先設定的規則,來判斷每一筆交易的真實性和可靠性,並將檢驗通過的記錄寫入到區塊鏈中。

各節點的利益各不相同,邏輯上將它們沒有合謀欺騙作弊的動機產生,而當網絡中有的節點擁有公共信譽時,這一點尤為明顯。

區塊鏈技術運用基於數學原理的共識算法,在節點之間建立「信任」網絡,利用技術手段從而實現一種創新式的信用網絡。

目前區款連行業內主流的共識算法機制包含:工作量證明機制、權益證明機制、股份授權證明機制和Pool驗證池這四大類。

01 工作量證明機制

工作量證明機制即對於工作量的證明,是生成要加入到區塊鏈中的一筆新的交易信息(即新區塊)時必須滿足的要求。

在基於工作量證明機制構建的區塊鏈網絡中,節點通過計算隨機哈希散列的數值解爭奪記帳權,求得正確的數值解以生成區塊的能力是節點算力的具體表現。

工作量證明機制具有完全去中心化的優點,在以工作量證明機制為共識的區塊鏈中,節點可以自由進出。

大家所熟知的比特幣網絡就應用工作量證明機制來生產新的貨幣。

然而,由於工作量證明機制在比特幣網絡中的應用已經吸引了全球計算機大部分的算力,其他想嘗試使用該機制的區塊鏈應用很難獲得同樣規模的算力來維持自身的安全。

同時,基於工作量證明機制的挖礦行為還造成了大量的資源浪費,達成共識所需要的周期也較長,因此該機制並不適合商業應用。

02 權益證明機制

2012年,化名Sunny King的網友推出了Peercoin,該加密電子貨幣採用工作量證明機制發行新幣,採用權益證明機制維護網絡安全,這是權益證明機制在加密電子貨幣中的首次應用。

與要求證明人執行一定量的計算工作不同,權益證明要求證明人提供一定數量加密貨幣的所有權即可。

權益證明機制的運作方式是,當創造一個新區塊時,礦工需要創建一個「幣權」交易,交易會按照預先設定的比例把一些幣發送給礦工本身。

權益證明機制根據每個節點擁有代幣的比例和時間,依據算法等比例地降低節點的挖礦難度,從而加快了尋找隨機數的速度。

這種共識機制可以縮短達成共識所需的時間,但本質上仍然需要網絡中的節點進行挖礦運算。

因此,PoS機制並沒有從根本上解決PoW機制難以應用於商業領域的問題。

03 股份授權證明機制

股份授權證明機制是一種新的保障網絡安全的共識機制。

它在嘗試解決傳統的PoW機制和PoS機制問題的同時,還能通過實施科技式的民主抵消中心化所帶來的負面效應。

股份授權證明機制與董事會投票類似,該機制擁有一個內置的實時股權人投票系統,就像系統隨時都在召開一個永不散場的股東大會,所有股東都在這裡投票決定公司決策。

基於DPoS機制建立的區塊鏈的去中心化依賴於一定數量的代表,而非全體用戶。

在這樣的區塊鏈中,全體節點投票選舉出一定數量的節點代表,由他們來代理全體節點確認區塊、維持系統有序運行。

同時,區塊鏈中的全體節點具有隨時罷免和任命代表的權力。

如果必要,全體節點可以通過投票讓現任節點代表失去代表資格,重新選舉新的代表,實現實時的民主。

股份授權證明機制可以大大縮小參與驗證和記帳節點的數量,從而達到秒級的共識驗證。

然而,該共識機制仍然不能完美解決區塊鏈在商業中的應用問題,因為該共識機制無法擺脫對於代幣的依賴,而在很多商業應用中並不需要代幣的存在。

04 PooI驗證池

Pool驗證池基於傳統的分布式一致性技術建立,並輔之以數據驗證機制,是目前區塊鏈中廣泛使用的一種共識機制。

Pool驗證池不需要依賴代幣就可以工作,在成熟的分布式一致性算法(Pasox、Raft)基礎之上,可以實現秒級共識驗證,更適合有多方參與的多中心商業模式。

不過,Pool驗證池也存在一些不足,例如該共識機制能夠實現的分布式程度不如PoW機制等。


工作量證明算法解析

這裡主要講解區塊鏈工作量證明機制的一些算法原理以及比特幣網絡是如何證明自己的工作量的,希望大家能夠對共識算法有一個基本的認識。

基本技術原理

工作量證明系統的主要特徵是客戶端要做一定難度的工作來得到一個結果,驗證方則很容易通過結果來檢查客戶端是不是做了相應的工作。

這種方案的一個核心特徵是不對稱性:工作對於請求方是適中中的,對於驗證方是易於驗證的。

它與驗證碼不同,驗證碼是易於被人類解決而不是易於被計算機解決。

下圖所示的為工作量證明流程。

工作量證明流程

舉個例子,給個一個基本的字符創「hello,world!」,我們給出的工作量要求是,可以在這個字符創後面添加一個叫做nonce(隨機數)的整數值,對變更後(添加nonce)的字符創進行SHA-256運算,如果得到的結果(一十六進位的形式表示)以「0000」開頭的,則驗證通過。

為了達到這個工作量證明的目標,需要不停地遞增nonce值,對得到的字符創進行SHA-256哈希運算。

按照這個規則,需要經過4251次運算,才能找到前導為4個0的哈希散列。

「Hello,World!0"=>1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

「Hello,World!1"=>e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

「Hello,World!2"=>ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7

...「Hello,World!4250"=>0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

通過這個示例我們對工作量證明機制有了一個初步的理解。

有人或許認為如果工作量證明只是這樣一個過程,那是不是只要記住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)。

在這個例子中,數學期望的計算次數實際就是要求的「工作量」,重複進行多次的工作量證明會是一個符合統計學規律的機率事件。

統計輸入的字符創與得到對應目標結果實際使用的計算次數如下:

Hello,World!1=>42153

Hello,World!2=>2643

Hello,World!3=>32825

Hello,World!4=>250

Hello,World!5=>7300

...

Hello,World!995=>164819

Hello,World!996=>178486

Hello,World!997=>22798

Hello,World!998=>68868

Hello,World!999=>46281

比特幣的工作量證明

對於比特幣網絡中的任何節點,如果想生成一個新的區塊加入到區塊鏈中,則必須解決出比特幣網絡出的這道謎題。

這道題的關鍵要素是工作量證明函數、區塊及難度值。

工作量證明函數是這道題的計算方法,區塊是這道題的輸入數據,難度值決定了解這道題的所需要的計算量。

比特幣網絡中使用的工作量證明函數正是上文提及的SHA-256。

區塊其實就是在工作量證明環節產生的。

曠工通過不停地構造區塊數據,檢驗每次計算出的結果是否滿足要求的工作量,從而判斷該區塊是不是符合網絡難度。

區塊頭即比特幣工作量證明函數的輸入數據。

難度值是礦工們挖掘的重要參考指標,它決定了曠工需要經過多少次哈希運算才能產生一個合法的區塊。

比特幣網絡大約每10分鐘生成一個區塊,如果在不同的全網算力條件下,新區塊的產生基本都保持這個速度,難度值必須根據全網算力的變化進行調整。

總的原則即為無論挖礦能力如何,使得網絡始終保持10分鐘產生一個新區塊。

難度值的調整是在每個完整節點中獨立自動發生的。

每隔2016個區塊,所有節點都會按照統一的格式自動調整難度值,這個公式是由最新產生的2016個區塊的花費時長與期望時長(按每10分鐘產生一個取款,則期望時長為20160分鐘)比較得出來的,根據實際時長一期望時長的比值進行調整。

也就是說,如果區塊產生的速度比10分鐘快,則增加難度值;反正,則降低難度值。

用公式來表達如下:

新難度值=舊難度值*(20160分鐘/過去2016個區塊花費時長)。

工作量證明需要有一個目標值。

比特幣工作量證明的目標值(Target)的計算公式如下:

目標值=最大目標值/難度值,其中最大目標值為一個恆定值0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目標值的大小與難度值成反比,比特幣工作量證明的達成就是礦中計算出來的區塊哈希值必須小於目標值。

我們也可以將比特幣工作量的過程簡單的理解成,通過不停變更區塊頭(即嘗試不同nonce值)並將其作為輸入,進行SHA-256哈希運算,找出一個有特定格式哈希值的過程(即要求有一定數量的前導0),而要求的前導0個數越多,難度越大。

可以把比特幣將這道工作量證明謎題的步驟大致歸納如下:

1)生成coinbase交易,並與其他所有打包進區塊的交易組成交易列表,通過Merkle Tree算法生成Merkle Root Hash。

2)把Merkle Root Hash及其他相關欄位組裝成區塊頭,將區塊頭的80字節數據作為工作量證明的輸入。

3)不停變更區塊頭中的隨機數(即nonce值),並對每次變更後的區塊頭進行雙重SHA-256運算,將結果值哈希翻轉並與當前網絡的目標值對應的十進位字符創對比,如果小於目標值,則解題成功,工作量

區塊謎題

比特幣的工作量證明,就是我們俗稱「挖礦」所做的主要工作。

理解工作量證明機制,將為我們進一步理解比特幣區塊鏈的共識機制奠定基礎。


請為這篇文章評分?


相關文章 

比特幣和區塊鏈之:什麼是工作量證明?

1起源工作量證明(Proof Of Work,簡稱POW),簡單理解就是一份證明,用來確認你做過一定量的工作。監測工作的整個過程通常是極為低效的,而通過對工作的結果進行認證來證明完成了相應的工作...