steemit上原文链接:https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper
关于BitShares的DPoS共识的概述请参考:股份授权证明(DPOS)概述
关于BitShares的DPoS共识的详细介绍请参考:BitShares的DPoS共识
关于BitShares的DPoS共识的竞争链共识补充说明请参考:DPOS共识算法 - 缺失的白皮书
关于BitShares的DPoS共识之代码实现概述请参考:BTS的DPoS共识之代码实现概述
这是缺少的白皮书和关于股份授权证明(DPOS: delegated proof of stake)的分析。 本白皮书的目标是分析DPOS为什么起作用以及其为何如此健壮。 有关DPOS的早期描述可以在bitshares.org上找到。 不过,那个描述还包括许多与实际共识过程不符的部分。
所有区块链本质上都是一个由交易驱动的确定性状态机。共识是商定确定性交易顺序和过滤无效交易的过程。有许多不同的共识算法都可以产生等效的交易排序,但DPOS已经通过在多个区块链上经年累月的可靠运行证明自身是健壮、安全和有效的。
和所有共识算法一样,区块生产者可能导致的最大损害是审查。根据确定性开源状态机原理,所有区块必须有效。
1. DPoS共识算法概要
DPOS算法分为两部分:选择一组区块生产者和调度生产区块。要确保选举过程由股东最终控制,因为当网络连接不畅通时,股东的损失最大。选举方法对实际运行中如何达成共识几乎没有影响,因此,本文将重点介绍如何在区块生产者被选择之后达成共识。
为了帮助解释这个算法,我只假设3个区块生产者A,B和C。因为共识(的达成)需要2⁄3+1(个节点)来解决所有情况,这个简化的模型将假设生产者C是打破僵局的那个节点。在现实世界中,将有21个或更多的区块生产者。像工作量证明(PoW)一样,一般规则是最长链胜出。任何时候当一个诚实的对等节点看到一个有效的更长链,它都会从当前分叉切换到更长的这条链。
我将通过示例展示,在几乎所有可能想得到的网络条件下,DPOS是如何运行。这些例子应该可以帮助你理解为什么DPOS稳健且难以破坏。
2. 正常生产流程
在正常操作模式下,区块生产者们每3秒钟轮流生成一个块。假设没有节点错过自己的轮次,那么这将产生最长链。区块生产者在被调度轮次之外的任何时间段出块都是无效的。
3. 少数节点分叉
不超过节点总数1⁄3的恶意或故障节点可能创建少数分叉。在这种情况下,少数分叉每9秒只能产生1个块,而多数分叉每9秒可以产生2个块。这样,诚实的 2⁄3多数将永远比少数(的链)更长。
4. 离线少数节点的双重生产
(离线的)少数节点可以试图产生无限数量的分叉,但是他们的所有分叉都将比多数节点的那条链短,因为少数节点在出块速度上注定比多数节点来的更慢。
5. 网络分片化(Fragmentation)
网络完全有可能分片,从而导致多个分叉,且所有分叉都不拥有多数区块生成者。在这种情况下,最长的链将倒向最大的那个少数群体。当网络连通性恢复时,较小的少数群体会自然切换到最长的那条链,明确的共识将恢复。
有可能存在这样三个分叉,其中两个最长的分叉长度相同。在这种情况下,第3个(较小)分叉的区块生产者重新加入网络时会打破平局。区块生产者总数为奇数,因此不可能长时间保持平局。稍后我们还会讲到“洗牌”生产者,它使得出块顺序随机化,从而确保即使是生产者数目相同的两个分叉也会以不同的步长增长,最终导致一个分叉超过另一个。
6. 在线少数节点的双重生产
在这种场景下,少数节点B在其时间段内产生了两个或更多可供选择的块。下一个计划生产者(C)可以选择基于B产生的任何一种方案继续构建链条。一旦如此,这个选择就成为最长的链,而所有选择B1的节点都将切换分叉。少数不良生产者企图广播再多的替代块也无关紧要,它们作为最长链的一部分永远不会超过一轮。
7. 最后不可逆区块(Last Irreversible Block)
在网络分片化的情况下,多个分叉都有可能持续不断增长相当长的时间。长远来看最长的链终将获胜,但观察者需要一种确切的手段来判定一个块是否绝对处于增长最快的那条链。这可以通过观察来自2/3+1多数区块生产者的确认来决定。
在下图中,块B已被C和A所确认,这代表已经被2⁄3+1的多数节点确认了,由此我们可以推断没有其它链会比这个更长 – 如果这2⁄3的生产者是诚实的。
请注意,这个“规则”类似于比特币的6块确认“规则”。一些聪明节点也许可以谋划一系列事件使得两个节点(“交易”?)出现在不同的最后不可逆区块上。这种极端例子要求攻击者能完全控制通信延迟,并且在几分钟内两次--而不是一次--使用该控制。即便这真的发生了,那么最长链(胜出)的长期规则仍然适用。我们估计这种攻击的可能性接近0,且经济损失微不足道,因此不足为虑。
8. 法定(Quorum)生产者节点数不足
在缺乏明晰的生产者法定节点数这种不太可能的情况下,少数节点还是可以继续出块。股东可以在这些块里包括更改其投票的交易。这些投票可以选出一组新的生产者,并将出块参与率恢复到100%。一旦如此,少数链将最终超过所有其他以低于100%参与率运行的链。
在此过程中,所有观察者都会知道,在一条参与率超过67%的链形成之前,网络状态一直处于变化之中。那些选择在此条件下进行交易的节点所冒的风险与选择接受少于6次确认的节点相似。他们这样做是因为知道共识最终落在另一个分支上的可能性很小。在实践中,这种情况比接受少于3个比特币交易确认区块要安全多了。
9. 多数生产者舞弊(Corruption)
如果多数生产者变得腐败,那么他们可以产生无限数量的分叉,每个分叉都看起来以2/3多数确认向前推进。这种情况下,最后不可逆块算法蜕回为最长链算法。最长链就是为最大多数所认可的那条链,而这将由少数剩下的诚实节点决定。这种行为不会持续很长时间,因为最终股东会投票替换掉这些生产者。
10. 交易作为权益证明(TaPoS: Transactions as Proof of Stake)
当用户为一个交易签名时,他们这样做是假设当前区块链的状态已经确定了。这个假设是基于他们对最近几个区块的认可。如果最后共识的最长链发生改变,那么它可能会使签署者同意交易时的假设无效。
就TaPoS而言,所有交易都包含最近一个区块的哈希值,如果该区块最终在链历史中不存在,那么这些交易被认为是无效的。任何在孤立分叉上给交易签名的节点,都会发现该交易无效且无法迁移到主分叉。
该过程的另一个作用就是,可以抵御试图产生替代链的长期攻击。每个股东在每次交易时都直接对区块链做出确认。随着时间推移,所有的块都是由所有股东确认过的,而这是无法在伪造链中复制的。
11. 确定性生产者洗牌(Shuffling)
在上面所有例子中,我们展示的都是区块生产者按调度循环出块。实际上,每生产N个区块(N是生产者数量),区块生产者集合都会洗牌一次。这种随机性确保块生成者B不会总是忽略块生成者A,每当形成多个拥有相同数量生产者的分叉时,均势最终都会被打破。
12. 结论
在每一种我们能想到的网络自然分片的情况下,股份授权证明(DPoS)都是健壮的,甚至在面对大多数生产者舞弊的情形时也是安全的。不像其它共识算法,当大多数生产者失效时,DPOS还是可以继续工作。在此过程中,社区可以投票替换掉不合格的生产者,直到恢复100%参与率。我还不知道有任何其它算法可以在如此高强度和多变的故障条件下依然保持健壮。
说到底,DPOS获得显着的安全性是由于选择了这样的算法:挑选区块生产者、验证节点是否高质量和是否独立的个体。运用赞成投票的过程可以确保一个节点即使拥有50%的有效投票权也不能独自挑选哪怕一个生产者。DPOS旨在优化具有健壮网络连接和诚实节点100%参与绿的名义条件的性能。这使得DPOS有能力在平均只有1.5秒的时间内以99.9%的确定性来确认交易,同时变差也是以优雅和可检测的方式 ,而且从较差状态中恢复到正常也不过是小事一桩。
其它共识算法以网络状态差和不诚实节点为名义条件进行设计,这样设计的最终结果就是性能更差、延迟更高、通信开销高的网络,而且这种网络在33%节点失效的情况下就会完全停摆。
DPoS在BitShares成功运行了3年并在Steem运行一年期间,我们经历了各种各样的网络条件和软件错误。DPOS已经成功地驾驭了这种环境,并展示了它能够在处理比其他任何区块链更多的交易的同时保持共识的能力。