非拜占庭問題,采用帕克斯算法和RUFT算法;
拜占庭問題,采用拜占庭容錯算法,進一步發(fā)展了優(yōu)化PBFT算法。
PBFT算法只適用于似有鏈和聯(lián)盟鏈,公有鏈一般采用POW算法、POS算法和DPOS算法。
一、PBFT算法
PBFT算法指實用拜占庭容錯算法,長期以來拜占庭問題的解決方案過于復雜,缺乏實用性,直到1999年PBFT算法提出,才首次將拜占庭容錯算法的復雜度從指數(shù)級降低到了多項式級,目前已得到了廣泛應用。此算法可以保證背叛節(jié)點數(shù)不超過1/3的情況下,保證信息的傳遞過程無法被篡改和破壞。PBFT算法采用了例如ISA簽名算法、消息驗證編碼和摘要等密碼學技術。
PBFT算法基本過程如下:
首先通過輪換或者隨機算法選出某個節(jié)點為主節(jié)點,此后只要主節(jié)點不切換則稱為一個試圖View,在某個試圖中請求發(fā)送給主節(jié)點,主節(jié)點負責廣播請求到所有其他副本節(jié)點,所有節(jié)點處理完請求將處理結果返回給客戶端,客戶端檢查是否收到了F+1個來自不同節(jié)點的相同結果作為最終結果,這里的F是指網(wǎng)絡中存在拜占庭故障的節(jié)點數(shù)量,F(xiàn)+1個是指正常的節(jié)點數(shù)量,沒有故障的節(jié)點數(shù)量應該要大于網(wǎng)絡中存在拜占庭故障的節(jié)點數(shù)量。
那主節(jié)點的廣播過程包括了三個階段的處理,預處理階段,準備階段和提交階段,預處理和準備階段確保在同一個試圖內(nèi)請求發(fā)送的順序正確,準備和提交階段則確保在不同試圖之間的確認請求是保序的。
首先看預準備階段,主節(jié)點從客戶端收到了請求分配體驗編號,然后發(fā)出預準備消息給各個節(jié)點,給副本節(jié)點,準備階段,副本節(jié)點收到預準備消息后檢查消息合法,如檢查通過則向其他節(jié)點發(fā)送準備消息,帶上自己的ID信息,同時接收來自其他節(jié)點的準備消息,收到準備消息的節(jié)點對消息同樣要進行合法性檢查。
驗證通過,則把這個準備消息寫到消息日志中,集齊了至少2F+1個驗證過的消息才進入到準備狀態(tài)。提交的階段可以廣播提交信息告訴某個節(jié)點提案n在試圖v已經(jīng)處于準備狀態(tài),如果集齊了至少2F+1個驗證過的提交階段提交信息,則說明提案通過。
拜占庭問題之所以難解,在于任何時候系統(tǒng)中都可能存在多個提案,并且完成最終一次性確認過程十分困難,容易受到干擾。
使用拜占庭算法的主要優(yōu)點是:
第一,PBFT算法共識各個節(jié)點由業(yè)務的監(jiān)管方或者參與方構成,安全性與穩(wěn)定性由業(yè)務相關方來保證。
第二個它的共識時延大約在2-5秒,基本達到了商用的實時處理要求,所以它的共識效率比較高,可滿足高頻交易量的需求,PBFT算法的這些優(yōu)點非常適合聯(lián)盟鏈的應用場景,因此成為使用最多的聯(lián)盟鏈共識算法。
PBFT目前也有很多的改進,主要集中在一個修改網(wǎng)絡拓撲的要求,使用的P2P網(wǎng)絡;第二個可以動態(tài)調(diào)整節(jié)點的數(shù)量;第三減少協(xié)議使用的消息數(shù)量,不過PBFT仍然是依靠一個節(jié)點一票,少數(shù)服從多數(shù)的方式來實現(xiàn)拜占庭容錯,對于聯(lián)盟鏈而言,這個前提沒有問題,甚至是優(yōu)點所在,但是在公有鏈中,由于節(jié)點數(shù)目廣大,這樣就會存在很大的問題。
所以我們公有鏈中沒有采用PBFT算法,一般采用的是工作量證明機制POW,權益證明機制POS和股份授權證明機制DPoS,這樣的共識算法來實現(xiàn)一致性。下面對于公有鏈中的共識機制進行介紹。
二、工作量證明機制PoW
PoW是我們最熟知的一種共識機制,它意味著工作越多收益越大,這里的工作是猜測數(shù)值,誰能最快的猜出這個唯一的數(shù)字,誰就能做信息公示,或者信息記賬。這就是經(jīng)常聽到的挖礦。有了這樣一個誰能第一個做出這樣的一道題,我們就有記賬的權力,那這樣的一個工作過程就是尋找nonce隨機數(shù)的過程。
首先對區(qū)塊的交易信息做一個哈希值,這樣就得到一個256位的字符串,我們把256位的字符串命名為A1,在A1的字符串后面加上nonce(隨機數(shù)),這個字符串叫做A2,然后對A2字符串做hash運算得到256位的字符串A3,如果A3的前四位都是0,那么這個隨機數(shù)就找對了,就可以向網(wǎng)絡進行提交,從而如果你是第一個提交,這樣一個nonce隨機數(shù),你就具有了記賬的權力,這就是比如我們來看下面的一個例子。
給定一個基本的字符串“hello world”,工作量的要求是在字符串的后面添加一個叫nonce的整數(shù)值,對變更后的字符串進行SHA256運算,如果得到的哈希結果以16位進制的哈希結果是以0000開頭的則驗證通過,那么你如果是第一個獲得這樣一個nonce隨機數(shù)并且在網(wǎng)絡提交,讓大家驗證通過,則你就具有了記賬的權力。
下面具體看一下PoW協(xié)議的進行過程,開始我們講到的只是挖礦或者工作的一個過程,PoW協(xié)議首先第一個向所有的節(jié)點廣播新的交易,然后每個節(jié)點把收到的交易放到區(qū)塊鏈的塊中,在每一輪中,一個隨機選中的節(jié)點或者按照一定規(guī)則選出來的節(jié)點廣播它所保有的塊,其它節(jié)點在驗證塊中所有的交易正確無誤后接受該區(qū)塊,其它節(jié)點將該區(qū)塊的哈希值放入下一個他們創(chuàng)建的區(qū)塊中,表示他們承認這個區(qū)塊的正確性。
剛才我們說到的這樣的一個工作或者說挖礦就是選出的節(jié)點,挖礦讓算力最快或者最幸運的一個節(jié)點被選中就可以廣播它所保有的或計算的塊,其他的節(jié)點只能驗證正確的,被選中的節(jié)點就具有記賬的權力,他就可以獲得相應的收益。
節(jié)點們總是認為最長的鏈是一個合法的鏈,并且努力去擴大這條鏈,如果兩個節(jié)點同時廣播各自挖出的區(qū)塊,其他節(jié)點以自己最先收到的區(qū)塊為準開始挖礦,但同時會保留另一個區(qū)塊,所以就會出現(xiàn)一些節(jié)點先收到A的區(qū)塊,并在其上開始挖礦,同時保留著B的區(qū)塊防止B的區(qū)塊所在的分支,日后成為較長的分支,直到其中某個分支在下一個工作量證明中變得更長,之前那些在另一條分支上工作的節(jié)點,就會轉向這條更長的鏈,平均每十分鐘有一個節(jié)點找到一個區(qū)塊,如果兩個節(jié)點在同一時間找到區(qū)塊,那么網(wǎng)絡將根據(jù)后續(xù)節(jié)點來決定,確定以哪個區(qū)塊構建總賬,從統(tǒng)計學角度而言,一筆交易六個節(jié)點,也就是約1個小時后,被認為是明確確認且不可逆的,然而核心開發(fā)者認為需要120個區(qū)塊,約1天的時間才能充分保護網(wǎng)絡不受來自潛在更長的新產(chǎn)生的幣被花掉的區(qū)塊鏈的威脅。
那我們的在生物學上有一個原理叫做不利原理,該原理可以幫助我們解釋工作量證明的過程,這個原理中當兩只動物有合作的動機時,他們必須很有說服力的向對方表達善意,為了打消對方的疑慮,他們向對方表達友好時,必須附上自己的代價,使得自己背叛對方時不得不付出昂貴的代價。
換句話說表達方式本身必須是對自己不利的,那么這樣一種不利原則在歷史上會經(jīng)常發(fā)生,比如說在中國的歷史上,國家和國家之間簽訂盟約,為了表示自己對盟約的誠意,經(jīng)常會互相送一個兒子,有時候是送太子即皇位繼承人,去對方國家做人質(zhì),在這種情況下為取得信任付出的代價是君主和兒子的親戚以及十幾年的養(yǎng)育。
比特幣的工作量證明很好的利用了不利原理解決了一個網(wǎng)絡社會里面的問題,產(chǎn)生一個新區(qū)快是建立在耗時耗力的巨大代價上,所以當新區(qū)快誕生后,某個礦工要么忽視它,繼續(xù)自己的新區(qū)快尋找,要么接受它,在該區(qū)塊之后繼續(xù)自己的挖礦。
顯然前者是不明智的,因為在比特幣網(wǎng)絡里,以最長鏈為合法的鏈,這個礦工選擇忽視而另取爐炤,就不得不說服足夠多的其他礦工,沿著他的路線走,相反要是他選擇接受,不僅不會付出額外的辛苦,而且照樣可以繼續(xù)進行自己更新區(qū)塊的一個挖礦,不會再出現(xiàn)你走你的,我走我的,這樣一個情況,這樣就會形成全網(wǎng)的良性建設,比特幣通過不利原理約束了節(jié)點的行為。
PoW的優(yōu)點是完全的去中心化,節(jié)點可以自由的進出,但是依賴機器進行運算來獲取記賬權,資源的消耗相比其他的共識機制要高,可監(jiān)管性弱,同時共識需要全網(wǎng)共同參與運算,性能的效率比較低,容錯性方面可以允許節(jié)點的50%出錯。從目前來看,PoW共識協(xié)議,它的缺點是挖礦會造成大量的資源浪費,而且共識達成的周期比較長,我們知道比特幣的區(qū)塊生成周期,是每10分鐘生成一個區(qū)塊,這個時間非常長,不適合我們在現(xiàn)實社會中很多的應用,這個速度太慢。
三、權益證明機制PoS
它是股權權益證明,它類似股權憑證和投票系統(tǒng),由持有最多的人公示最終的信息,PoS已經(jīng)有了很多的變種,最基本的概念就是選擇生成新的區(qū)塊的機會應該和股權的大小成比例,股權可以是投入的資金也可以是預先投入的其他資源,pos算法針對pow算法的缺點來改進的,pos無論什么人買了礦機下載了軟件就可以參與,pos要求參與者預先放一些代幣或者利益在區(qū)塊鏈上。類似將財產(chǎn)儲存在銀行之中,那么我們來看采用PoS的數(shù)字資產(chǎn),系統(tǒng)根據(jù)你的幣齡給你分配相應的權益,幣齡是你持幣數(shù)量和時間的乘積。比如你持有100個幣,總共持有了30天,那么,此時你的幣齡就為3000。
這種模式會根據(jù)你持有數(shù)字貨幣的量和時間分配給你相應的利息,用戶只有將一些利益放進鏈里,相當于一些押金,用戶才會更加關注,做出的決定才會更加理性,同時也可以引入獎懲機制,使節(jié)點的運行更加可控,同時更好的防止攻擊。
PoS的運作機制大致如下:
第一,加入PoS機制的都是持幣人,也就是成為驗證者。第二PoS算法在這些驗證者里挑一個給予權力生成新的區(qū)塊,挑選的順序根據(jù)持幣的幣齡來進行計算,如果在一定時間內(nèi),沒有生成區(qū)塊,PoS則會挑選下一個驗證者,給予生成新區(qū)塊的權益,然后以此類推,以區(qū)塊鏈中最長的鏈為準。
PoS和PoW有一個很大的區(qū)別,在PoS機制下持幣是有利息的,眾所周知比特幣是有數(shù)量限制的,由于有比特幣丟失問題,總體來說,比特幣是減少的,也就是說比特幣是一個通縮的系統(tǒng),而在PoS模式下引入了幣齡的概念,每個幣每天產(chǎn)生一幣齡。
比如你持有100個幣總共持有10天,那么這個時候如果你發(fā)現(xiàn)了一個Pos區(qū)塊,你的幣齡就會被清空,沒被清空365幣齡,將會從區(qū)塊中獲得一定的利息,PoS機制下清空下不會產(chǎn)生通縮的清空,和PoW相比,PoS不需要為了生成新區(qū)塊的情況下不需要損耗大量的電力,在一定程度上縮短了共識達成的時間,但是缺點是PoS還是需要挖礦,而且PoS中持幣越多的收益越大,也就是更多的會產(chǎn)生財富集中,中心化的問題,更多的沒有多少財富的中小投資者就會喪失記賬權或者說喪失它的權力,由此提到了一個新的共識算法。
四、DPoS
是股份授權證明機制,它是PoS中財富集中的,越多財富的人獲得的收益越多,它的發(fā)言權也越大,這樣一個缺陷進行改進,那么也就是由股東投票選出一個董事會,董事會中的成員才有權進行代理記賬,這樣就不是錢越多的有越多的記賬權,在這里面,股東投票是每一個人或者每一個節(jié)點都有投票記賬的權力,一個節(jié)點一票來選一個董事會。
所以DPoS是PoS的一個改進,它可以確保節(jié)點的財富不會因為財富的多少而導致記賬權的集中,由于DPoS采用董事會的制度,讓董事會的成員進行記賬,所以記賬的節(jié)點數(shù)量增加,記賬速度提高,采用這個共識算法后,出塊的速度可以達到秒級,DPoS可以達到數(shù)千的一個數(shù)量級,可以滿足現(xiàn)在絕大部分實行應用的一個需求。
我們來看DPoS實例是比特股,見證人生成區(qū)塊,每一個持有比特股的人都可以投票選取見證人,見證人的候選名單每個維護周期(一天更新一次),見證人隨機排列,每個見證人的按序有2秒鐘的時間生成區(qū)塊,如果在這兩秒的時間內(nèi)見證人不能生成區(qū)塊,這個節(jié)點故障或者信息故障,那么區(qū)塊生成權限會交給下一個時間段對應的見證人,DPoS充分的運用了見證人持股人的投票,這樣可以用民主的方式來達成共識 。
最后來看一下幾種共識機制的比較,POW這個共識機制的算法相對簡單,容易實現(xiàn),節(jié)點間無需交換額外的信息即可達成共識,那要破壞系統(tǒng)需要投入極大的成本,我們說PoW有一個51%的攻擊,這是指的想要破壞PoW想達成的共識,就必須要有超過整個系統(tǒng)50%的算力才能實現(xiàn),也就是要有51%的算力掌握在你的手上才能夠破壞PoW所達成的共識所記的一個賬,那這樣的話,如果說系統(tǒng)現(xiàn)有的算力很高的話,超過現(xiàn)有系統(tǒng)51%的算力,這樣的話,你所需要付出的代價非常大。
所以從這個角度而言,PoW的共識算法安全性非常高,當然PoW共識算法它的缺點也是很明顯,第一個大量的節(jié)點要進行毫無意義的隨機數(shù)的哈希碰撞計算,這種計算僅僅只是為了證明節(jié)點算力并沒有任何的意義,所以浪費了能源,浪費大量的電力。
第二個,由于PoW的共識需要有大量節(jié)點的參與,區(qū)塊的確認時間難以縮短,如果說你想要縮短區(qū)塊確認的時間,那就會導致大量孤塊的產(chǎn)生,整個系統(tǒng)的安全性難以保證。
第三個容易產(chǎn)生分叉,等待多個確認,就是說我們在正確的記賬制度之下,有可能你記了A的節(jié)點后,A節(jié)點發(fā)出區(qū)塊后,有可能B節(jié)點之后的后續(xù)節(jié)點它們增長更快,那么前面記的A節(jié)點的賬相當于是一個分叉,那么在更多更長的鏈。速度比較慢,這樣的缺點提出來的,資源消耗很小,不需要計算nonce隨機數(shù),它采用誰的幣齡長,誰持有的幣多就用誰來記賬這樣的一種方式。
當然它的缺點實現(xiàn)較為復雜,中間的步驟比較多容易產(chǎn)生安全漏洞,對于流量的壓力比較大,同時還有一個錢越多的人它的收益越高,他的記賬的權力越大,那么有悖于區(qū)塊鏈中去中心化的一個理念,DPOS是在針對PoS的缺陷提出來的,它采用的是一個股份授權的機制,資源消耗少,網(wǎng)絡資源消耗也少,共識時間少,吞吐量高,可以滿足實時的交易的需求,它的實現(xiàn)方法相對來說比較復雜。
看一下在現(xiàn)代比較主流的代表幣種中,比特幣,達世幣,萊特幣,以太坊這些都采用的PoW機制,以太坊前面三個階段采用PoW機制,在后面階段會逐漸的轉向PoS這樣的一個機制,而量子鏈采用的是PoS,而EOS,比特股采用的是DPoS這樣的一個共識機制。
下面對共識機制進行一些思考,對于分布式的拜占庭問題,F(xiàn)LP不可能性原理與kap定律已經(jīng)告訴了我們無解,研究人員即科學家只有從其他地方來尋找求解問題的靈感,其實可以發(fā)現(xiàn)真實的人類世界就是以一個分布式系統(tǒng),比特幣的天才之處在于參與了人類的組織方式和運作方式,引入了共識機制,一個交易的成立與否,也就是分布式賬本的記賬權,由記賬的共識機制達成的共識來決定。
共識本身就是一個典型的社會學概念,PoW可以看做是范進中舉,范進用了大半輩子來學習一種無用的八股文寫作,就像比特幣礦工用算力來算題,算的題毫無意義,有朝一日運氣好就可以有權打包所有他認可的交易,并且獲得相應的獎勵。
PoS是用戶要預先放入一些利益,很像我們一些現(xiàn)實世界中的股份制,人們把真金白銀兌換成股份開始創(chuàng)業(yè),誰的股份多誰的話語權就更大。
DPoS像我們的董事會選舉出代表,代表股東的利益,被選出的代表一般來說經(jīng)驗豐富,不但能快速的處理日常事物,同時也能很好的保護股東的利益,而像帕克斯算法,ruft算法,pbft算法,則很像我們生活中的隊列,通過相互間的口令達成一致,每排的排頭就稱作leader,領導,而每排的其他人都以排頭為leader目標調(diào)整自己的行動。
傳統(tǒng)純正的計算法對分布式系統(tǒng)的拜占庭問題已經(jīng)無力著手了,所以在分布式系統(tǒng)的研究中,引入了一些社會學的理論和概念,我們可以把每個計算機節(jié)點想象成一個單元,而計算機網(wǎng)絡就是一個個單元組成的社會,我們可以借鑒人類社會歷史上的機制,激勵機制來實現(xiàn)分布式網(wǎng)絡的一致性,我們有理由相信互聯(lián)網(wǎng),或者分布式網(wǎng)路系統(tǒng)與現(xiàn)實的社會運作有著千絲萬縷的聯(lián)系。