摘要:本文将对区块链中常见的七类共识算法进行介绍,但愿对读者探索区块链有所帮助。
区块链技术起源于比特币,最初是比特币等数字货币的一种底层技术,区块链融合了密码学、组网技术、共识算法、智能合约等多种技术。随着区块链技术的逐渐成熟,其逐渐获得科研机构、政府、金融机构和科技企业的关注。区块链具备匿名、防篡改、可追溯和去中心化等特色。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 。