死磕共识算法|DPOS(委托股权证明)算法
配合以下代码进行阅读:https://github.com/blockchainGuide/
写文不易,给个小关注,有什么问题可以指出,便于大家交流学习。
DPOS详解
DPoS共识算法就是将PoS共识算法中的记账者转换为指定节点数组成的小圈子,而不是所有人都可以参与记账,这个圈子可能是21个节点,也有可能是101个节点,只有圈子内的节点才能获得记账权。这将极大地提高系统的吞吐量,因为更少的节点也就意味着网络和节点的可控。
DPOS的股东选举机制:
- DPoS机制中的股民(节点)根据自己持有的加密货币数量占总量的百分比(占股比例)来投票,不是一人一票;
- 选举出的股东代表(可信节点)完全对等,可理解为具有同等算力的101个矿池;
- 股东代表一旦无能、不作为、胡作为(提供的算力不稳定,计算机宕机、或者试图利用手中的权力作恶),将立刻被股民踢出整个系统,然后由其他后备代表顶上去;
- 决策完公司大事(记完账、出完块)有钱分,根据占股比例。
DPOS算法分析
在DPoS共识算法中,区块链的正常运转依赖于见证人(Delegates),见证人是由全网节点投票产生的,见证人也是记账节点的实际控制人,相当于咱们选课代表,课代表帮我们整理作业
见证人在完成打包交易的同时可以领取区块奖励和交易的手续费,并且可以执行社区投票的提案,所以DPoS共识算法不仅仅是算法,而是一个包含了协作治理关系的共识机制。
DPoS为了尽快确定交易顺序,过滤无效交易,所以规定了在正常情况下,所有记账节点轮流每3秒产生一个区块,轮到了某个记账节点出块时,必须在2秒内提交区块,否则就会错块。
假设一直没有记账节点错过自己顺序,那么他们生产的链条势必是最长的链条,如果记账节点在非指定时间生产区块被认为是无效的,每经过一轮,所有节点轮流出块的顺序就会发生重新洗牌。
下图就是一个理想的轮流记账状态:
DPoS算法白皮书还介绍了以下几种不正常的情况:
①:少数记账节点发起恶意分叉或者发生故障
可以允许最多1/3的节点是恶意或故障,从而导致出现分叉。在这种情形下,少数分支将只能在9秒内生产1个块,而大多数分支,由于数量多一倍,将预期能在9秒内生产2个块。再一次,诚实的2/3的大多数可以比小的那一部分创建一个更长的链条。
②:隔离环境下的重复块生产
少数群体可能尝试创建一个无限数量的分叉,但所有分支都将比主链短,因为少数群体在链的成长上更慢。
③:网络碎片
网络非常有可能碎片到,没有哪一个链上的区块生产者占到了所有区块生产者中的大多数。在此情景下,最长的那个链将变成最大的一个少数群体。当网络连接恢复正常后,相对较小的那些群体将自然的切换到最长的链,从而将恢复明确的共识。
还有一种非常可能的情况是,三个分支中,最大的两个分支一样大。此时,将由相对更小的第三个分支加入网络时来打破僵局。存在奇数个区块生产者,所以僵局一般不会持续很久。后面我们还将介绍区块生产者的清洗,会将生产者随机生成顺序,以确保即使两个分支具有相同数量的生产者,分支也将以不同的长度爆发增长,导致一个分支最终接管另一个分支。
④:少数群体重复生产
在这种情景下,少数群体B在自己可以生产的时间节点,同时创建两条,或多条的区块链。下一个执行的生产者C,将选择B创建的可选链中的任一条。C选中的这条链将成为最长的链,当这发生是,所以如下图所示的B1链条上的结点都会转过来。所以,无论少数做恶结点制造多少的链,他们在下一轮中,肯定不会是最长的那个链。
⑤:最后的不可逆区块
在网络碎片的情况下,多个分叉可能持续较长时间的隔离。长远来看,最长的链将最终受到认可。但观察者需要一种手段来确定某个块是否是在最长链条的一部分(确认共识)。这可以通过2/3 + 1个区块生产者是否对某个块有确认。
下图中,块B被A、C确认了,这意味着2/3 + 1都已经确认了。由此我们可以为不可能存在更长的链了,因为2/3的区块链是诚实。
需要注意的是这个规则与比特币的6个区块确认类似。一些聪明的人可以设计一系列事件,其中两个节点可能会在不同的最后不可逆块上结束。这种极端情况需要一个攻击者,精确控制通信延迟,并需要在几分钟内实施不止一次,而是二次攻击。如果发生这种情况,那么最长链条这一长期规则仍然适用。 我们估计这种攻击的可能性足够接近0,经济后果也微不足道,不值得担心。
⑥:不足法定区块生产者
在一些不太可能的情况下,生产者没有明确达到法定人数,少数人可能继续生产块。在继续生产的区块中,利益相关者可以包含一些改变投票的交易。这些投票会选举一组新的区块生产者,并将区块生产参与度恢复到100%。一旦发生这种情况,少数人链最终会超过其它低于100%参与链。
在这个流程发生时,所有的观察者必须要明白整个网络处于不稳定的状态,直到多于67%参与者出现后才会稳定下来。哪些选择在这种情景下发起交易的,与那些在比特币中接受低于6块就确认交易成功那样,冒着类似的风险。他们必须明白,存在某些情况下,共识最终会以另一个链为准。在实践中,这种情形比在比特币中接受少于3个块就确认更加安全。
⑦:大多数据区块生产者的腐败
如果大多数区块生产者合谋变得腐败,他们制造无限数量的分支,每一个分支都有多于2/3的大多数的签名。在这样的场景早,最后不可逆转块算法退化为最长链算法。此时最长的,获得了最大的群体认证的,将由少数的诚实节点的加入来确定。这样的情形不会持续很久,因为利益相关者会最终投票替换掉这些区块生产者。
DPOS要解决的问题
从名称上,我们也可以判断出DPoS
与PoS
共识是直接关联的。DPoS
算法是BM根据当时PoW、PoS的不足而改进的共识算法,它的目的就是为了提高性能,也就是交易确认时间短。
在PoS
共识中,人们使用财产证明来“挖矿”,也就是说,这是任何人都可以参与的,只要你持有币,你就可以参与挖矿。但是PoS
并没有解决性能问题,在这里我们直接认为提高性能就是提高TPS
,如下:
TPS = transactions / block_time
TPS表示区块链每秒能确认的交易数, transactions
是由区块大小block_size
和平均每笔交易大小决定的,而区块大小受全网网络状态network_bandwidth
限制,也是由记账节点之间物理带宽witness_performance
决定的。
记账节点的个数witness_count
直接决定了物理带宽的上限,因为记账节点数量越多,则对物理带宽要求越高,对网络的稳定性要求也越高。
要注意的一点是在DPoS
中,记账节点不叫做矿工,而是改称为见证人,Witness
。所以这个公式变成了下面的样子:
TPS = (block_size_network_bandwidth witness_performance)/(block_time * witness_count)
我们可以看到,要提高TPS,可以增大区块大小block_size
、提升记账节点网络带宽network_bandwidth
、提升记账节点处理性能witness_performance,减小区块时间block_time
、减小记账节点数量witness_count
。
分子项我们可以看到,它基本受限于物理资源的上限,目前工业水平制造的物理资源的使用上限基本就是整个项的上限了,所以可操作性不大。
而分母项是由共识算法决定的,所以我们从区块时间,以及记账节点数入手,DPoS算法便正是从这两项着手的。
首先改动的便是限制记账节点的数量,也就是见证人的数量。
我们在PoW和PoS中可以看到,成为记账节点是无需门槛的,你可以随时参与挖矿,随时退出。
那这会带来什么问题呢,首先无法确定记账节点的数量,其次无法确定记账节点之间的网络环境,记账节点数越多网络环境越复杂,这些不确定性会增大网络分区的概率,从而导致区块链分叉。
如果我们事先规定好记账节点的数量,接着让全网所有节点可以投票决定哪些节点可以成为记账节点,这样就限制并减小了分母项witness_count
,这个过程我们也称作投票选举。
因为记账节点数量不多,那么我们可以在共识算法中可以规定出块时间为一个固定值,这个值可以很小,通过轮流出块的方式来进行记账。
以上思路基本就是DPoS的基本设计思路,BM还为DPoS算法确立两个原则:
- 投票选举过程一定要保证最大权益所有者最终能控制全网,因为一旦出了问题,他们的损失最大;
- 与PoW、PoS一样,所有节点仅承认“最长”链。
这两个原则确立了DPoS共识的基本特性,第一条放大了PoS共识使用者就是记账者的优点,第二点则规定了分叉时系统应该表现的行为。
参考
https://github.com/blockchainGuide
https://eth.wiki/en/concepts/casper-proof-of-stake-compendium
https://eth.wiki/en/concepts/casper-proof-of-stake-compendium