區(qū)塊鏈的共識算法,你學會了嗎?
區(qū)塊鏈是一種去中心化、不可篡改、可追溯的分布式數(shù)據(jù)庫系統(tǒng),可確保數(shù)據(jù)安全,并防止未經(jīng)授權的訪問。區(qū)塊鏈技術允許用戶在分布式賬本中添加、查看和驗證交易,并使用共識機制來確保所有交易準確無誤。
在區(qū)塊鏈中,共識機制用于保證網(wǎng)絡上的所有節(jié)點都同意網(wǎng)絡的當前狀態(tài)和交易的真實性,這對于維護區(qū)塊鏈的安全性和完整性至關重要,圖1展示了區(qū)塊鏈共識過程的基礎模型。不同的區(qū)塊鏈平臺使用不同的算法,例如POW、POS或POB等,以在網(wǎng)絡上的節(jié)點之間達成共識。一個好的共識算法可以保持區(qū)塊鏈網(wǎng)絡的活躍,為整個網(wǎng)絡提供源源不斷的有效算力,而設計不佳的算法則可能導致整個網(wǎng)絡在受到攻擊時很容易癱瘓。共識算法可以分為:非拜占庭容錯算法與拜占庭容錯算法,基于DAG和混合算法,在本次報告中主要介紹拜占庭容錯算法。
拜占庭容錯算法(Byzantine Fault Tolerance,BFT)是一類分布式系統(tǒng)中用于處理節(jié)點故障和惡意行為的算法。該算法的目標是確保在存在節(jié)點錯誤或惡意行為的情況下,系統(tǒng)仍能夠達成一致的共識。BFT的概念起源于拜占庭將軍問題,其機制的目的是通過一種集體決策過程來防范系統(tǒng)故障,該過程考慮了正確節(jié)點和故障節(jié)點的輸入,旨在最小化故障節(jié)點的影響。本報告主要介紹了pBFT、POW、POS、POB、POC、POA、DPOS共識算法。
1、Practical Byzantine fault?tolerant (pBFT)
實用拜占庭容錯算法 (pBFT) 是 Barbara Liskov 和 Miguel Castro 在 1999年提出的一種共識算法[1],解決了原始拜占庭容錯算法效率不高的問題,將算法復雜度由指數(shù)級降低到多項式級,使得拜占庭容錯算法在實際系統(tǒng)應用中變得可行。
pBFT可以在保證活性和安全性的前提下提供(n-1)/3的容錯性, 其中 n 為節(jié)點總數(shù),即只要惡意節(jié)點的最大數(shù)量小于或等于系統(tǒng)中所有節(jié)點的三分之一,pBFT 系統(tǒng)就可以正常運行。在啟用 pBFT 的系統(tǒng)中,節(jié)點按順序排序,其中一個節(jié)點為主節(jié)點,其他節(jié)點為輔節(jié)點。主節(jié)點在每次視圖期間都會發(fā)生更改,并且如果經(jīng)過了預定義的時間而沒有主節(jié)點向輔節(jié)點廣播請求,則可以通過視圖更改協(xié)議替換主節(jié)點。
pBFT共識分為五個階段,如圖2所示,其中C為發(fā)送請求端,0123為服務端,3為宕機的服務端,具體步驟如下:
請求階段(request): 請求端C發(fā)送請求到主節(jié)點,這里主節(jié)點是0;
預準備階段(pre-prepare):服務端0收到C的請求后進行廣播,擴散至服務端123;
準備階段(prepare): 服務端123收到后記錄并再次廣播,1->023,2->013,3因為宕機無法廣播;
提交階段(commit): 服務端0123節(jié)點在Prepare階段,若收到超過一定數(shù)量的相同請求,則進入Commit階段,廣播Commit請求;
回復(reply): 0123節(jié)點在Commit階段,若收到超過一定數(shù)量的相同請求,則對C進行反饋。
pBFT首次提出在異步網(wǎng)絡環(huán)境下使用狀態(tài)機副本復制協(xié)議,該算法可以工作在異步環(huán)境中,并且通過優(yōu)化在早期算法的基礎上把響應性能提升了一個數(shù)量級以上。但該算法僅僅適用于permissioned systems 且通信復雜度使得系統(tǒng)性能隨著網(wǎng)絡規(guī)模的增加而下降。
2、Proof ofwork (PoW)
PoW的優(yōu)點是完全去中心化 ,節(jié)點自由進出;只要破壞者算力不超過網(wǎng)絡總算力的50%,交易狀態(tài)就能達成一致。PoW 的缺點是挖礦造成大量資源浪費;礦池算力高度集中;達成共識周期較長(每秒最多7筆交易);還存在自私挖礦攻擊的風險。
3、Proof ofstake (PoS)
PoS 共識算法因其節(jié)能特性而被認為是 PoW 有前途的替代方案。PoS 由系統(tǒng)中具有最高權益而非最高算力的節(jié)點獲得記賬權[3]。相對于PoW中 Nonce 字段的大搜索空間而言, PoS 將搜索空間限制在一個計算量可接受的范圍; 除此外,PoS 中還引入了“幣齡”作為權益,即:
競爭出塊記賬前,擁有權益的節(jié)點將自己的權益放入PoS機制中,同時身份變?yōu)轵炞C者,PoS機制根據(jù)驗證者下注的多少,選出一個記賬者進行出塊記賬。選擇算法綜合使用候選者的股權(持有的加密貨幣數(shù)量)和其他因素(如幣齡和隨機化),以確保網(wǎng)絡上所有節(jié)點之間的公平性。其中一個因素是幣齡,它是候選節(jié)點成為驗證者的時間。節(jié)點擔任驗證者的時間越長,被選為記賬者的機會就越大。另一個因素是隨機塊選擇,其中驗證器是根據(jù)最低哈希值和最高權益的組合來選擇的。具有這些因素的最佳加權組合的節(jié)點成為新的記賬者。如果選出的記賬者在一段時間內(nèi)沒有記賬,PoS機制重新選擇記賬節(jié)點,當出塊完成,開始進入下一輪的記賬。
PoS縮短了共識達成的時間,降低了PoW機制的資源浪費。但是破壞者對網(wǎng)絡攻擊成本低,存在“無利害關系“(Nothing at stake)”攻擊問題,且共識受少數(shù)富裕賬戶支配,缺乏公正性。
4、Proof ofburn (PoB)
在 "燒毀證明"(PoB)中,驗證者通過 "燒毀 "貨幣或?qū)⑵浒l(fā)送到一個永遠無法取回的地址來表示自己愿意為了長期投資而承受短期的損失,以及獲得在某個隨機選擇程序系統(tǒng)上進行挖礦的終生特權[4]。這一過程用于確定哪些驗證者能夠挖掘系統(tǒng)中的下一個區(qū)塊。驗證者可以使用本地社區(qū)的貨幣或比特幣等替代鏈的貨幣,以增加被選中進行區(qū)塊挖掘的機會。礦工燒掉的貨幣越多,被系統(tǒng)選中開采下一個區(qū)塊的機會就越大。隨著新區(qū)塊的挖出,被燒毀幣的能量會略有減少,從而產(chǎn)生一個通縮過程,即貨幣的總量會隨著時間的推移而減少,從而有可能增加其價值。相比之下,數(shù)量隨時間增加的加密貨幣往往會貶值。
PoB更環(huán)保,因為它并不強調(diào)硬件的功率或數(shù)量,貨幣銷毀會永久減少被銷毀的加密貨幣的供應,從而導致稀缺性和資產(chǎn)價值增加。雖然在硬件方面,PoB不需要像Pow那樣多的資源,但它會破壞通過計算創(chuàng)建的硬幣,這也是一種浪費。PoB中,由于銷毀是最終的結果,沒有任何保證可以收回燒毀的貨幣的全部價值,這增加了用戶的風險。
5、Proof ofcapacity (PoC)
容量證明(PoC)是一種新的挖礦方法,目前在加密貨幣 Burstcoin 中使用[5]??臻g容量證明利用的是計算機的硬盤空間大小而不是電腦的計算能力。硬盤的容量越大,可以儲存在硬盤里的方案值就越多,礦工就越有機會匹配到其中所需要的哈希值,從而有更多的機會獲得獎勵。
PoC 通過在計算機上提供更多解決方案或“圖”來增加礦工贏得挖礦競爭的機會。PoC由兩個主要部分組成:繪圖和挖礦
繪圖:礦工使用 Shabal 哈希函數(shù)創(chuàng)建一系列預先計算的哈希值并將其存儲在硬盤上。這個繪圖過程是一次性的,且根據(jù)硬盤的大小,繪制周期也將不同,一般為幾天甚至數(shù)周。哈希值被分組為“scoops”,每個scoop由兩個相鄰的哈希值組成。
挖礦:挖礦需要計算scoop數(shù),并將其應用于存儲在硬盤驅(qū)動器上的每個nonce值,以確定一個 "截止日期 "值。如果在該時間段內(nèi)沒有其他人創(chuàng)建新區(qū)塊,礦工就會選擇截止日期最短的 nonce 并使用它來創(chuàng)建新區(qū)塊。如果礦工在截止日期前創(chuàng)建了區(qū)塊,就會獲得區(qū)塊獎勵。
POC挖礦減少了大量的計算,同時避免了AISC化的礦機出現(xiàn),大大降低了挖礦的門檻和礦工的成本。
6、Proof ofactivity (PoA)
活動證明(PoA)結合了PoW工作量證明與PoS權益證明的特點并進行了相應擴展[6],PoA共識具有更為復雜的記賬節(jié)點選取,同時有更為公平的獎勵機制。通過考慮礦工的利益,網(wǎng)絡可以優(yōu)先考慮那些對網(wǎng)絡建設有長遠利益的礦工,而不僅僅是那些擁有最強大計算資源的礦工。其具體步驟如下:
每個礦工先利用自身算力通過工作量證明機制后得出nonce并生成一個空區(qū)塊頭,這個區(qū)塊頭除了沒有交易信息數(shù)據(jù)外其他數(shù)據(jù)與正常區(qū)塊一致。
最先生成空區(qū)塊的節(jié)點廣播全網(wǎng)節(jié)點,全網(wǎng)節(jié)點接收到消息后,將此區(qū)塊的hash值與上一區(qū)塊的hash值進行拼接,然后加上n個固定后綴值進行再hash,最后得出n個值作為輸入,進入follow-the-satoshi程序,然后可輸出n個隨機權益持有者。擁有大量加密貨幣的礦工被選為簽名者的機會更高。
前n-1個隨機權益持有者對空區(qū)塊進行簽名,第n個隨機權益持有者即為獲取到記賬權的節(jié)點,他將在空區(qū)塊的基礎上添加交易數(shù)據(jù)與簽名。
第n個隨機權益持有者將打包好的區(qū)塊廣播全網(wǎng),全網(wǎng)節(jié)點接收到區(qū)塊后進行驗證,驗證成功后上鏈。
產(chǎn)生空區(qū)塊的礦工與第n個隨機權益持有者以及前n-1個已簽名的隨機權益持有者共享交易費獎勵。
PoA 可以有效地平衡區(qū)塊鏈的安全性和效率,但與純 PoW 或 PoS 系統(tǒng)相比,PoA 的實施可能更復雜,安全性也可能更低。PoA因部分使用PoW和PoS而被詬病,但也防范了51%攻擊的風險。
7、Delegate proof of stake (DPoS)
大幅縮少參與驗證和記賬節(jié)點的數(shù)量,能達到秒級的共識驗證;另外, 區(qū)塊的產(chǎn)生不需要消耗算力, 相對于 PoS 更加節(jié)省能耗。但不合適完全去中心化的場景。
區(qū)塊鏈技術的出現(xiàn)代表了數(shù)字貨幣經(jīng)濟時代的到來。但是區(qū)塊鏈的共識機制仍然還面臨一些挑戰(zhàn),區(qū)塊鏈的共識機制還有可進步之處。只有做到各方面的平衡,通過之后的發(fā)展以及不斷的更迭,才能設計出更加適合實際應用場景的共識機制。