背景
共识算法是区块链项目中最核心的部分,有分布式,就需要达成共识。共识算法对于加密货币而言至关重要的,因为它可以防止双花问题。
从历史上看,双花问题是限制数字货币发展的一个重要挑战,直到采用了分布式账本之后才得以改观。正因为加密货币是由公开的和不可篡改的分布式账本实现的,因此必须采用共识算法来验证账本是否具有唯一性,以保证整个加密货币网络不被恶意节点所破坏。因此,共识算法必须具备容错的能力。例如,通常假设只需要一部分节点作出反应,但最少需要百分五十一的节点反应。
主流共识介绍
在当前的多个项目中,有四种主要的实现方式:工作量证明(pow),权益证明(pos),委托权益证明(dpos)和EOS中使用的BFT-DPOS共识,每个都有其独特的优点和缺点。
工作量证明(pow)
工作量证明是第一个成功的去中心化区块链共识算法,工作量证明被比特币和其他的一些加密货币使用,工作量证明要求节点参与者执行复杂的计算,计算出符合要求的结果,而对于其他网络参与者来说要易于验证。
Pow的过程,即为不断调整Nonce值,对区块头做双重SHA256哈希运算,使得结果满足给定数量前导0的哈希值的过程。其中前导0的个数,取决于挖矿难度,前导0的个数越多,挖矿难度越大。
pow挖矿过程:
1.生成一笔交易,并与其它所有准备打包进区块的交易组成交易列表,生成Merkle根哈希值。
2.将Merkle根哈希值,与其它字段组成区块头,80字节长度的区块头作为Pow算法的输入。
3.不断变更区块头中的随机数Nonce,对变更后的区块头做双重SHA256哈希运算,与当前难度的目标值做比对,如果小于目标难度,即Pow完成。
Pow完成的区块向全网广播,其他节点将验证其是否符合规则,如果验证有效,其他节点将接收此区块,并附加在已有区块链之后,之后将进入下一轮挖矿。
POW的优点:
完全去中心化和分布式账本。
POW的缺点:
计算复杂,浪费资源,交易吞吐量较低。
权益证明(pos)
权益证明也是需要节点进行计算,最后计算的结果小于难度值,则抢到区块的概率越高。要求所有的参与者抵押一部分他们所拥有的token来验证交易。不同于通过完成复杂计算问题来验证交易,验证者需要通过锁定token来完成交易验证。选取交易验证者的方式通常是根据他们所抵押的token占整个网络代币的比例,以及token抵押时长,因为抵押的token越多,持有的时间越长,计算的难度就越小。权益证明通过长期绑定验证者的利益和整个网络的利益来阻止不良行为。通过锁定代币,如果验证者存在欺诈性交易,那么他们所抵押的token也会被削减。
PoS一个重要的概念是币龄,币龄 = 持有的币数 * 持有币的天数,例如钱包里有90个点点币,都持有了10天,则币龄=900。与PoW一样,为了抢到将区块写入区块链的权利,节点同样要进行hash计算,只不过最终的解和币龄有关,计算公式:
proofHash < coinAge * target;
coinAge是币龄,target是一个目标值,用于调整难度。coinAge * target的值越大,难度就越小,抢到区块的概率就越高。
pos挖矿过程:
1.团队运行节点;
2.注册成为验证人;
3.Staking过程(持币人委托给节点,或是团队自由代币进行Staking委托);
4.选举验证人(系统通过算法选出每一轮的出块节点或是验证节点);
5.打包交易、广播交易、验证人确认一连串过程;
6.获得奖励(奖励是由节点与持币人按照Staking比例分配);
PoS的优点:
(1) 不需要PoW那么大的算力,可以减少资源浪费;
(2) 不容易遭受51%攻击,相比起掌握系统一半以上的算力,拥有整个系统51%的财力会更加困难。
PoS缺点:
(1) 容易被垄断:因为持币越多,持有的越久,币龄就越高,越容易挖到区块并得到激励,持币少的人基本上没有机会,这样整个系统的安全性实际上会被持币数量较大的一部分人(大股东们)掌握;而比特币则不存在这个问题,因为理论上任何人都可以购买矿机获得提高自己的算力(甚至可以联合起来),提升自己挖矿成功的概率;
(2) 很难应对分叉的情况:当出现分叉时,PoS可以在两条链上同时挖矿并获得收益。而PoW则不存在这个问题,因为当出现分叉以后,PoW总是选择工作量大的链做为主链。
委托权益证明(dpos)
虽然委托权益证明和权益证明名字差不多,但实施细节却有显著的不同。在委托权益证明中,不同于权益证明的抵押token来验证交易,而是通过token的持有者投票产生一组交易验证者(超级节点)。委托权益证明是去中心化的,因为网络中的所有参与者都能参与投票选取节点来验证交易,但也是中心化的,因为只有一组交易验证者,这样的好处就是提高交易和验证的速度。由于区块生产者数量有限,DPoS能够处理的事务吞吐量比PoW高出多个数量级。委托权益证明的实施中需要维持良好的信誉,通过持续投票流程以及验证节点的更换,来得以保证选取产生的验证者有良好的责任心和信任感。
委托权益证明的优势在于良好的可扩展性以及快速的交易验证,但是缺点在于部分中心化。委托权益证明目前被用于Steemit,EOS和BitShares等项目中。
DPoS,以限制网络上验证者的数量为代价,提供高级别的可扩展性。其中固定数量的选定实体(称之为区块生产者或见证人)被挑选来以循环顺序创建区块。区块生产者由网络用户投票决定,他们每个人都得到与他们在网络上拥有的代币数量(他们的股份)成正比的选票。或者,选民可以选择将他们的股权委托给另一名选民,被委托的选民将代表他们投票选举区块生产者。DPOS与POW最大的区别是不用计算,生产者由投票决定,并已确定好生产顺序来依次生产区块。
DPoS的优点:
提高了交易和验证的速度,处理事务吞吐量比今天的PoW高出多个数量级。
DPoS的缺点:
1.投票的积极性并不高:绝大多数持股人从未参与投票。这是因为投票需要时间、精力以及技能,而这恰恰是大多数投资者所缺乏的。
2.垄断性高:PoW下几乎没有门槛,任何人都可以投入算力,通过竞争获得区块奖励。而DPoS延续了PoS的弊端,只有持币者才可以获得区块链奖励,其实这就带来了一种制度性门槛,最终导致DPoS币的流动性大大减少,穷者越穷,富者越富。
BFT-DPOS共识机制
拜占庭容错机制(BFT)
BFT( Byzantine Fault Tolerance)称为拜占庭容错,拜占庭容错技术是一类分布式计算领域的容错技术。拜占庭将军的问题,当 n > 3m 时,即叛徒的个数 m 小于将军总数的 n 的 1/3 时,通过口头同步通信(假设通信是可靠的),可以构造同时满足“一致性”和“正确性”的解决方法,即将军们可以达成一致的命令。
N个区块生产者由区块生产者候选人被选举出来,当一个区块被(2/3 + 1)个区块生产者确认时,它会得到最终确定(即不可逆转)。
选民如果发现区块生产者是恶意的(即试图审查事务或双重支出),则可以通过在下一轮投票时不给他投票“炒掉”他。
EOS的共识机制采用(BFT-DPOS)共识机制,EOS通过投票的方式选举出21个超级节点作为记账节点,21个区块生产者通过token持有者的投票被选出,选中的生产者依据商定好的顺序生产区块,这个顺序由21个生产者商定,每生产10轮,21个节点会从新投票被选出。如果轮到某节点出块而没有出块,则该节点可能被投票出局,由其他备选节点顶替,每个节点有6秒的时间片,轮流出块,每0.5秒出一个块,每个生产者节点每次出12个块(6/0.5)。
DPoS共识加上BFT算法后,生产节点出块时,会确认收到的块,同时向剩下20个节点进行广播,如果有超过(2/3+1)的节点验证通过,则将该区块加入备选不可逆块列表中(单节点验证成功),当全网有超过(2/3+1)的节点把该区块验证通过后,最后的不可逆块是从排好序的备选不可逆块列表中取1/3处获取,因为可能存在网络问题,会导致最后的不可逆块冲突(后面章节详细介绍),为了解决冲突,需要对备选不可逆块再做(2/3+1)次确认。
优点:
BFT-DPOS可以使得EOS的出块和确认块速度显著增加,并且可以解决网络延迟造成的块丢失问题。
缺点:
1.投票参与度较低,要成为生产节点,配置要求较高,普通人很难参与,导致投票积极性不高。
2.token垄断性高,普通人很难成为生产者,获取奖励。
总结
各种共识的优缺点: