區塊鏈是一個歷史可追溯、不可篡改,解決多方互信問題的分布式(去中心化)系統。分布式系統必然面臨著一致性問題,而解決一致性問題的過程我們稱之為共識。
分布式系統的共識達成需要依賴可靠的共識算法,共識算法通常解決的是分布式系統中由哪個節點發起提案,以及其他節點如何就這個提案達成一致的問題。我們根據傳統分布式系統與區塊鏈系統間的區別,將共識算法分為可信節點間的共識算法與不可信節點間的共識算法。前者已經被深入研究,并且在現有流行的分布式系統中廣泛應用,其中Paxos和Raft及其相應變種算法最為著名。對于后者,雖然也早就被研究,但直到近年區塊鏈技術發展如火如荼,相關共識算法才得到大量應用。而根據應用場景的不同,后者又分為以PoW(ProofofWork)和PoS(ProofofStake)等算法為代表的適用于公鏈的共識算法和以PBFT(PracticalByzantineFaultTolerance)及其變種算法為代表的適用于聯盟鏈或私有鏈的共識算法。
工作量證明PoW算法是比特幣系統采用的算法,該算法于1998年有W.Dai在B-money的設計中提出。以太坊系統當前同樣采用PoW算法進行共識,但由于以太坊系統出塊更快(約15秒),更容易產生區塊,為了避免大量節點白白陪跑,以太坊提出了Uncle塊獎勵機制。POS算法最早由SunnyKing在2012年8月發布的PPC系統中首先實現,而以太坊系統也一直對PoS抱有好感,計劃后續以PoS代替PoW作為其共識機制。PoS及其變種算法可以解決PoW算法一直被詬病的浪費算力問題,但其本身尚未經過足夠驗證。PBFT算法最早由MiguelCastro和BarbaraLiskov在1999年的OSDI99會議上提出,該算法相較原始拜占庭容錯算法具有更高的運行效率。假設系統中共有N個節點,那么PBFT算法可以容忍系統中存在F個惡意節點,并且3F+1不大于N。PBFT共識算法雖然隨著系統中節點數增多而可以容忍更多的拜占庭節點,但其共識效率確實以極快的速率下降,這也是我們能看到的應用PBFT做共識算法的系統中很少有超過100個節點的原因。無論是PoW算法還是Pos算法,其核心思想都是通過經濟激勵來鼓勵節點對系統的貢獻和付出,通過經濟懲罰來阻止節點作惡。公有鏈系統為了鼓勵更多節點參與共識,通常會發放代幣(token)給對系統運行有貢獻的節點。而聯盟鏈或者私鏈與公有鏈的不同之處在于,聯盟鏈或者私鏈的參與節點通常希望從鏈上獲得可信數據,這相對于通過記賬來獲取激勵而言有意義得多,所有他們更有義務和責任去維護系統的穩定運行,并且通常參與節點數較少,PBFT及其變種算法恰好適用于聯盟鏈或者私鏈的應用場景。
責任編輯:胡金鵬