當前位置:首頁 » 區塊鏈知識 » 區塊鏈中難度值計算

區塊鏈中難度值計算

發布時間: 2023-02-28 18:59:21

1. 比特幣區塊里的各個欄位含義(先寫了個nonce)

nonce是個啥意思?根據bitcoin wiki

nonce是一個4-byte大小的區域,nonce的值設定使得該塊的hash是以一串0開頭的。
對於塊數據的一點點改變(比如nonce)都會引起block hash的巨大變化。由於逆向預測hash值相對應的一組bit值(hash原文)是不可行的,在嘗試足夠多的nonce值且計算每個nonce值相對應的block hash之後可以找到一個滿足有指定數量 0 bits (0比特位) 的hash值。而 0 bits的數量值是由difficult設定的。最終產生的hash須得是一個小於當前difficulty值。
因為這個迭代的計算耗費時間和資源,塊的出現也就是得到了正確的nonce值,這構成了 proof of work

關於以太坊里的nonce 網上很多解釋,很多一上來就是 交易計數器 , 然而卻把跟POW有關的丟了嗎?事實上以太坊里的nonce有兩種意思,一個是proof of work nonce,一個是account nonce。

那智能合約呢?合約也算是Account的一種,那也有nonce嗎?

是的,而且合約裡面的nonce也差不多,也是一個counter。在智能合約里,nonce的值代表的是該合約創建的合約數量。只有當一個合約創建另一個合約的時候才會增加nonce的值。但是當一個合約調用另一個合約中的method時 nonce的值是不變的。

在以太坊中nonce的值可以這樣來獲取(其實也就是屬於一個賬戶的交易數量):

但是這個方法只能獲取交易once的值。目前是沒有內置方法來訪問contract中的nonce值的,除了自己定義一個counter來計數...

那好,再來看一下Ethereum Block中的nonce:
以太坊和比特幣區塊鏈一樣,也需要proof of work(計劃轉移到股份證明也早已在做了)。在比特幣區塊鏈中,pow應該是要算出一個符合難度要求的值,通常是以一串0開頭的。這個難度一直在變化。可以查看 比特幣區塊鏈的POW難度變化 。

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

所謂「共識機制」,是通過特殊節點的投票,在很短的時間內完成對交易的驗證和確認;對一筆交易,如果利益不相乾的若干個節點能夠達成共識,我們就可以認為全網對此也能夠達成共識。再通俗一點來講,如果中國一名微博大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個數越多,難度越大。

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

該過程可以用下圖表示:

比特幣的工作量證明,就是我們俗稱「挖礦」所做的主要工作。理解工作量證明機制,將為我們進一步理解比特幣區塊鏈的共識機制奠定基礎。

3. 區塊鏈中區塊記錄的難度值是固定的嗎

不固定。
有許多不同測量難度的方法,得到的值可能不同。傳統地,它表示一個值,前32位為0,後面都為1也就是被稱為礦池難度,區塊鏈比特幣協議把目標表示成一個有限精度的自定義浮點類型,因而,比特幣客戶端用該值來估計難度。

4. 區塊鏈 --- 共識演算法

PoW演算法是一種防止分布式服務資源被濫用、拒絕服務攻擊的機制。它要求節點進行適量消耗時間和資源的復雜運算,並且其運算結果能被其他節點快速驗算,以耗用時間、能源做擔保,以確保服務與資源被真正的需求所使用。

PoW演算法中最基本的技術原理是使用哈希演算法。假設求哈希值Hash(r),若原始數據為r(raw),則運算結果為R(Result)。

R = Hash(r)

哈希函數Hash()的特性是,對於任意輸入值r,得出結果R,並且無法從R反推回r。當輸入的原始數據r變動1比特時,其結果R值完全改變。在比特幣的PoW演算法中,引入演算法難度d和隨機值n,得到以下公式:

Rd = Hash(r+n)

該公式要求在填入隨機值n的情況下,計算結果Rd的前d位元組必須為0。由於哈希函數結果的未知性,每個礦工都要做大量運算之後,才能得出正確結果,而算出結果廣播給全網之後,其他節點只需要進行一次哈希運算即可校驗。PoW演算法就是採用這種方式讓計算消耗資源,而校驗僅需一次。

 

PoS演算法要求節點驗證者必須質押一定的資金才有挖礦打包資格,並且區域鏈系統在選定打包節點時使用隨機的方式,當節點質押的資金越多時,其被選定打包區塊的概率越大。

POS模式下,每個幣每天產生1幣齡,比如你持有100個幣,總共持有了30天,那麼,此時你的幣齡就為3000。這個時候,如果你驗證了一個POS區塊,你的幣齡就會被清空為0,同時從區塊中獲得相對應的數字貨幣利息。

節點通過PoS演算法出塊的過程如下:普通的節點要成為出塊節點,首先要進行資產的質押,當輪到自己出塊時,打包區塊,然後向全網廣播,其他驗證節點將會校驗區塊的合法性。

 

DPoS演算法和PoS演算法相似,也採用股份和權益質押。

但不同的是,DPoS演算法採用委託質押的方式,類似於用全民選舉代表的方式選出N個超級節點記賬出塊。

選民把自己的選票投給某個節點,如果某個節點當選記賬節點,那麼該記賬節點往往在獲取出塊獎勵後,可以採用任意方式來回報自己的選民。

這N個記賬節點將輪流出塊,並且節點之間相互監督,如果其作惡,那麼會被扣除質押金。

通過信任少量的誠信節點,可以去除區塊簽名過程中不必要的步驟,提高了交易的速度。
 

拜占庭問題:

拜占庭是古代東羅馬帝國的首都,為了防禦在每塊封地都駐扎一支由單個將軍帶領的軍隊,將軍之間只能靠信差傳遞消息。在戰爭時,所有將軍必須達成共識,決定是否共同開戰。

但是,在軍隊內可能有叛徒,這些人將影響將軍們達成共識。拜占庭將軍問題是指在已知有將軍是叛徒的情況下,剩餘的將軍如何達成一致決策的問題。

BFT:

BFT即拜占庭容錯,拜占庭容錯技術是一類分布式計算領域的容錯技術。拜占庭假設是對現實世界的模型化,由於硬體錯誤、網路擁塞或中斷以及遭到惡意攻擊等原因,計算機和網路可能出現不可預料的行為。拜占庭容錯技術被設計用來處理這些異常行為,並滿足所要解決的問題的規范要求。

拜占庭容錯系統

發生故障的節點被稱為 拜占庭節點 ,而正常的節點即為 非拜占庭節點

假設分布式系統擁有n台節點,並假設整個系統拜占庭節點不超過m台(n ≥ 3m + 1),拜占庭容錯系統需要滿足如下兩個條件:

另外,拜占庭容錯系統需要達成如下兩個指標:

PBFT即實用拜占庭容錯演算法,解決了原始拜占庭容錯演算法效率不高的問題,演算法的時間復雜度是O(n^2),使得在實際系統應用中可以解決拜占庭容錯問題
 

PBFT是一種狀態機副本復制演算法,所有的副本在一個視圖(view)輪換的過程中操作,主節點通過視圖編號以及節點數集合來確定,即:主節點 p = v mod |R|。v:視圖編號,|R|節點個數,p:主節點編號。

PBFT演算法的共識過程如下:客戶端(Client)發起消息請求(request),並廣播轉發至每一個副本節點(Replica),由其中一個主節點(Leader)發起提案消息pre-prepare,並廣播。其他節點獲取原始消息,在校驗完成後發送prepare消息。每個節點收到2f+1個prepare消息,即認為已經准備完畢,並發送commit消息。當節點收到2f+1個commit消息,客戶端收到f+1個相同的reply消息時,說明客戶端發起的請求已經達成全網共識。

具體流程如下

客戶端c向主節點p發送<REQUEST, o, t, c>請求。o: 請求的具體操作,t: 請求時客戶端追加的時間戳,c:客戶端標識。REQUEST: 包含消息內容m,以及消息摘要d(m)。客戶端對請求進行簽名。

主節點收到客戶端的請求,需要進行以下交驗:

a. 客戶端請求消息簽名是否正確。

非法請求丟棄。正確請求,分配一個編號n,編號n主要用於對客戶端的請求進行排序。然後廣播一條<<PRE-PREPARE, v, n, d>, m>消息給其他副本節點。v:視圖編號,d客戶端消息摘要,m消息內容。<PRE-PREPARE, v, n, d>進行主節點簽名。n是要在某一個范圍區間內的[h, H],具體原因參見 垃圾回收 章節。

副本節點i收到主節點的PRE-PREPARE消息,需要進行以下交驗:

a. 主節點PRE-PREPARE消息簽名是否正確。

b. 當前副本節點是否已經收到了一條在同一v下並且編號也是n,但是簽名不同的PRE-PREPARE信息。

c. d與m的摘要是否一致。

d. n是否在區間[h, H]內。

非法請求丟棄。正確請求,副本節點i向其他節點包括主節點發送一條<PREPARE, v, n, d, i>消息, v, n, d, m與上述PRE-PREPARE消息內容相同,i是當前副本節點編號。<PREPARE, v, n, d, i>進行副本節點i的簽名。記錄PRE-PREPARE和PREPARE消息到log中,用於View Change過程中恢復未完成的請求操作。

主節點和副本節點收到PREPARE消息,需要進行以下交驗:

a. 副本節點PREPARE消息簽名是否正確。

b. 當前副本節點是否已經收到了同一視圖v下的n。

c. n是否在區間[h, H]內。

d. d是否和當前已收到PRE-PPREPARE中的d相同

非法請求丟棄。如果副本節點i收到了2f+1個驗證通過的PREPARE消息,則向其他節點包括主節點發送一條<COMMIT, v, n, d, i>消息,v, n, d, i與上述PREPARE消息內容相同。<COMMIT, v, n, d, i>進行副本節點i的簽名。記錄COMMIT消息到日誌中,用於View Change過程中恢復未完成的請求操作。記錄其他副本節點發送的PREPARE消息到log中。

主節點和副本節點收到COMMIT消息,需要進行以下交驗:

a. 副本節點COMMIT消息簽名是否正確。

b. 當前副本節點是否已經收到了同一視圖v下的n。

c. d與m的摘要是否一致。

d. n是否在區間[h, H]內。

非法請求丟棄。如果副本節點i收到了2f+1個驗證通過的COMMIT消息,說明當前網路中的大部分節點已經達成共識,運行客戶端的請求操作o,並返回<REPLY, v, t, c, i, r>給客戶端,r:是請求操作結果,客戶端如果收到f+1個相同的REPLY消息,說明客戶端發起的請求已經達成全網共識,否則客戶端需要判斷是否重新發送請求給主節點。記錄其他副本節點發送的COMMIT消息到log中。
 

如果主節點作惡,它可能會給不同的請求編上相同的序號,或者不去分配序號,或者讓相鄰的序號不連續。備份節點應當有職責來主動檢查這些序號的合法性。

如果主節點掉線或者作惡不廣播客戶端的請求,客戶端設置超時機制,超時的話,向所有副本節點廣播請求消息。副本節點檢測出主節點作惡或者下線,發起View Change協議。

View Change協議

副本節點向其他節點廣播<VIEW-CHANGE, v+1, n, C , P , i>消息。n是最新的stable checkpoint的編號, C 2f+1驗證過的CheckPoint消息集合, P 是當前副本節點未完成的請求的PRE-PREPARE和PREPARE消息集合。

當主節點p = v + 1 mod |R|收到 2f 個有效的VIEW-CHANGE消息後,向其他節點廣播<NEW-VIEW, v+1, V , O >消息。 V 是有效的VIEW-CHANGE消息集合。 O 是主節點重新發起的未經完成的PRE-PREPARE消息集合。PRE-PREPARE消息集合的選取規則:

副本節點收到主節點的NEW-VIEW消息,驗證有效性,有效的話,進入v+1狀態,並且開始 O 中的PRE-PREPARE消息處理流程。
 

在上述演算法流程中,為了確保在View Change的過程中,能夠恢復先前的請求,每一個副本節點都記錄一些消息到本地的log中,當執行請求後副本節點需要把之前該請求的記錄消息清除掉。

最簡單的做法是在Reply消息後,再執行一次當前狀態的共識同步,這樣做的成本比較高,因此可以在執行完多條請求K(例如:100條)後執行一次狀態同步。這個狀態同步消息就是CheckPoint消息。

副本節點i發送<CheckPoint, n, d, i>給其他節點,n是當前節點所保留的最後一個視圖請求編號,d是對當前狀態的一個摘要,該CheckPoint消息記錄到log中。如果副本節點i收到了2f+1個驗證過的CheckPoint消息,則清除先前日誌中的消息,並以n作為當前一個stable checkpoint。

這是理想情況,實際上當副本節點i向其他節點發出CheckPoint消息後,其他節點還沒有完成K條請求,所以不會立即對i的請求作出響應,它還會按照自己的節奏,向前行進,但此時發出的CheckPoint並未形成stable。

為了防止i的處理請求過快,設置一個上文提到的 高低水位區間[h, H] 來解決這個問題。低水位h等於上一個stable checkpoint的編號,高水位H = h + L,其中L是我們指定的數值,等於checkpoint周期處理請求數K的整數倍,可以設置為L = 2K。當副本節點i處理請求超過高水位H時,此時就會停止腳步,等待stable checkpoint發生變化,再繼續前進。
 

在區塊鏈場景中,一般適合於對強一致性有要求的私有鏈和聯盟鏈場景。例如,在IBM主導的區塊鏈超級賬本項目中,PBFT是一個可選的共識協議。在Hyperledger的Fabric項目中,共識模塊被設計成可插拔的模塊,支持像PBFT、Raft等共識演算法。
 

 

Raft基於領導者驅動的共識模型,其中將選舉一位傑出的領導者(Leader),而該Leader將完全負責管理集群,Leader負責管理Raft集群的所有節點之間的復制日誌。
 

下圖中,將在啟動過程中選擇集群的Leader(S1),並為來自客戶端的所有命令/請求提供服務。 Raft集群中的所有節點都維護一個分布式日誌(復制日誌)以存儲和提交由客戶端發出的命令(日誌條目)。 Leader接受來自客戶端的日誌條目,並在Raft集群中的所有關注者(S2,S3,S4,S5)之間復制它們。

在Raft集群中,需要滿足最少數量的節點才能提供預期的級別共識保證, 這也稱為法定人數。 在Raft集群中執行操作所需的最少投票數為 (N / 2 +1) ,其中N是組中成員總數,即 投票至少超過一半 ,這也就是為什麼集群節點通常為奇數的原因。 因此,在上面的示例中,我們至少需要3個節點才能具有共識保證。

如果法定仲裁節點由於任何原因不可用,也就是投票沒有超過半數,則此次協商沒有達成一致,並且無法提交新日誌。

 

數據存儲:Tidb/TiKV

日誌:阿里巴巴的 DLedger

服務發現:Consul& etcd

集群調度:HashiCorp Nomad
 

只能容納故障節點(CFT),不容納作惡節點

順序投票,只能串列apply,因此高並發場景下性能差
 

Raft通過解決圍繞Leader選舉的三個主要子問題,管理分布式日誌和演算法的安全性功能來解決分布式共識問題。

當我們啟動一個新的Raft集群或某個領導者不可用時,將通過集群中所有成員節點之間協商來選舉一個新的領導者。 因此,在給定的實例中,Raft集群的節點可以處於以下任何狀態: 追隨者(Follower),候選人(Candidate)或領導者(Leader)。

系統剛開始啟動的時候,所有節點都是follower,在一段時間內如果它們沒有收到Leader的心跳信號,follower就會轉化為Candidate;

如果某個Candidate節點收到大多數節點的票,則這個Candidate就可以轉化為Leader,其餘的Candidate節點都會回到Follower狀態;

一旦一個Leader發現系統中存在一個Leader節點比自己擁有更高的任期(Term),它就會轉換為Follower。

Raft使用基於心跳的RPC機制來檢測何時開始新的選舉。 在正常期間, Leader 會定期向所有可用的 Follower 發送心跳消息(實際中可能把日誌和心跳一起發過去)。 因此,其他節點以 Follower 狀態啟動,只要它從當前 Leader 那裡收到周期性的心跳,就一直保持在 Follower 狀態。

Follower 達到其超時時間時,它將通過以下方式啟動選舉程序:

根據 Candidate 從集群中其他節點收到的響應,可以得出選舉的三個結果。

共識演算法的實現一般是基於復制狀態機(Replicated state machines),何為 復制狀態機

簡單來說: 相同的初識狀態 + 相同的輸入 = 相同的結束狀態 。不同節點要以相同且確定性的函數來處理輸入,而不要引入一下不確定的值,比如本地時間等。使用replicated log是一個很不錯的注意,log具有持久化、保序的特點,是大多數分布式系統的基石。

有了Leader之後,客戶端所有並發的請求可以在Leader這邊形成一個有序的日誌(狀態)序列,以此來表示這些請求的先後處理順序。Leader然後將自己的日誌序列發送Follower,保持整個系統的全局一致性。注意並不是強一致性,而是 最終一致性

日誌由有序編號(log index)的日誌條目組成。每個日誌條目包含它被創建時的任期號(term),和日誌中包含的數據組成,日誌包含的數據可以為任何類型,從簡單類型到區塊鏈的區塊。每個日誌條目可以用[ term, index, data]序列對表示,其中term表示任期, index表示索引號,data表示日誌數據。

Leader 嘗試在集群中的大多數節點上執行復制命令。 如果復製成功,則將命令提交給集群,並將響應發送回客戶端。類似兩階段提交(2PC),不過與2PC的區別在於,leader只需要超過一半節點同意(處於工作狀態)即可。

leader follower 都可能crash,那麼 follower 維護的日誌與 leader 相比可能出現以下情況

當出現了leader與follower不一致的情況,leader強制follower復制自己的log, Leader會從後往前試 ,每次AppendEntries失敗後嘗試前一個日誌條目(遞減nextIndex值), 直到成功找到每個Follower的日誌一致位置點(基於上述的兩條保證),然後向後逐條覆蓋Followers在該位置之後的條目 。所以丟失的或者多出來的條目可能會持續多個任期。
 

要求候選人的日誌至少與其他節點一樣最新。如果不是,則跟隨者節點將不投票給候選者。

意味著每個提交的條目都必須存在於這些伺服器中的至少一個中。如果候選人的日誌至少與該多數日誌中的其他日誌一樣最新,則它將保存所有已提交的條目,避免了日誌回滾事件的發生。

即任一任期內最多一個leader被選出。這一點非常重要,在一個復制集中任何時刻只能有一個leader。系統中同時有多餘一個leader,被稱之為腦裂(brain split),這是非常嚴重的問題,會導致數據的覆蓋丟失。在raft中,兩點保證了這個屬性:

因此, 某一任期內一定只有一個leader
 

當集群中節點的狀態發生變化(集群配置發生變化)時,系統容易受到系統故障。 因此,為防止這種情況,Raft使用了一種稱為兩階段的方法來更改集群成員身份。 因此,在這種方法中,集群在實現新的成員身份配置之前首先更改為中間狀態(稱為聯合共識)。 聯合共識使系統即使在配置之間進行轉換時也可用於響應客戶端請求,它的主要目的是提升分布式系統的可用性。

5. 區塊鏈數據結構詳解

為了讀懂下文,先必須了解 散列演算法

如上圖,我們可以看出來,一個區塊中最重要的有四個欄位

一、prev_hash

前一個區塊的hash(散列演算法)值,用於連接前一個區塊,前一個區塊也擁有該欄位,同樣也可以連接前前個區塊。這樣就形成了一個鏈條,這也可能是區塊鏈的含義

二、timestamp

標准時間,通過時間順序,讓交易可以通過時間維度進行追溯。

三、Nonce

隨機數,說道隨機數,就要說到區塊裡面另外一個重要的欄位「難度值」,難度值就是挖礦的標准,挖礦的過程就是通過隨機數體現的,我們通過不停的變換隨機數,使生成區塊的hash值滿足定義的「難度值」。

四、Tx_Root

梅克樹,所有交易的一個匯總hash。這個hash是怎麼產生的。通過圖片我們可以看出來,每個交易都有一個hash值,每兩個相鄰的hash值又會生成一個hash,直到生成最頂上的hash值。

6. 什麼是區塊鏈土豆鏈Potato chain又是什麼

關於這個問題,其實建議你去游說社區看一下(網頁鏈接),那裡有大佬大V為你解答。這里我為你分享一篇阮一峰老師的文章,應該能對你的問題作出解答。

一、區塊鏈的本質

區塊鏈是什麼?一句話,它是一種特殊的分布式資料庫。

現在的規則是,新節點總是採用最長的那條區塊鏈。如果區塊鏈有分叉,將看哪個分支在分叉點後面,先達到6個新區塊(稱為"六次確認")。按照10分鍾一個區塊計算,一小時就可以確認。

由於新區塊的生成速度由計算能力決定,所以這條規則就是說,擁有大多數計算能力的那條分支,就是正宗的區塊鏈。

九、總結

區塊鏈作為無人管理的分布式資料庫,從2009年開始已經運行了8年,沒有出現大的問題。這證明它是可行的。

但是,為了保證數據的可靠性,區塊鏈也有自己的代價。一是效率,數據寫入區塊鏈,最少要等待十分鍾,所有節點都同步數據,則需要更多的時間;二是能耗,區塊的生成需要礦工進行無數無意義的計算,這是非常耗費能源的。

因此,區塊鏈的適用場景,其實非常有限。

  • 不存在所有成員都信任的管理當局

  • 寫入的數據不要求實時使用

  • 挖礦的收益能夠彌補本身的成本

  • 如果無法滿足上述的條件,那麼傳統的資料庫是更好的解決方案。

    目前,區塊鏈最大的應用場景(可能也是唯一的應用場景),就是以比特幣為代表的加密貨幣。

    7. 簡要理解區塊鏈

    區塊鏈(Blockchain)是比特幣的一個重要概念,是比特幣的底層技術和基礎架構,是分布式數據存儲、點對點傳輸、共識機制、加密演算法等計算機技術的新型應用模式。
    狹義來講,區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構, 並以密碼學方式保證的不可篡改和不可偽造的分布式賬本。
    一句話,它是一種特殊的分布式資料庫。

    一個很重要的理解就是去中心化

    區塊鏈的世界裡面,沒有中心節點,每個節點都是平等的,都保存著整個資料庫,任何讀取都是平行的和透明的。
    區塊鏈沒有管理員,區塊鏈格式作為一種使資料庫安全而不需要行政機構的授信的解決方案首先被應用於比特幣。
    那麼ta是如何取得防偽的呢?

    區塊與 Hash 是一一對應的,有人修改了一個區塊,該區塊的 Hash 就變了。
    所以ta是唯一的!
    計算 Hash 的機器就叫做礦機,操作礦機的人就叫做礦工。
    區塊頭包含一個難度系數(difficulty),這個值決定了計算 Hash 的難度。
    大概計算10億次,才算中一次。

    區塊鏈主要解決的交易的信任和安全問題,因此它針對這個問題提出了四個技術創新:
    第一個叫分布式賬本,就是交易記賬由分布在不同地方的多個節點共同完成,而且每一個節點都記錄的是完整的賬目,因此它們都可以參與監督交易合法性,同時也可以共同為其作證。不同於傳統的中心化記賬方案,沒有任何一個節點可以單獨記錄賬目,從而避免了單一記賬人被控制或者被賄賂而記假賬的可能性。另一方面,由於記賬節點足夠多,理論上講除非所有的節點被破壞,否則賬目就不會丟失,從而保證了賬目數據的安全性。
    第二個叫做非對稱加密和授權技術,存儲在區塊鏈上的交易信息是公開的,但是賬戶身份信息是高度加密的,只有在數據擁有者授權的情況下才能訪問到,從而保證了數據的安全和個人的隱私。
    第三個叫做共識機制,就是所有記賬節點之間怎麼達成共識,去認定一個記錄的有效性,這既是認定的手段,也是防止篡改的手段。區塊鏈提出了四種不同的共識機制,適用於不同的應用場景,在效率和安全性之間取得平衡。以比特幣為例,採用的是工作量證明,只有在控制了全網超過51%的記賬節點的情況下,才有可能偽造出一條不存在的記錄。當加入區塊鏈的節點足夠多的時候,這基本上不可能,從而杜絕了造假的可能。
    最後一個技術特點叫智能合約,智能合約是基於這些可信的不可篡改的數據,可以自動化的執行一些預先定義好的規則和條款。以保險為例,如果說每個人的信息(包括醫療信息和風險發生的信息)都是真實可信的,那就很容易的在一些標准化的保險產品中,去進行自動化的理賠。

    一個署名為中本聰的人,提出了革命性的構想:讓我們創造一種不受政府或其他任何人控制的貨幣!
    ----比特幣的起源。
    區塊鏈技術應用前景極為廣泛,尤其是金融領域的數字貨幣、跨境支付等等,此前消息稱,中國央行有望成為首個研發數字貨幣並開展真實應用的中央銀行。
    三五互聯:公司與中金在線已簽署了合作意向書,擬共同開展比特幣項目,而區塊鏈技術正是比特幣的核心。
    恆生電子:正在嘗試建立運用區塊鏈技術實現基於聯盟鏈的數字票據系統。
    飛天誠信:公司曾在互動平台表示目前在區塊鏈技術有一定的技術儲備和研究。公司未來將積極參與數字貨幣及其他區塊鏈技術產業。
    贏時勝:4月11日在投資者關系互動平台上表示,公司目前有這方面的技術儲備,但處初始階段。
    從目前情況看,我國上市公司區塊鏈技術應用絕大多數還停留在研究階段,項目落地與推廣應用尚有待時間檢驗。

    8. 自學區塊鏈(六)BTC-挖礦難度

    我們來看下挖礦的計算公式

    H(block header) target,這個target就是 目標閾值

    BTC用的哈希演算法是SHA-256,它產生的哈希值是256位,那麼就有2^256種取值,這個就是他的輸出空間,要增大挖礦難度, 就調節目標值在這個輸出空間所佔的比例 。

    挖礦難度和目標閾值是成反比的, 當算力強時,調節難度,使目標閾值變小 。

    不調節難度,隨著礦工數量增多,隨著算力的上升,那麼挖到區塊的時間就會變短,從10分鍾縮短到1分鍾甚至幾秒鍾,這個會帶來什麼樣的問題呢?可能很多人覺得這不是挺好嗎,交易等六個確認就會縮短時間了,交易就會變快了。其實出塊時間縮到很短,風險是很大的,因為網路延遲,出塊時間變短,不同節點很可能接到不同的區塊信息,導致會有很多分叉節點出現。礦工會根據自己認為正確的區塊接著挖。這種情況下,惡意節點發動分叉攻擊就比較容易成功,因為誠實節點的算力被分散了。

    導致不需要51%的算力就能成功,所以縮短出塊時間是不利於BTC系統的穩定的。雖然10分鍾不一定是最優的時間,但是也算是比較合理的。

    下面是 算力增長曲線

    下面是 挖礦難度曲線

    下面是 平均出礦時間

    我們來看下難度公式:每2016個區塊調整一次挖礦難度,10分鍾出一個平均算下來是兩星期調整一次。

    previous_difficulty是上一次的挖礦難度,分母是最近2016個區塊花費的時間

    每個節點挖礦是獨立的,BTC的協議也是開源的,會不會有礦工不修改挖礦難度呢?可能性是存在的,但是不影響結果,因為廣播給其他節點需要獨立驗證block header的哈希值, 這個header裡面有難度的一個壓縮編碼,修改難度產生的結果是不會被誠實的節點認可的。

    9. 三. 區塊鏈系統的核心之一-分布式共識機制

            拜占庭將軍問題(Byzantine Generals Problem),是由萊斯利·蘭波特在其同名論文中提出的分布式對等網路通信容錯問題。

            在分布式計算中,不同的計算機通過通訊交換信息達成共識而按照同一套協作策略行動。但有時候,系統中的成員計算機可能出錯而發送錯誤的信息,用於傳遞信息的通訊網路也可能導致信息損壞,使得網路中不同的成員關於全體協作的策略得出不同結論,從而破壞系統一致性。這個難題被稱為「拜占庭容錯」,或者「兩軍問題」。

            拜占庭假設是對現實世界的模型化。拜占庭將軍問題被認為是容錯性問題中最難的問題類型之一。拜占庭容錯協議要求能夠解決由於硬體錯誤、網路擁塞或斷開以及遭到惡意攻擊,其他計算機和網路可能出現不可預料的行為而帶來的各種問題。並且拜占庭容錯協議還要滿足所要解決的問題要求的規范。

            在拜占庭時代有一個牆高壁厚的城邦——拜占庭,高牆之內存放在世人無法想像多的財富。拜占庭被其他10個城邦所環繞,這10個城邦也很富饒,但和拜占庭相比就有天壤之別了。

            拜占庭的十個鄰居都覬覦它的財富,並希望侵略並佔領它。但是,拜占庭的防禦非常強大,任何單個城邦的入侵行動都會失敗,而入侵者的軍隊也會被殲滅,使得該城邦自身遭到其他互相覬覦對方的九個城邦的入侵和劫掠。

            拜占庭的防禦很強,十個城邦中要有一半以上同時進攻才能攻破它。也就是說,如果有六個或者以上的相鄰城邦一起進攻,他們就會成功並獲得拜占庭的財富。然而,如果其中有一個或者更多城邦背叛了其他城邦,答應一起入侵但在其他城邦進攻的時候又不幹了,也就導致只有五支或者更少的城邦的軍隊在同時進攻,那麼所有的進攻城邦的軍隊都會被殲滅,並隨後被其他的(包括背叛他們的那(幾)個)城邦所入侵和劫掠。

            這是一個由許多不互相信任的城邦構成的一個網路。城邦們必須一起努力以完成共同的使命。而且,各個城邦之間通訊和協調的唯一途徑是通過信使騎馬在城邦之間傳遞信息。城邦的決策者們無法聚集在一個地方開個會(所有的城邦的決策者都不互相信任自己的安全會在自己的城堡或者軍隊范圍之外能夠得到保障)。

            城邦的決策者可以在任意時間以任意頻率派出任意數量的信使到任意的對方。每條信息都包含如下的內容:「我城邦將在某一天的某個時間發動進攻,你城邦願意加入嗎?」。如果收信城邦同意了,該城邦就會在原信上附上一份簽名了的或蓋了圖章的(以就是驗證了的)回應然送回發信城邦。然後,再把新合並了的信息的拷貝一一發送給其他八個城邦,要求他們也如此這樣做。最後的目標是,通過在原始信息鏈上蓋上他們所有十個城邦的決策者的圖章,讓他們在時間上達成共識。最後的結果是,會有一個蓋有十個同意同一時間發動進攻的圖章信息包,和一些被拋棄了的包含部分但不是全部圖章的信息包。

            在這個過程中首先出現了第一個問題,就是如果每個城邦向其他九個城邦派出一名信使,那麼就是十個城邦每個派出了九名信使,也就是在任何一個時間又總計90次的傳輸,並且每個城市分別收到九個信息,可能每一封都寫著不同的進攻時間。

            在這個過程中還有第二個問題,就是部分城邦會答應超過一個的攻擊時間,故意背叛進攻發起人,所以他們將重新廣播超過一條(甚至許許多多條)的信息包,由此產生許多甚至無數的足以淹沒一切的雜音。

            有了以上兩個問題,整個網路系統可能迅速變質,並演變成不可信的信息和攻擊時間相互矛盾的糾結體。

             拜占庭假設是對現實網路世界的一種模型化。在現實網路世界中由於硬體錯誤、網路擁塞或斷開以及遭到惡意攻擊,網路可能出現許許多多不可預料的行為。拜占庭容錯協議必須處理這些失效,並且還要使這些協議滿足所要解決的問題所要求的規范。

            對於拜占庭將軍問題中本聰的區塊鏈給出了比較圓滿的解決方案。也就是比較圓滿的解決了上述的兩個問題。

            拜占庭將軍問題的第一個問題從本質上來講就是時間和空間的障礙導致信息的不準確和不及時。

            區塊鏈對於第一個問題的解決方案是利用分布式存儲技術和比特流技術(BT技術,一種新型的點對點傳輸技術,具有節點同時作為客戶端和伺服器端和沒有中心伺服器等特點),將整個網路系統內的所有交易信息匯總為一個統一的,分布式存儲的,近乎實時同步更新的電子總賬。統一的分布式共同賬本就解決了空間障礙問題;而近乎同步進行的,實時的,持續的對所有賬本備份的更新、對賬則解決了時間障礙問題。

            這個過程較具體一點的描述大概是將區塊鏈系統內所有的交易活動的記錄數據統一於一種標准化的總帳上;區塊鏈系統的每一個節點都會保存一份總帳的備份;所有總帳的備份都是在實時的,持續的更新、對賬、以及同步著。區塊鏈系統的每一個節點能在這本總帳里記上添加記錄;每一筆新添加的記錄都會實時的廣播到區塊鏈系統內;所以在每一個節點上的每一份總帳的備份都是幾乎同時更新的,並且所有的總帳的備份保持著同步。

            拜占庭將軍問題的第二個問題從本質上來講就是關於信息過量問題和信息干擾問題。信息過量和信息干擾問題導致決策延遲,甚至決策系統崩潰而無法決策。

            區塊鏈對於第二個問題的解決方案是區塊鏈系統的任何一個節點在發送每一筆新添加的記錄時需要附帶一條額外的信息。對區塊鏈系統的任何一個節點來說這條額外的信息的獲得都是有成本的,並且只能有一個節點可以獲得。這樣就解決了區塊鏈系統的任何一個節點新添加額外信息時的信息多且亂而無法達成一致的問題。在這里,區塊鏈系統的任何一個節點獲得那條附帶的額外的信息的過程就是著名的工作量證明機制。

            共識機制主要解決區塊鏈系統的數據如何記錄和如何保存的問題。工作量證明機制就是要求區塊鏈系統的節點通過做一定難度的工作得出一個結果的過程。

            區塊鏈系統中某節點生成了一筆新的交易記錄,並且該節點將這筆新的交易記錄向全網廣播。全網各個節點收到這個交易記錄並與其他所有準備打包進區塊的交易記錄共同組成交易記錄列表。在列表內先對所有交易進行兩兩的哈希計算;再對以獲得的哈希值進行哈希計算獲得Merkle樹和Merkle樹的根值;把Merkle樹的根值及其他相關欄位組裝成區塊頭。

            各個節點將區塊頭的80位元組數據加上一個不停的變更的區塊頭隨機數一起進行不停的哈希運算(實際上這是一個雙重哈希運算);不停的將哈希運算結果值與當前網路的目標值做對比,直到哈希運算結果值小於目標值,就獲得了符合要求的哈希值,工作量證明也就完成了。

             分布式的區塊鏈系統是一個動態變化的系統(硬體的運算速度的增長,節點參與網路的程度的變化)。系統的不斷變化必然帶來系統的算力的不斷變化。而算力的變化又會導致通過消耗算力(工作)來獲得符合要求的哈希值的速度的不同。最終的結果會是區塊鏈的增長速度會有巨大的不同。這是一個很大的問題。為了解決這個問題,區塊鏈系統自動根據算力的變化對工作難度進行調整。也就是採用移動平均目標的方法來確定,難度控制為每小時生成區塊的速度為某一個預定的平均數。

            在區塊鏈系統中一個符合要求的哈希值是由N個前導零構成,零的個數取決於網路的難度值。為了使區塊的形成時間控制在大約十分鍾左右,區塊鏈系統採用了固定工作難度的難度演算法。難度值每2016個區塊調整一次零的個數。

            新的難度值是根據前2015個區塊(理論上應該是2016個區塊,由於當初程序編寫時的失誤造成了用2015而不是2016)的出塊時間來計算。

            難度 = 目標值 * 前2015個區塊生成所用的時間 / 1209600 (兩周的秒鍾數)

            這樣通過規定的演算法,區塊鏈系統就保證所有節點計算出的難度值都一致,區塊的形成時間大約一致在十分鍾左右。

          (1)結果不可控制。其依賴機器進行哈希函數的運算來獲得結果;計算結果是一個隨機數;沒有人能直接控制計算的結果。

          (2)計算具有對稱性。就是結果的獲得和結果的驗收需要的工作量是不同的。計算出結果所需要的工作量遠遠大於驗收結果所需要的工作量。

          (3)計算的難度自動控制。為了使區塊的形成時間控制在大約十分鍾左右,區塊鏈系統自動控制了每一個符合要求的哈希獲得為大約在十分鍾左右。

             第一,方法簡單易行。

            第二,系統達成共識容易,節點間不需要太多的信息交換。

            第三,系統比較牢固可靠,任何破壞系統的企圖都需要投入大到得不償失的成本。

            第一,消耗大量的算力,也就是浪費能源和其他資源。

            第二,區塊的確認時間比較長,並且難以縮短。

            第三,新創立的區塊鏈非常容易受到算力攻擊。

            第四,容易產生區塊鏈分叉,穩定的區塊鏈需要多個確認,並且這種狀況可能不斷持續下去。

            第五,算力的逐漸集中導致與去中心化的系統設計基礎的沖突日益明顯。

            權益證明機制是一種工作量證明機制的替代方法,試圖解決工作量計算浪費的問題.目前其成功的應用是點點幣區塊鏈系統。

            權益證明不要求區塊鏈系統的節點完成一定數量的計算工作,而是要求區塊鏈系統的節點對某些數量的錢展示所有權。

            權益證明機制首先應用於點點幣區塊鏈系統中。

            點點幣區塊鏈系統的區塊生成時,節點需要構造一個「錢幣權益」交易,即把自己的一些錢幣和預先設定的獎勵發給自己。進行哈希計算時,哈希值的計算只同交易輸入、一些附加的固定數據以及當前時間(是一個表示自1970年1月1日距離當前時刻的秒數的正數)有關。然後,根據類似工作量證明的要求來檢查這個哈希值是否正確。

            點點幣區塊鏈系統的權益證明機制除了設定了哈希計算難度與交易輸入的「幣齡」成反比外,其與工作量證明機制非常類似。其中,幣齡的定義為交易輸入大小和它存在時間的乘積。權益證明機制中哈希值只和時間和固定的數據有關,因而沒有辦法通過多完成工作來快速獲取它。

           每個點點幣區塊鏈系統的交易的輸出都有一定的幾率來產生有效的正比於幣齡和交易貨幣數量的工作。

            第一,縮短了共識達成的時間。

            第二,不再需要大量消耗能源。

            第一,還是需要哈希計算。

            第二,所有的確認都只是一個概率上的表達,而不是一個確定性的事情,有可能受到其他攻擊影響。

            授權股份證明機制類似於權益證明機制,是比特股BitShares採用的區塊鏈公識演算法。授權股份證明機制是民主選舉和輪流執政相結合方式來確定區塊的產生。

            授權股份證明機制是先由節點選舉若干代理人,由代理人驗證和記賬。其他方面和權益證明機制相似。

            每個節點按其持股比例擁有相應的影響力,51%節點投票的結果將是不可逆且有約束力的。為達到及時而高效的方法達到51%批準的目標。每個節點可以將其投票權授予一名節點。獲票數最多的前100位節點按既定時間表輪流產生區塊。每名節點分配到一個時間段來生產區塊。

            所有的節點將收到等同於一個平均水平的區塊所含交易費的10%作為報酬。

             第一,大幅縮小參與驗證和記賬節點的數量,

             第二,可以快速實現共識驗證。

             主要缺點就是仍然無法擺脫對代幣的依賴。

            在分布式計算上,不同的計算機透過訊息交換,嘗試達成共識;但有時候,系統上協調計算或成員計算機可能因系統錯誤並交換錯的訊息,導致影響最終的系統一致性。

            拜占庭將軍問題就根據錯誤計算機的數量,尋找可能的解決辦法,這無法找到一個絕對的答案,但只可以用來驗證一個機制的有效程度。

            而拜占庭問題的可能解決方法為:

            在 N ≥ 3F + 1 的情況下一致性是可能解決。其中,N為計算機總數,F為有問題計算機總數。信息在計算機間互相交換後,各計算機列出所有得到的信息,以大多數的結果作為解決辦法。

             第一,系統運轉可以擺脫對代幣的依賴,共識各節點由業務的參與方或者監管方組成,安全性與穩定性由業務相關方保證。

             第二,共識的時延大約在2到5秒鍾。

             第三,共識效率高,可滿足高頻交易量的需求。

             第一,當有1/3或以上記賬人停止工作後,系統將無法提供服務;

             第二,當有1/3或以上記賬人聯合作惡,可能系統會出現會留下密碼學證據的分叉。

            小蟻改良了實用拜占庭容錯機制。該機制是由權益來選出記賬人,然後記賬人之間通過拜占庭容錯演算法來達成共識。

            此演算法在PBFT基礎上進行了以下改進:

            第一,將C/S架構的請求響應模式,改進為適合P2P網路的對等節點模式;

            第二,將靜態的共識參與節點改進為可動態進入、退出的動態共識參與節點;

            第三,為共識參與節點的產生設計了一套基於持有權益比例的投票機制,通過投票決定共識參與節點(記賬節點);

            第四,在區塊鏈中引入數字證書,解決了投票中對記賬節點真實身份的認證問題。

            第一,專業化的記賬人;

            第二,可以容忍任何類型的錯誤;

            第三,記賬由多人協同完成,每一個區塊都有最終性,不會分產生區塊鏈分叉;

            第四,演算法的可靠性有嚴格的數學證明來保證;

            第一,當有1/3或以上記賬人停止工作後,區塊鏈系統將無法提供服務;

            第二,當有1/3或以上記賬人聯合作惡,且其它所有的記賬人被恰好分割為兩個網路孤島時,惡意記賬人可以使區塊鏈系統出現分叉,但是會留下密碼學證據;

             瑞波共識機制是全體節點選取出特殊節點組成特殊節點列表,由特殊節點列表內的節點達成共識。

             初始特殊節點列表就像一個俱樂部,要接納一個新成員,必須由51%的該俱樂部會員投票通過。共識遵循這核心成員的51%權力,外部人員則沒有影響力。波共識機制將股東們與其投票權隔開,並因此比其他系統更中心化。

            瑞波共識機制參與共識形成的只有特殊節點,大大的減少了共識形成的時間。在實踐中,瑞波區塊鏈系統達成共識需要3-6秒鍾,遠遠快於比特幣區塊鏈系統的10分鍾。同時瑞波區塊鏈系統對並發交易的處理達到每秒數萬筆,而比特幣區塊鏈系統只有每秒7筆。

    瑞波共識機制處理節點意見分歧的方式也是不同的。瑞波的信任節點對於新區塊的創造進行協商的時間是區塊鏈更新前。先協商,達成共識後再對區塊鏈進行更新。

    由於瑞波共識機制的共識是由特殊節點達成的,普通節點並不需要維護一個完整的歷史賬本。各個節點可以根據自己的業務需要選擇同步同步完整的歷史賬本或者任意最近幾步的賬本。這也意味著對存儲空間和網路流量需求的減少。

    瑞波共識機製取消了挖坑的發行貨幣機制,採用了原生貨幣(1000億枚)的方式發幣,從而大量的避免了挖礦的天量能耗。

    10. 常見的共識演算法介紹

    在非同步系統中,需要主機之間進行狀態復制,以保證每個主機達成一致的狀態共識。而在非同步系統中,主機之間可能出現故障,因此需要在默認不可靠的非同步網路中定義容錯協議,以確保各個主機達到安全可靠的狀態共識。

    共識演算法其實就是一組規則,設置一組條件,篩選出具有代表性的節點。在區塊鏈系統中,存在很多這樣的篩選方案,如在公有鏈中的POW、Pos、DPOS等,而在不需要貨幣體系的許可鏈或私有鏈中,絕對信任的節點、高效的需求是公有鏈共識演算法不能提供的,對於這樣的區塊鏈,傳統的一致性共識演算法成為首選,如PBFT、PAXOS、RAFT等。

    目錄

    一、BFT(拜占庭容錯技術)

    二、PBFT(實用拜占庭容錯演算法)

    三、PAXOS

    四、Raft

    五、POW(工作量證明)

    六、POS(權益證明)

    七、DPOS(委任權益證明)

    八、Ripple

    拜占庭弄錯技術是一類分布式計算領域的容錯技術。拜占庭假設是由於硬體錯誤、網路擁塞或中斷以及遭到惡意攻擊的原因,計算機和網路出現不可預測的行為。拜占庭容錯用來處理這種異常行為,並滿足所要解決問題的規范。

    拜占庭容錯系統是一個擁有n台節點的系統,整個系統對於每一個請求,滿足以下條件:

    1)所有非拜占庭節點使用相同的輸入信息,產生同樣的結果;

    2)如果輸入的信息正確,那麼所有非拜占庭節點必須接收這個信息,並計算相應的結果。

    拜占庭系統普遍採用的假設條件包括:

    1)拜占庭節點的行為可以是任意的,拜占庭節點之間可以共謀;

    2)節點之間的錯誤是不相關的;

    3)節點之間通過非同步網路連接,網路中的消息可能丟失、亂序並延時到達,但大部分協議假設消息在有限的時間里能傳達到目的地;

    4)伺服器之間傳遞的信息,第三方可以嗅探到,但是不能篡改、偽造信息的內容和驗證信息的完整性。

    拜占庭容錯由於其理論上的可行性而缺乏實用性,另外還需要額外的時鍾同步機制支持,演算法的復雜度也是隨節點的增加而指數級增加。

    實用拜占庭容錯降低了拜占庭協議的運行復雜度,從指數級別降低到多項式級別。

    PBFT是一種狀態機副本復制演算法,即服務作為狀態機進行建模,狀態機在分布式系統的不同節點進行副本復制。PBFT要求共同維護一個狀態。需要運行三類基本協議,包括一致性協議、檢查點協議和視圖更換協議。

    一致性協議。一致性協議至少包含若干個階段:請求(request)、序號分配(pre-prepare)和響應(reply),可能包含相互交互(prepare),序號確認(commit)等階段。

    PBFT通信模式中,每個客戶端的請求需要經過5個階段。由於客戶端不能從伺服器端獲得任何伺服器運行狀態的信息,PBFT中主節點是否發生錯誤只能由伺服器監測。如果伺服器在一段時間內都不能完成客戶端的請求,則會觸發視圖更換協議。

    整個協議的基本過程如下:

    1)客戶端發送請求,激活主節點的服務操作。

    2)當主節點接收請求後,啟動三階段的協議以向各從節點廣播請求。

    [2.1]序號分配階段,主節點給請求賦值一個序列號n,廣播序號分配消息和客戶端的請求消息m,並將構造PRE-PREPARE消息給各從節點;

    [2.2]交互階段,從節點接收PRE-PREPARE消息,向其他服務節點廣播PREPARE消息;

    [2.3]序號確認階段,各節點對視圖內的請求和次序進行驗證後,廣播COMMIT消息,執行收到的客戶端的請求並給客戶端以響應。

    3)客戶端等待來自不同節點的響應,若有m+1個響應相同,則該響應即為運算的結果。

    PBFT一般適合有對強一致性有要求的私有鏈和聯盟鏈,例如,在IBM主導的區塊鏈超級賬本項目中,PBFT是一個可選的共識協議。在Hyperledger的Fabric項目中,共識模塊被設計成可插拔的模塊,支持像PBFT、Raft等共識演算法。

    在有些分布式場景下,其假設條件不需要考慮拜占庭故障,而只是處理一般的死機故障。在這種情況下,採用Paxos等協議會更加高效。。PAXOS是一種基於消息傳遞且具有高度容錯特性的一致性演算法。

    PAXOS中有三類角色Proposer、Acceptor及Learner,主要交互過程在Proposer和Acceptor之間。演算法流程分為兩個階段:

    phase 1

    a) proposer向網路內超過半數的acceptor發送prepare消息

    b) acceptor正常情況下回復promise消息

    phase 2

    a) 在有足夠多acceptor回復promise消息時,proposer發送accept消息

    b) 正常情況下acceptor回復accepted消息

    流程圖如圖所示:

    PAXOS協議用於微信PaxosStore中,每分鍾調用Paxos協議過程數十億次量級。

    Paxos是Lamport設計的保持分布式系統一致性的協議。但由於Paxos非常復雜,比較難以理解,因此後來出現了各種不同的實現和變種。Raft是由Stanford提出的一種更易理解的一致性演算法,意在取代目前廣為使用的Paxos演算法。

    Raft最初是一個用於管理復制日誌的共識演算法,它是在非拜占庭故障下達成共識的強一致協議。Raft實現共識過程如下:首先選舉一個leader,leader從客戶端接收記賬請求、完成記賬操作、生成區塊,並復制到其他記賬節點。leader有完全的管理記賬權利,例如,leader能夠決定是否接受新的交易記錄項而無需考慮其他的記賬節點,leader可能失效或與其他節點失去聯系,這時,重新選出新的leader。

    在Raft中,每個節點會處於以下三種狀態中的一種:

    (1)follower:所有結點都以follower的狀態開始。如果沒收到leader消息則會變成candidate狀態;

    (2)candidate:會向其他結點「拉選票」,如果得到大部分的票則成為leader。這個過程就叫做Leader選舉(Leader Election);

    (3)leader:所有對系統的修改都會先經過leader。每個修改都會寫一條日誌(log entry)。leader收到修改請求後的過程如下:此過程叫做日誌復制(Log Replication)

    1)復制日誌到所有follower結點

    2)大部分結點響應時才提交日誌

    3)通知所有follower結點日誌已提交

    4)所有follower也提交日誌

    5)現在整個系統處於一致的狀態

    Raft階段主要分為兩個,首先是leader選舉過程,然後在選舉出來的leader基礎上進行正常操作,比如日誌復制、記賬等。

    (1)leader選舉

    當follower在選舉時間內未收到leader的消息,則轉換為candidate狀態。在Raft系統中:

    1)任何一個伺服器都可以成為候選者candidate,只要它向其他伺服器follower發出選舉自己的請求。

    2)如果其他伺服器同意了,發出OK。如果在這個過程中,有一個follower宕機,沒有收到請求選舉的要求,此時候選者可以自己選自己,只要達到N/2+1的大多數票,候選人還是可以成為leader的。

    3)這樣這個候選者就成為了leader領導人,它可以向選民也就是follower發出指令,比如進行記賬。

    4)以後通過心跳消息進行記賬的通知。

    5)一旦這個leader崩潰了,那麼follower中有一個成為候選者,並發出邀票選舉。

    6)follower同意後,其成為leader,繼續承擔記賬等指導工作。

    (2)日誌復制

    記賬步驟如下所示:

    1)假設leader已經選出,這時客戶端發出增加一個日誌的要求;

    2)leader要求follower遵從他的指令,將這個新的日誌內容追加到各自日誌中;

    3)大多數follower伺服器將交易記錄寫入賬本後,確認追加成功,發出確認成功信息;

    4)在下一個心跳消息中,leader會通知所有follower更新確認的項目。

    對於每個新的交易記錄,重復上述過程。

    在這一過程中,若發生網路通信故障,使得leader不能訪問大多數follower了,那麼leader只能正常更新它能訪問的那些follower伺服器。而大多數的伺服器follower因為沒有了leader,他們將重新選舉一個候選者作為leader,然後這個leader作為代表與外界打交道,如果外界要求其添加新的交易記錄,這個新的leader就按上述步驟通知大多數follower。當網路通信恢復,原先的leader就變成follower,在失聯階段,這個老leader的任何更新都不能算確認,必須全部回滾,接收新的leader的新的更新。

    在去中心賬本系統中,每個加入這個系統的節點都要保存一份完整的賬本,但每個節點卻不能同時記賬,因為節點處於不同的環境,接收不同的信息,如果同時記賬,必然導致賬本的不一致。因此通過同時來決定那個節點擁有記賬權。

    在比特幣系統中,大約每10分鍾進行一輪算力競賽,競賽的勝利者,就獲得一次記賬的權力,並向其他節點同步新增賬本信息。

    PoW系統的主要特徵是計算的不對稱性。工作端要做一定難度的工作才能得出一個結果,而驗證方卻很容易通過結果來檢查工作端是不是做了相應的工作。該工作量的要求是,在某個字元串後面連接一個稱為nonce的整數值串,對連接後的字元串進行SHA256哈希運算,如果得到的哈希結果(以十六進制的形式表示)是以若干個0開頭的,則驗證通過。

    比特幣網路中任何一個節點,如果想生成一個新的區塊並寫入區塊鏈,必須解出比特幣網路出的PoW問題。關鍵的3個要素是 工作量證明函數、區塊及難度值 。工作量證明函數是這道題的計算方法,區塊決定了這道題的輸入數據,難度值決定了這道題所需要的計算量。

    (1)工作量證明函數就是<u style="box-sizing: border-box;"> SHA256 </u>

    比特幣的區塊由區塊頭及該區塊所包含的交易列表組成。擁有80位元組固定長度的區塊頭,就是用於比特幣工作量證明的輸入字元串。

    (2)難度的調整是在每個完整節點中獨立自動發生的。每2016個區塊,所有節點都會按統一的公式自動調整難度。如果區塊產生的速率比10分鍾快則增加難度,比10分鍾慢則降低難度。

    公式可以總結為:新難度值=舊難度值×(過去2016個區塊花費時長/20160分鍾)

    工作量證明需要有一個目標值。比特幣工作量證明的目標值(Target)的計算公式:目標值=最大目標值/難度值

    其中最大目標值為一個恆定值:

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

    (3)PoW能否解決拜占庭將軍問題

    比特幣的PoW共識演算法是一種概率性的拜占庭協議(Probabilistic BA)

    當不誠實的算力小於網路總算力的50%時,同時挖礦難度比較高(在大約10分鍾出一個區塊情況下)比特幣網路達到一致性的概念會隨確認區塊的數目增多而呈指數型增加。但當不誠實算力具一定規模,甚至不用接近50%的時候,比特幣的共識演算法並不能保證正確性,也就是,不能保證大多數的區塊由誠實節點來提供。

    比特幣的共識演算法不適合於私有鏈和聯盟鏈。其原因首先是它是一個最終一致性共識演算法,不是一個強一致性共識演算法。第二個原因是其共識效率低。

    擴展知識: 一致性

    嚴格一致性,是在系統不發生任何故障,而且所有節點之間的通信無需任何時間這種理想的條件下,才能達到。這個時候整個系統就等價於一台機器了。在現實中,是不可能達到的。

    強一致性,當分布式系統中更新操作完成之後,任何多個進程或線程,訪問系統都會獲得最新的值。

    弱一致性,是指系統並不保證後續進程或線程的訪問都會返回最新的更新的值。系統在數據成功寫入之後,不承諾立即可以讀到最新寫入的值,也不會具體承諾多久讀到。但是會盡可能保證在某個時間級別(秒級)之後。可以讓數據達到一致性狀態。

    最終一致性是弱一致性的特定形式。系統保證在沒有後續更新的前提下,系統最終返回上一次更新操作的值。也就是說,如果經過一段時間後要求能訪問到更新後的數據,則是最終一致性。

    在股權證明PoS模式下,有一個名詞叫幣齡,每個幣每天產生1幣齡,比如你持有100個幣,總共持有了30天,那麼,此時你的幣齡就為3000,這個時候,如果你發現了一個PoS區塊,你的幣齡就會被清空為0。你每被清空365幣齡,你將會從區塊中獲得0.05個幣的利息(假定利息可理解為年利率5%),那麼在這個案例中,利息 = 3000 * 5% / 365 = 0.41個幣,這下就很有意思了,持幣有利息。

    點點幣(Peercoin)是首先採用權益證明的貨幣。,點點幣的權益證明機制結合了隨機化與幣齡的概念,未使用至少30天的幣可以參與競爭下一區塊,越久和越大的幣集有更大的可能去簽名下一區塊。一旦幣的權益被用於簽名一個區塊,則幣齡將清為零,這樣必須等待至少30日才能簽署另一區塊。

    PoS機制雖然考慮到了PoW的不足,但依據權益結余來選擇,會導致首富賬戶的權力更大,有可能支配記賬權。股份授權證明機制(Delegated Proof of Stake,DPoS)的出現正是基於解決PoW機制和PoS機制的這類不足。

    比特股(Bitshare)是一類採用DPoS機制的密碼貨幣。它的原理是,讓每一個持有比特股的人進行投票,由此產生101位代表 , 我們可以將其理解為101個超級節點或者礦池,而這101個超級節點彼此的權利是完全相等的。如果代表不能履行他們的職責(當輪到他們時,沒能生成區塊),他們會被除名,網路會選出新的超級節點來取代他們。

    比特股引入了見證人這個概念,見證人可以生成區塊,每一個持有比特股的人都可以投票選舉見證人。得到總同意票數中的前N個(N通常定義為101)候選者可以當選為見證人,當選見證人的個數(N)需滿足:至少一半的參與投票者相信N已經充分地去中心化。

    見證人的候選名單每個維護周期(1天)更新一次。見證人然後隨機排列,每個見證人按序有2秒的許可權時間生成區塊,若見證人在給定的時間片不能生成區塊,區塊生成許可權交給下一個時間片對應的見證人。

    比特股還設計了另外一類競選,代表競選。選出的代表擁有提出改變網路參數的特權,包括交易費用、區塊大小、見證人費用和區塊區間。若大多數代表同意所提出的改變,持股人有兩周的審查期,這期間可以罷免代表並廢止所提出的改變。這一設計確保代表技術上沒有直接修改參數的權利以及所有的網路參數的改變最終需得到持股人的同意。

    Ripple(瑞波)是一種基於互聯網的開源支付協議,在Ripple的網路中,交易由客戶端(應用)發起,經過追蹤節點(tracking node)或驗證節點(validating node)把交易廣播到整個網路中。

    追蹤節點的主要功能是分發交易信息以及響應客戶端的賬本請求。驗證節點除包含追蹤節點的所有功能外,還能夠通過共識協議,在賬本中增加新的賬本實例數據。

    Ripple的共識達成發生在驗證節點之間,每個驗證節點都預先配置了一份可信任節點名單,稱為UNL(Unique Node List)。在名單上的節點可對交易達成進行投票。每隔幾秒,Ripple網路將進行如下共識過程:

    1)每個驗證節點會不斷收到從網路發送過來的交易,通過與本地賬本數據驗證後,不合法的交易直接丟棄,合法的交易將匯總成交易候選集(candidate set)。交易候選集裡面還包括之前共識過程無法確認而遺留下來的交易。

    2)每個驗證節點把自己的交易候選集作為提案發送給其他驗證節點。

    3)驗證節點在收到其他節點發來的提案後,如果不是來自UNL上的節點,則忽略該提案;如果是來自UNL上的節點,就會對比提案中的交易和本地的交易候選集,如果有相同的交易,該交易就獲得一票。在一定時間內,當交易獲得超過50%的票數時,則該交易進入下一輪。沒有超過50%的交易,將留待下一次共識過程去確認。

    4)驗證節點把超過50%票數的交易作為提案發給其他節點,同時提高所需票數的閾值到60%,重復步驟3)、步驟4),直到閾值達到80%。

    5)驗證節點把經過80%UNL節點確認的交易正式寫入本地的賬本數據中,稱為最後關閉賬本(Last Closed Ledger),即賬本最後(最新)的狀態。

    在Ripple的共識演算法中,參與投票節點的身份是事先知道的。該共識演算法只適合於許可權鏈(Permissioned chain)的場景。Ripple共識演算法的拜占庭容錯(BFT)能力為(n-1)/5,即可以容忍整個網路中20%的節點出現拜占庭錯誤而不影響正確的共識。

    在區塊鏈網路中,由於應用場景的不同,所設計的目標各異,不同的區塊鏈系統採用了不同的共識演算法。一般來說,在私有鏈和聯盟鏈情況下,對一致性、正確性有很強的要求。一般來說要採用強一致性的共識演算法。而在公有鏈情況下,對一致性和正確性通常沒法做到百分之百,通常採用最終一致性(Eventual Consistency)的共識演算法。

    共識演算法的選擇與應用場景高度相關,可信環境使用paxos 或者raft,帶許可的聯盟可使用pbft ,非許可鏈可以是pow,pos,ripple共識等,根據對手方信任度分級,自由選擇共識機制。

    熱點內容
    usdt未來價值 發布:2025-06-29 05:21:47 瀏覽:269
    物聯鏈送以太坊 發布:2025-06-29 05:21:39 瀏覽:932
    移動手機卡合約提前注銷會怎麼樣 發布:2025-06-29 05:20:19 瀏覽:50
    去人才服務中心蓋就業協議 發布:2025-06-29 05:12:54 瀏覽:792
    別人發的區塊鏈密碼我怎麼用 發布:2025-06-29 05:08:10 瀏覽:408
    鏈克以太坊 發布:2025-06-29 04:32:39 瀏覽:619
    線下交易usdt到交易所 發布:2025-06-29 04:26:07 瀏覽:828
    企業做的區塊鏈項目 發布:2025-06-29 04:20:15 瀏覽:702
    圖說區塊鏈田穎信息 發布:2025-06-29 04:03:10 瀏覽:976
    區塊鏈媒體平台有哪些 發布:2025-06-29 04:02:34 瀏覽:105