本文对区块链中的共识机制从基本概念、主要类型、优缺点和适用范围四个方面做了初步调研,并且设想了下一代共识机制的发展趋势。
1. 共识机制简介
区块链系统本质就是一个去中心化的分布式系统。分布式系统的首要问题是如何解决一致性的问题,即在多个独立节点之间达成共识。但是在去中心化的场景下,达成共识会受到很多制约因素,比如节点之间的通信延迟、通信故障、甚至节点宕机。解决分布式系统中的一致性问题的难点主要体现在三方面:
分布式系统本身可能出现故障;
分布式系统的节点通信延迟;
分布式系统中节点处理事务的效率不一致。
在区块链里,共识机制的目标就是解决一致性问题,使所有的诚实节点保存一致的区块链视图。具体一点说,区块链上的共识机制主要解决由谁来构造区块,以及如何维护区块链统一的问题,该问题的理论基础是拜占庭容错(Byzantine Fault-Tolerant,BFT)。BFT从上世纪80年代开始被研究,考虑在通信各方存在故意破坏者或者叛徒的情况下,如何在整体上保持正确地一致性的问题。区块链的共识机制可以保证只要整个网络中的绝大部分节点都是正常工作的,整个系统总能在未来某一时刻达成数据状态的一致。
区块链解决了在不可信信道上传输可信信息、价值转移的问题,而共识机制解决了区块链如何在分布式场景下达成一致性的问题。所以共识机制在去中心化的思想上解决了节点间互相信任的问题。区块链能在众多节点达到一种较为平衡的状态也是因为共识机制。尽管密码学保障了区块链数据传输的安全性,但是共识机制是保障区块链系统不断运行下去的关键。当下分布式系统的共识算法设计原则遵从两个定理:FLP定理和CAP定理。
FLP定理[1]由Fischer, Lynch和Patterson三位作者在1985年提出,其定义为:在网络可靠、存在节点失效的最小化异步模型系统中,不存在一个解决一致性问题的确定性算法。也就是说不可能为异步分布式系统设计出一个在任何场景都能实现共识的算法,在允许节点失效的情况下,纯粹异步系统无法确保在有限时间内达成一致性。
CAP定理[2]最早由Eric Brewer 在2000年ACM一个研讨会提出,其定义了分布式计算系统不可能同时确保一致性(consistency)、可用性(availability)和分区容错性(partition tolerance)。那么就意味着所有共识机制的设计都是根据具体的业务场景来在这三者之间寻求折中。
结合以上两个定理,在分布式场景下达成完全一致性是不可能的。但是可以牺牲一部分代价来换取分布式场景的一致性,所以基于区块链设计的各种公式机制都可以看作牺牲一部分代价来换取更适合的一致性,我们可以着力于在这种思想上进行一个灵活的变换,即在适当的时间空间牺牲一部分代价换取适应于当时场景的一致性,从而实现灵活的区块链系统,即可插拔式的区块链系统,比如IBM Hyperledger Fabric[13]。
2. 主要类型
根据分布式系统中根据有无作恶节点,可以将共识机制分为两个大类:拜占庭容错和非拜占庭容错机制。本节介绍四种主流共识机制类型。
Paxos算法
Paxos算法[3]1988年由Lamport提出,解决的是非拜占庭将军问题,也就是假设分布式系统中的节点存在故障,但是不存在恶意节点,如何在这种情况下达成共识,Google的分布式锁系统Chubby采用了该算法。Paxos可以保证在超过一半的正常节点存在时,系统达成共识。
Paxos算法基于选举领导者的共识机制。领导者节点拥有绝对权限,并允许强监督节点参与,其性能高,资源消耗低。所有节点一般有线下准入机制,但选举过程中不允许有作恶节点,不具备容错性。
基于CAP定理,Paxos算法有了一系列变体,Paxos算法系列适用于相对私有的环境中或者网络环境较好的情况。因为节点在确认之前需要做一个自身评估来判断是否收到大多数回复,当节点数不固定的时候,这个判断就会很难做出,算法效果就会不理想。
Raft算法
基于Paxos算法晦涩难懂和工程上难以实现的不足,2013年,斯坦福大学的Diego
Ongaro和John Ousterhout设计了Raft算法[4]。RAFT核心思想大致是:如果多个数据库初始状态一致,只要之后进行的操作一致,就能保证之后的数据一致。相比于Paxos算法,Raft更易于理解和实现,在性能上并没有明显的优势。
Paxos算法是强Leadership的,也就是说,任意包含Leader的时刻,Leader拥有完全记账权,如果此Leader节点是恶意的,后果不堪设想。且leadership的一致性算法都有个通病,吞吐量受单个节点的限制,这正是Raft算法的痛点。
Pool验证池是一种基于传统的分布式一致性技术(Pasox、Raft)和数据验证机制的共识机制,目前在私有链大范围使用。
实用拜占庭容错机制-PBFT
实用拜占庭容错PBFT(Practical Byzantine Fault Tolerance)[5]1999年由Castro和Liskov提出,是第一个得到广泛应用的BFT算法。在BFT算法中,至多可以容忍不超节点总数的1/3的节点背叛,即只要不少于2/3的节点正常,系统就可以正常工作。
这是一种基于消息传递的一致性算法,算法经过三个阶段:预准备阶段(pre-prepare), 准备阶段(prepared)和确认阶段(commited)来达成一致性,这些阶段可能因为失败而重复进行。
假设节点总数为3f+1,f为拜占庭错误节点,PBFT协议简述如下:
1) 在预准备阶段,由主节点发布包含待验证记录的预准备消息。接收到预准备消息后,每一个节点进人准备阶段。
2) 在准备阶段,主节点向所有节点发送包含待验证记录的准备消息,每一个节点验证其正确性,将正确记录保存下来 并发送给其他节点。直到某一个节点接收到2f个不同节点 发送的与预准备阶段接收的记录一致的正确记录,则该节点向其他节点广播确认消息,系统进入确认阶段。
3) 在确认阶段,直到每个诚实节点接收到2f +1个确认消息,协议终止,各节点对该记录达成一致。
在去中心情况下,利用拜占庭一致性协议可以实现区块链的一致性,剔除多余的计算量,避免资源浪费。此外,在某一时刻,只有一个主节点可以提出新区块,其他节点对该区块进行验证,避免分叉,缩短了交易确认和区块确认时间,提高了系统效率。
拜占庭一致性协议在安全性和扩展性方面还存在问题。拜占庭一致性协议的安全性依赖于失效节点数量的限制,失效节点数量不超过全网节点的1/3。在区块链系统中,恶意节点可通过实施sybil攻击产生多个节点,使其控制的节点比例超过全网节点的1/3,从而破坏系统的 一致性和安全性。拜占庭一致性协议的效率依赖于参与协议的节点数量,该协议不适用于节点数量过大的区块链系统,扩展性差。此外,一轮是否可以取得共识也依赖于主节点是否诚实,若主节点提出无效区块,则本轮不会产生区块,影响效率。
PBFT算法基于一个节点一票,少数服从多数的这种方式很适用于联盟链的应用场景。联盟链的参与机构一般不太多(几十个到几百个?)。网络规模不是很大。那么在共识机制选取上可以优先考虑效率,以规模换取安全。未来的的改进点是否可以考虑结合多种共识机制,保证效率和安全的前提下,进一步提高规模。目前改进的PBFT算法主要体现在:1.修改底层网络拓扑要求,使用P2P网络;2.可以动态调整节点数量;3.减少协议使用的消息数量。
PBFT项目:IBM hyperledger Fabric,Asch,国内央行推出的区块链数字票据交易平台,腾讯区块链。
工作量证明机制-PoW
工作量证明POW(proof of work)[6]多用于比特币,莱特币等货币型区块链(公有链),在比特币等货币型区块链中让各节点达成一致性的共识机制为工作量证明,也就是挖矿。
PoW协议简述如下:
1) 向所有的节点广播新的交易;
2) 每个节点把收到的交易放进块中;
3) 在每一轮中,一个被随机选中的节点广播它所保有的块;
4) 其他节点验证该区块的hash值并放入下一个它们创建的区块中,表示它们承认这个区块的正确性。
PoW机制会产生暂时性分叉,当两个节点同时广播各自挖出的区块,其他节点以自己最先收到的区块为准开始挖矿,但同时会保留另一个区块以防止这个区块日后成为较长的分支。直到其中某个分支在下一个工作量证明中变得更长,之前那些在另一条分支上工作的节点就会转向这条更长的链。因为节点认为最长的链为合法的链,所以产生的分支只需等待多个确认就会在算力的比拼中自动消除。
PoW共识协议的优点是完全去中心化,节点自由进出,网络可扩展性高。但是以来机器进行数学运算来获取记账圈,资源消耗相对较高,可监管性弱,同时每次达成共识需要全网共同参与运算,效率较低,在容错性上允许全网50%节点出错。
股权权益证明机制-PoS
股权权益证明PoS(Proof of Stack)[7]由Quantum Mechanic在2011年提出,最基本的概念就是选择生成新的数据块的机会应和股权大小成比例。股权可以是投入的资金,也可以是预先投入的其他资源。也就是说,新数据块的产生与系统中最富的人关系更大。
如果简单的把PoW当作比力量大小的话,PoS就是比耐力多少。PoS要求参与者预先放一些代币(利益)在区块链上,相当于押金,参与者投入了利益到链里,做出的决定才会更理性。
PoS运行的机制大致如下:
1) 加入PoS机制的都是持币人,成为验证者(validator);
2) PoS算法在这些验证者里挑一个给予生成新区块的权利;
3) 如果在一定时间内,没有生成区块,PoS则选取下一个验证者,给与生成新区块的权利;
4) 以此类推,以区块链中最长的链为准。
相比于PoW,PoS的优势是不会产生通缩。因为在PoS下,持币是有利息的,PoS引入了币龄的概念,币龄与持币数量和持币时间相关,每当验证者发现一个PoS区块时,币龄就会清零,没被清空365币龄都会从区块中获得一定利息,从而在比特币整体减少的趋势下避免了通缩的问题。
此外,与PoW相比,PoS不需要为了生成新区块而耗费大量电力,但是在发现区块上依旧拼算力,对计算机还是有一定要求。
委托权益人证明机制-DPoS
委托权益人证明机制DPoS(Delegated Proof of Stake)[8][9]是对PoS的改进,2014年4月由Bitshares 的首席开发者 Dan Larimer (现为EOS CTO)提出并应用。DPoS是一种带权重投票机制,类似于董事会的投票机制,代币持有者可以看做股东,由股东投票选出101名受托人(Delegates),然后由这些受托人负责产生区块。那么需要解决的核心问题主要有:受托人如何被选出,受托人如何自由退出“董事会”,受托人之间如何协作产生区块等。
一个区块链项目的受托人个数由项目发起方决定,一般是101个受托人。任何一个持币用户都可以参与到投票和竞选受托人这两个过程中。用户可以随时投票、撤票,每个用户投票的权重和自己的持币量成正比。投票和撤票可以随时进行,在每一轮(round)选举结束后,得票率最高的101(一般为101,也可以是其他数字,具体由区块链项目方决定)个用户则成为该项目的受托人,负责打包区块、维持系统的运转并获得相应的奖励。
在DPoS共识算法中,区块链的正常运转依赖于受托人,这些受托人是完全等价的。受托人的职责主要有:
1) 提供一台服务器节点,保证节点的正常运行;
2) 节点服务器收集网络里的交易;
3) 节点验证交易,把交易打包到区块;
4) 节点广播区块,其他节点验证后把区块添加到自己的数据库;
5) 带领并促进区块链项目的发展。
受托人的节点服务器相当于比特币网络里的矿机,在完成本职工作的同时可以领取区块奖励和交易的手续费。
委托人机制有以下特点:
1) 委托人的具体数量由权益所有者决定,至少需要确保11个委托人;
2) 委托人必须长时间在线,以便做出响应;
3) 委托人代表权益所属人签署和广播区块链;
4) 委托人如果无法签署区块链或者不老实生产区块,就将失去资格,也将失去这一笔收入;
5) 委托人无法签署无效的交易,因为交易需要所有见证人都确认。
选举的根本目的,是通过对于项目发展和运行最有利的101个委托人的贡献来维护系统的运转。区块链保留了一些中心化系统的关键优势,同时又能保证一定的去中心化。从某种角度来说,DPOS可以理解为多中心系统,兼具去中心化和中心化优势,从而保证了整个系统的运行效率和减少能源浪费。
DPoS 项目:Bitshares(DPoS),EOS(DPoS + BFT),Asch(DPoS + PBFT)
3. 优缺点对比
本节总结目前主要的四大类共识机制:PoW、PoS、DPoS和Pool的优缺点。从安全、效率、网络规模,以及交易容量四个维度对共识算法性能做出对比。
PoW工作量证明,就是大家熟悉的挖矿,通过与或运算,计算出一个满足规则的随机数,即获得本次记账权,发出本轮需要记录的数据,全网其它节点验证后一起存储。优点:完全去中心化,节点自由进出;缺点:目前bitcoin已经吸引全球大部分的算力,其它再用PoW共识机制的区块链应用很难获得相同的算力来保障自身的安全;挖矿造成大量的资源浪费;共识达成的周期较长,不适合商业应用。
PoS权益证明,PoW的一种升级共识机制;根据每个节点所占代币的比例和时间;等比例的降低挖矿难度,从而加快找随机数的速度。优点:在一定程度上缩短了共识达成的时间缺点:还是需要挖矿,本质上没有解决商业应用的痛点。
DPoS股份授权证明机制,类似于董事会投票,持币者投出一定数量的节点,代理他们进行验证和记账。优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证;缺点:整个共识机制还是依赖于代币,很多商业应用是不需要代币存在的。
PBFT实用拜占庭容错机制,一个节点代表一票,少数服从多数。优点:无分叉,资源消耗低;缺点:安全性依赖于失效节点数量,节点过少会轻易突破51%,导致作弊。算法效率依赖于参与协议的节点数量,不适用于大规模区块链系统,扩展性差。
Pool验证池,基于传统的分布式一致性技术,加上数据验证机制,是目前私有链大范围在使用的共识机制。优点:不需要代币也可以工作,在成熟的分布式一致性算法(Pasox、Raft)基础上,实现秒级共识验证;缺点:去中心化程度不如bitcoin,更适合多方参与的多中心商业模式。
4. 适用范围
本节按照区块链的组织方式,分析目前主要共识机制的适用范围。区块链的组织方式大致可以分为三种:
1) 私有链:封闭生态的存储网络,所有节点都是可信的,使用传统分布式一致性模型最优;
2) 联盟链:半封闭生态的交易网络,存在对等的不信任节点,使用DPFT最优;
3) 公有链:开放生态的交易网络,及所有人都可以参与交易,没有任何限制和资格审核,使用PoW最优。
下一代共识机制
在保证安全性和一致性的基础上,对于共识机制的研究[12]一直围绕在如何平衡系统的性能效率、扩展性和资源消耗等因素上。由于不同共识机制的特点不同,如何将各具优势的共识机制巧妙组合,根据具体业务场景,设计综合评价最优的共识机制,是未来研究的主流方向。
根据初步调研,针对区块链共识机制在金融应用(联盟链)上的发展趋势,三句话总结个人认识:
传统一致性机制经典依旧;
蛮力挖矿呈现下降趋势;
组合机制成为后起之秀。
[if !supportLists][1] [endif]Fischer M J, Lynch N A, Paterson M S.
Impossibility of distributed consensus with one faulty process[M]. ACM, 1985.
[if !supportLists][2] [endif]Towards
Robust Distributed Systems, Eric Brewer, 2000
[if !supportLists][3] [endif]Lamport L. Paxos made simple[J]. ACM Sigact
News, 2001, 32(4): 18-25.
[if !supportLists][4] [endif]Raft算法简介:https://raft.github.io/
[if !supportLists][5] [endif]Castro M, Liskov B. Practical Byzantine fault
tolerance[C]// ACM, 1999:173-186.
[if !supportLists][6] [endif]PoW
wikipedia. https://en.wikipedia.org/wiki/Proof-of-work_system
[if !supportLists][7] [endif]PoShttps://en.bitcoin.it/wiki/Proof_of_Stake
[if !supportLists][8] [endif]《授权股权证明机制白皮书》 Delegated Proof of Stake (DPOS) White Paper by Daniel Larimer
[if !supportLists][9] [endif]DPoSDelegated Proof-of-Stake Consensus - BitShares
[if !supportLists][10] [endif]《以太坊白皮书》
[if !supportLists][11] [endif]《白话区块链》
[if !supportLists][12] [endif]韩璇, 刘亚敏. 区块链技术中的共识机制研究[J]. 信息网络安全,
2017(9):147-152.
[if !supportLists][13] [endif]IBM技术微讲堂HyperLedger
Fabric中的共识机制
[if !supportLists][14] [endif]区块链共识机制浅谈https://blog.csdn.net/Jeffrey__Zhou/article/details/56672948