摘要:本文將對區塊鏈中常見的七類共識算法進行介紹,但願對讀者探索區塊鏈有所幫助。
區塊鏈技術起源於比特幣,最初是比特幣等數字貨幣的一種底層技術,區塊鏈融合了密碼學、組網技術、共識算法、智能合約等多種技術。隨着區塊鏈技術的逐漸成熟,其逐漸獲得科研機構、政府、金融機構和科技企業的關注。區塊鏈具備匿名、防篡改、可追溯和去中心化等特色。git
傳統的交易須要一個可信任的第三方做爲交易中介,與之相比,區塊鏈技術可以實現交易的去中心化,同時還能保證全網數據的一致性,使得點對點交易成爲可能。這須要對交易確認規則進行設計,這一規則就是本節將要介紹的共識算法。共識算法做爲區塊鏈技術的核心,對區塊鏈安全、效率等方面有着決定性的做用。算法
在區塊鏈的應用過程當中,共識算法須要解決兩個問題:雙花問題[1, 2]和拜占庭將軍問題[3]。雙花問題是指貨幣在使用過程當中重複使用的問題。傳統的貨幣具備實體惟一性,能夠經過防僞手段防止雙花問題。當前的電子交易也能經過中心的信任機構來解決雙花問題。區塊鏈則是經過分佈式的節點共同驗證交易來解決雙花問題。區塊鏈中,一筆交易須要通過足夠數量共識節點的驗證,在確認無誤下對交易進行記錄並同步給網絡中全部的共識節點。區塊鏈中進行「雙花」攻擊完成須要付出足夠的代價,經過選擇共識算法,能夠將這一代價擴展到足夠大或者使得這一代價超過雙花攻擊得到的收益。數據庫
本文將對區塊鏈中常見的七類共識算法進行介紹,但願對讀者探索區塊鏈有所幫助。安全
中本聰在2009年提出的比特幣(Bitcoin)是區塊鏈技術最先的應用,其採用PoW做爲共識算法,其核心思想是節點間經過哈希算力的競爭來獲取記帳權和比特幣獎勵。PoW中,不一樣節點根據特定信息競爭計算一個數學問題的解,這個數學問題很難求解,但卻容易對結果進行驗證,最早解決這個數學問題的節點能夠建立下一個區塊並得到必定數量的幣獎勵。中本聰在比特幣中採用了HashCash[4]機制設計這一數學問題。本節將以比特幣採用的PoW算法爲例進行說明,PoW的共識步驟以下:服務器
在區塊頭部填寫如表1.1所示的區塊版本號、前一區塊的哈希值、時間戳、當前目標哈希值和隨機數等信息;網絡
表1.1 區塊頭部信息併發
比特幣產生區塊的平均時間爲10分鐘,想要維持這一速度,就須要根據當前全網的計算能力對目標值(難度)進行調整[5]。難度是對計算產生符合要求的區塊困難程度的描述,在計算同一高度區塊時,全部節點的難度都是相同的,這也保證了挖礦的公平性。難度與目標值的關係爲:dom
難度值=最大目標值/當前目標值 (1.1)異步
其中最大目標值和當前目標值都是256位長度,最大目標值是難度爲1時的目標值,即2224。假設當前難度爲,算力爲,當前目標值爲,發現新區塊的平均計算時間爲,則async
根據比特幣的設計,每產生2016個區塊後(約2周)系統會調整一次當前目標值。節點根據前2016個區塊的實際生產時間,由公式(1.4)計算出調整後的難度值,若是實際時間生產小於2周,增大難度值;若是實際時間生產大於2周,則減少難度值。根據最長鏈原則,在不須要節點同步難度信息的狀況下,全部節點在必定時間後會獲得相同的難度值。
在使用PoW的區塊鏈中,由於網絡延遲等緣由,當同一高度的兩個區塊產生的時間接近時,可能會產生分叉。即不一樣的礦工都計算出了符合要求的某一高度的區塊,並獲得與其相近節點的確認,全網節點會根據收到區塊的時間,在先收到的區塊基礎上繼續挖礦。這種狀況下,哪一個區塊的後續區塊先出現,其長度會變得更長,這個區塊就被包括進主鏈,在非主鏈上挖礦的節點會切換到主鏈繼續挖礦。
PoW共識算法以算力做爲競爭記帳權的基礎,以工做量做爲安全性的保障,全部礦工都遵循最長鏈原則。新產生的區塊包含前一個區塊的哈希值,現存的全部區塊的造成了一條鏈,鏈的長度與工做量成正比,全部的節點均信任最長的區塊鏈。若是當某一組織掌握了足夠的算力,就能夠針對比特幣網絡發起攻擊。當攻擊者擁有足夠的算力時,可以最早計算出最新的區塊,從而掌握最長鏈。此時比特幣主鏈上的區塊大部分由其生成,他能夠故意拒絕某些交易的確認和進行雙花攻擊,這會對比特幣網絡的可信性形成影響,但這一行爲一樣會給攻擊者帶來損失。經過求解一維隨機遊走問題,能夠得到惡意節點攻擊成功的機率和算力之間的關係:
圖1.1 攻擊者算力與攻擊成功機率
隨着參與比特幣挖礦的人愈來愈多,PoW的許多問題逐漸顯現,例如隨着算力競爭迅速加重,獲取代幣須要消耗的能源大量增長,記帳權也逐漸向彙集了大量算力的「礦池」集中[6-9]。爲此,研究者嘗試採用新的機制取代工做量證實。PoS的概念在最先的比特幣項目中曾被說起,但因爲穩健性等緣由沒被使用。PoS最先的應用是點點幣(PPCoin),PoS提出了幣齡的概念,幣齡是持有的代幣與持有時間乘積的累加,計算如公式(1.4)所示。利用幣齡競爭取代算力競爭,使區塊鏈的證實再也不僅僅依靠工做量,有效地解決了PoW的資源浪費問題。
其中持有時間爲某個幣距離最近一次在網絡上交易的時間,每一個節點持有的幣齡越長,則其在網絡中權益越多,同時幣的持有人還會根據幣齡來得到必定的收益。點點幣的設計中,沒有徹底脫離工做量證實,PoS機制的記帳權的得到一樣須要進行簡單的哈希計算:
其中proofhash是由權重因子、未消費的產出值和當前時間的模糊和獲得的哈希值,同時對每一個節點的算力進行了限制,可見幣齡與計算的難度成反比。在PoS中,區塊鏈的安全性隨着區塊鏈的價值增長而增長,對區塊鏈的攻擊須要攻擊者積攢大量的幣齡,也就是須要對大量數字貨幣持有足夠長的時間,這也大大增長了攻擊的難度。與PoW相比,採用PoS的區塊鏈系統可能會面對長程攻擊(Long Range Attack)和無利害攻擊(Nothing at Stake)。
除了點點幣,有許多幣也使用了PoS,但在記帳權的分配上有着不一樣的方法。例如,將來幣(Nxt)和黑幣(BlackCion)結合節點所擁有的權益,使用隨機算法分配記帳權。以太坊也在逐步採用PoS代替PoW。
比特幣設計之初,但願全部挖礦的參與者使用CPU進行計算,算力與節點匹配,每個節點都有足夠的機會參與到區塊鏈的決策當中。隨着技術的發展,使用GPU、FPGA、ASIC等技術的礦機大量出現,算力集中於擁有大量礦機的參與者手中,而普通礦工參與的機會大大減少。
採用DPoS的區塊鏈中,每個節點均可以根據其擁有的股份權益投票選取表明,整個網絡中參與競選並得到選票最多的n個節點得到記帳權,按照預先決定的順序依次生產區塊並所以得到必定的獎勵。競選成功的表明節點須要繳納必定數量的保證金,並且必須保證在線的時間,若是某時刻應該產生區塊的節點沒有履行職責,他將會被取消表明資格,系統將繼續投票選出一個新的表明來取代他。
DPoS中的全部節點均可以自主選擇投票的對象,選舉產生的表明按順序記帳,與PoW及PoS相比節省了計算資源,並且共識節點只有肯定的有限個,效率也獲得了提高。並且每一個參與節點都擁有投票的權利,當網絡中的節點足夠多時,DPoS的安全性和去中心化也獲得了保證。
在PBFT算法中,全部節點都在相同的配置下運行,且有一個主節點,其餘節點做爲備份節點。主節點負責對客戶端的請求進行排序,按順序發送給備份節點。存在視圖(View)的概念,在每一個視圖中,全部節點正常按照處理消息。但當備份節點檢查到主節點出現異常,就會觸發視圖變換(View Change)機制更換下一編號的節點爲主節點,進入新的視圖。PBFT中客戶端發出請求到收到答覆的主要流程如圖4.1所示[10] [11],服務器之間交換信息3次,整個過程包含如下五個階段:
圖4.1 PBFT執行流程
目前以PBFT爲表明的拜占庭容錯算法被許多區塊鏈項目所使用。在聯盟鏈中,PBFT算法最先是被Hyper ledger Fabric項目採用。Hyperledger Fabric在0.6版本中採用了PBFT共識算法,受權和背書的功能集成到了共識節點之中,全部節點都是共識節點,這樣的設計致使了節點的負擔過於沉重,對TPS和擴展性有很大的影響。1.0以後的版本都對節點的功能進行了分離,節點分紅了三個背書節點(Endorser)、排序節點(Orderer)和出塊節點(Committer),對節點的功能進行了分離,必定程度上提升了共識的效率。
Cosmos項目使用的Tendermint[12]算法結合了PBFT和PoS算法,經過代幣抵押的方式選出部分共識節點進行BFT的共識,其減弱了異步假設並在PBFT的基礎上融入了鎖的概念,在部分同步的網絡中共識節點可以經過兩階段通訊達成共識。系統可以容忍1/3的故障節點,且不會產生分叉。在Tendermint的基礎上,Hotstuff[13]將區塊鏈的塊鏈式結構和BFT的每一階段融合,每階段節點間對前一區塊簽名確認與新區塊的構建同時進行,使算法在實現上更爲簡單,Hotstuff還使用了門限簽名[14]下降算法的消息複雜度。
共識算法是爲了保障所存儲信息的準確性與一致性而設計的一套機制。在傳統的分佈式系統中,最常使用的共識算法是基於Paxos的算法。在拜占庭將軍問題[3]提出後,Lamport在1990年提出了Paxos算法用於解決特定條件下的系統一致性問題,Lamport於1998年從新整理並發表Paxos的論文[15]並於2001對Paxos進行了從新簡述[16]。隨後Paxos在一致性算法領域佔據統治地位並被許多公司所採用,例如騰訊的Phxpaxos、阿里巴巴的X-Paxos、亞馬遜的AWS的DynamoDB和谷歌MegaStore[17]等。這一類算法可以在節點數量有限且相對可信任的狀況下,快速完成分佈式系統的數據同步,同時可以容忍宕機錯誤(Crash Fault)。即在傳統分佈式系統不須要考慮參與節點惡意篡改數據等行爲,只須要可以容忍部分節點發生宕機錯誤便可。但Paxos算法過於理論化,在理解和工程實現上都有着很大的難度。Ongaro等人在2013年發表論文提出Raft算法[18],Raft與Paxos一樣的效果而且更便於工程實現。
Raft中領導者佔據絕對主導地位,必須保證服務器節點的絕對安全性,領導者一旦被惡意控制將形成巨大損失。並且交易量受到節點最大吞吐量的限制。目前許多聯盟鏈在不考慮拜占庭容錯的狀況下,會使用Raft算法來提升共識效率。
在現有聯盟鏈共識算法中,若是參與共識的節點數量增長,節點間的通訊也會增長,系統的性能也會受到影響。若是從衆多候選節點中選取部分節點組成共識組進行共識,減小共識節點的數量,則能夠提升系統的性能。但這會下降安全性,並且候選節點中惡意節點的比例越高,選出來的共識組沒法正常運行的機率也越高。爲了實現從候選節點選出可以正常運行的共識組,並保證系統的高可用性,一方面須要設計合適的隨機選舉算法,保證選擇的隨機性,防止惡意節點對系統的攻擊。另外一方面須要提升候選節點中的誠實節點的比例,增長誠實節點被選進共識組的機率。
當前在公有鏈每每基於PoS類算法,抵押代幣增長共識節點的准入門檻,經過經濟學博弈增長惡意節點的做惡成本,而後再在部分經過篩選的節點中經過隨機選舉算法,從符合條件的候選節點中隨機選舉部分節點進行共識。
Dodis等人於1999年提出了可驗證隨機函數(Verifiable Random Functions,VRF)[19]。可驗證隨機函數是零知識證實的一種應用,即在公私鑰體系中,持有私鑰的人可使用私鑰和一條已知信息按照特定的規則生成一個隨機數,在不泄露私鑰的前提下,持有私鑰的人可以向其餘人證實隨機數生成的正確性。VRF可使用RSA或者橢圓曲線構建,Dodis等人在2002年又提出了基於Diffie-Hellman 困難性問題的可驗證隨機函數構造方法[20],目前可驗證隨機函數在密鑰傳輸領域和區塊鏈領域都有了應用[21]。可驗證隨機函數的具體流程以下:
在公有鏈中,VRF已經在一些項目中獲得應用,其中VRF多與PoS算法結合,全部想要參與共識的節點質押必定的代幣成爲候選節點,而後經過VRF從衆多候選節點中隨機選出部分共識節點。Zilliqa網絡的新節點都必須先執行PoW,網絡中的現有節點驗證新節點的PoW並受權其加入網絡。區塊鏈項目Ontology設計的共識算法VBFT將VRF、PoS和BFT算法相結合,經過VRF在衆多候選節點中隨機選出共識節點並肯定共識節點的排列順序,能夠下降惡意分叉對區塊鏈系統的影響,保障了算法的公平性和隨機性。圖靈獎得到者Micali等人提出的Algorand[22]將PoS和VRF結合,節點能夠採用代幣質押的方式成爲候選節點,而後經過非交互式的VRF算法選擇部分節點組成共識委員會,而後由這部分節點執行相似PBFT共識算法,負責交易的快速驗證,Algorand能夠在節點爲誠實節點的狀況下保證系統正常運行。Kiayias等人提出的Ouroboros[23]在第二個版本Praos[24]引入了VRF代替僞隨機數,進行分片中主節點的選擇。以Algorand等算法使用的VRF算法爲例,主要的流程以下:
公有鏈中設計使用的VRF中,節點被選爲記帳節點的機率每每和其持有的代幣正相關。公有鏈的共識節點範圍是沒法預先肯定的,全部知足代幣持有條件的節點均可能成爲共識節點,系統須要在數量和參與度都隨機的節點中選擇部分節點進行共識。而與公有鏈相比,聯盟鏈參與共識的節點數量有限、節點已知,這種狀況下聯盟鏈節點之間能夠經過已知的節點列表進行交互,這能有效防止公有鏈VRF設計時可能遇到的女巫攻擊問題。
分片技術是數據庫中的一種技術,是將數據庫中的數據切成多個部分,而後分別存儲在多個服務器中。經過數據的分佈式存儲,提升服務器的搜索性能。區塊鏈中,分片技術是將交易分配到多個由節點子集組成的共識組中進行確認,最後再將全部結果彙總確認的機制。分片技術在區塊鏈中已經有一些應用,許多區塊鏈設計了本身的分片方案。
Luu等人於2017年提出了Elastico協議,最早將分片技術應用於區塊鏈中[25]。Elastico首先經過PoW算法競爭成爲網絡中的記帳節點。而後按照預先肯定的規則,這些節點被分配到不一樣的分片委員會中。每一個分片委員會內部執行PBFT等傳統拜占庭容錯的共識算法,打包生成交易集合。在超過的節點對該交易集合進行了簽名以後,交易集合被提交給共識委員會,共識委員會在驗證簽名後,最終將全部的交易集合打包成區塊並記錄在區塊鏈上。
Elastico驗證了分片技術在區塊鏈中的可用性。在必定規模內,分片技術能夠近乎線性地拓展吞吐量。但Elastico使用了PoW用於選舉共識節點,這也致使隨機數產生過程及PoW競爭共識節點的時間過長,使得交易延遲很高。並且每一個分片內部採用的PBFT算法通信複雜度較高。當單個分片中節點數量較多時,延遲也很高。
在Elastico的基礎上,Kokoris-Kogias等人提出OmniLedger[26],用加密抽籤協議替代了PoW選擇驗證者分組,而後經過RandHound協議[27]將驗證者納入不一樣分片。OmniLedger。OmniLedger在分片中仍然採用基於PBFT的共識算法做爲分片中的共識算法[28],並引入了Atomix協議處理跨分片的交易,共識過程當中節點之間通訊複雜度較高。當分片中節點數量增多、跨分片交易增多時,系統TPS會顯著降低。
Wang等人在2019年提出了Monoxide[29]。在PoW區塊鏈系統中引入了分片技術,提出了連弩挖礦算法(Chu ko-nu mining algorithm),解決了分片形成的算力分散分散問題,使得每一個礦工能夠同時在不一樣的分片進行分片,在不下降安全性的狀況下提升了PoW的TPS。
本文對區塊鏈中的共識算法進行了綜述性介紹,其中對公有鏈中基礎的共識PoW和聯盟鏈中基礎的公式算法PBFT進行了較爲詳細的分析,而後對目前新出現的較爲先進的共識算法進行了介紹,但願對讀者探索區塊鏈領域有所幫助。
[1]Antonopoulos A M. Mastering Bitcoin: Unlocking Digital Crypto-Currencies[J]. Oreilly Media Inc Usa, 2015.
[2]Karame G O, Androulaki E, Capkun S. Two Bitcoins at the Price of One? Double-Spending Attacks on Fast Payments in Bitcoin.[J]. 2012.
[3]Lamport L, Shostak R, Pease M. The Byzantine Generals Problem[J]. Acm Transactions on Programming Languages & Systems, 1982,4(3):382-401.
[4]Back A. Hashcash - A Denial of Service Counter-Measure: USENIX Technical Conference, 2002[C].
[5]Kraft D. Difficulty control for blockchain-based consensus systems[J]. Peer-to-Peer Networking and Applications, 2016,9(2):397-413.
[6]Andolfatto D. The False Analogy Between Gold and Bitcoin[J].
[7]Alfidi A. The Serious Disadvantages of Bitcoin[J].
[8]Miller A, Juels A, Shi E, et al. Permacoin: Repurposing Bitcoin Work for Data Preservation[J]. 2014:475-490.
[9]Stegaroiu C E. The Advantages And Disadvantages Of Bitcoin Payments In The New Economy[J]. Annals Economy, 2018,1.
[10]範捷, 易樂天, 舒繼武. 拜占庭系統技術研究綜述[J]. 軟件學報, 2013(06):1346-1360.
[11]Castro M, Liskov B. Practical Byzantine fault tolerance: Symposium on Operating Systems Design and Implementation, 1999[C].
[12]Buchman E. Tendermint: Byzantine fault tolerance in the age of blockchains[D]., 2016.
[13]Yin M, Malkhi D, Reiter M K, et al. Hotstuff: Bft consensus with linearity and responsiveness, 2019[C].
[14]Desmedt Y, Frankel Y. Shared generation of authenticators and signatures, 1991[C]. Springer.
[15]Lamport L. The part-time parliament[J]. Acm Transactions on Computer Systems, 1998,16(2):133-169.
[16]Lamport L. Paxos made simple[J]. ACM Sigact News, 2001,32(4):18-25.
[17]Chandra T D, Griesemer R, Redstone J. Paxos made live: An engineering perspective: Proceedings of the Twenty-Sixth Annual ACM Symposium on Principles of Distributed Computing, PODC 2007, 2007[C].
[18]Ongaro D, Ousterhout J K. In search of an understandable consensus algorithm., 2014[C].
[19]Li W, Andreina S, Bohli J, et al. Securing proof-of-stake blockchain protocols, Oslo, Norway, 2017[C]. Springer Verlag, 2017.
[20]Dodis Y. Efficient Construction of (Distributed) Verifiable Random Functions: International Workshop on Theory & Practice in Public Key Cryptography: Public Key Cryptography, 2002[C].
[21]Melara M S, Blankstein A, Bonneau J, et al. Coniks: Bringing key transparency to end users, Washington, DC, United states, 2015[C]. USENIX Association, 2015.
[22]Gilad Y, Hemo R, Micali S, et al. Algorand: Scaling Byzantine Agreements for Cryptocurrencies, Shanghai, China, 2017[C]. Association for Computing Machinery, Inc, 2018.
[23]Kiayias A, Russell A, David B, et al. Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol, 2017[C].
[24]David B, Gaži P, Kiayias A, et al. Ouroboros Praos: An Adaptively-Secure, Semi-synchronous Proof-of-Stake Blockchain, 2018[C].
[25]Luu L, Narayanan V, Zheng C, et al. A secure sharding protocol for open blockchains, Vienna, Austria, 2016[C]. Association for Computing Machinery, 2016.
[26]Kokoris-Kogias E, Jovanovic P, Gasser L, et al. OmniLedger: A Secure, Scale-Out, Decentralized Ledger via Sharding, Los Alamitos, CA, USA, 2018[C]. IEEE Computer Society, 2018//.
[27]Syta E, Jovanovic P, Kogias E K, et al. Scalable Bias-Resistant Distributed Randomness, Los Alamitos, CA, USA, 2017[C]. IEEE Computer Society, 2017//.
[28]Kokoris-Kogias E, Jovanovic P, Gailly N, et al. Enhancing bitcoin security and performance with strong consistency via collective signing, Austin, TX, United states, 2016[C]. USENIX Association, 2016.
[29]Wang J, Wang H. Monoxide: Scale out blockchains with asynchronous consensus zones: 16th {USENIX} Symposium on Networked Systems Design and Implementation ({NSDI} 19), 2019[C].
本文分享自華爲雲社區《萬字長文解讀區塊鏈七類共識算法》,原文做者:APTX-486977 。