首頁>技術>

區塊鏈系統採用去中心化的設計,網路節點分散且相互獨立,所以由不同節點組成的系統之間必須依賴一個制度來維護系統的資料一致性,並獎勵提供區塊鏈服務的節點,以及懲罰惡意節點。

這個制度的建立需要依賴一套方法和規則,即由誰取得一個區塊的打包權(或稱記賬權),並獲取該區塊的獎勵或者怎樣界定誰是作惡者,讓他受到怎樣的懲罰,這套方法和規則便是共識機制。

現在有多種共識演算法在區塊鏈中使用,較為常用的有:工作量證明(Proof of Work,PoW)演算法、權益證明(Proof of Stake,PoS)演算法、股份授權證明(Delegated Proof of Stake,DPoS)演算法、實用拜占庭容錯(Practical Byzantine Fault Tolerance,PBFT)演算法。

1 PoW演算法

PoW演算法是一種防止分散式服務資源被濫用、拒絕服務攻擊的機制。

PoW演算法要求節點進行適量消耗時間和資源的複雜運算,並且其運算結果能被其他節點快速驗算,以耗用時間、能源做擔保,以確保服務與資源被真正的需求所使用。比特幣首次利用PoW演算法來驗證交易並向網路廣播區塊,現在很多區塊鏈也採用PoW演算法。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演算法就是採用這種方式讓計算消耗資源,而校驗僅需一次。

2 PoS演算法

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

例如,某個節點擁有整個區塊鏈系統5%的股份,則這個節點在下一個出塊週期裡,將有5%的機率打包出塊。

節點透過PoS演算法出塊的過程

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

3 DPoS演算法

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

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

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

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

4 PBFT演算法

PBFT演算法解決了拜占庭將軍問題。

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

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

1982年,萊利斯·蘭波特(Leslie Lamport)等在論文The Byzantine Generals Problem中證明當將軍總數大於3f,背叛者數為f或者更少時,忠誠的將軍可以達成命令上的一致,即 3f+1≤n,演算法複雜度為O(nf +1)。

米格爾·卡斯特羅(Miguel Castro)和芭芭拉·利斯科夫(Barbara Liskov)在1999年發表論文Practical Byzantine Fault Tolerance提出PBFT演算法。該演算法的容錯數量也滿足3f+1≤n,演算法複雜度為O(n2)。

該演算法能提供高效能的運算,使系統可以每秒處理上千次請求,這比舊系統快了一些。

PBFT演算法的共識過程

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

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 6個步驟上手BeagleBone® Black