委托股权证明原理(DPOS)--翻译及解读

自述

关于这个共识算法,小编其实有很多想说的,码了一个多小时的见解,考虑良久后,还是不打算把这见解发出来了,一千个人一千个哈姆雷特,
数十种共识算法中,它能被众人所知,那它必然是有它的优势。哲学上来说,存在即是合理。

DPOS最初是石墨烯提出来的,国内外也有几个基于石墨烯的区块链已经落地很久,运转也良好。
这个算法小编再三考虑后,还是打算讲一下它的原理,当然,小编不会从头讲。eos白皮书里引用了一个讲解dpos原理的英文论坛地址,小编会将其翻译成中文,并加入自己的见解。
虽然国内已经有人翻译过了,但为了自己能更好的走下去,小编还是打算自己再翻译一遍吧。

以下正文

前言

英文原文地址:https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper
这是EOS白皮书中缺失的关于讲解DPOS原理的部分内容。本文主要是讲DPOS怎样运行以及它的鲁棒性为什么很强。早期也写了一篇关于描述DPOS机制的文章;然而,那篇文章中还包含了许多不是关于共识机制的内容(wj备注:那篇文章写的冗长,看的心累,然并卵,我只需要知道DPOS是什么就行
所有的区块链本质上是由交易驱动的确定性状态机。共识的过程是用来确定被认可的交易顺序以及过滤无效的交易。目前已经有很多共识算法已经可以产生类似的有效交易排序,然而DPOS通过在不同的区块链项目中多年运转,已经证明了它拥有强鲁棒、高安全、高效率等特性。
就像所有的其它共识算法一样,块生产者能够引起的最大的危害审查。所有的块在基于确定性的开源状态机逻辑中必须是有效的。

DPOS算法综述

DPOS算法被分为两部分:选取一组块生产者以及生产调度。选举过程要确保最终是由利益相关者来控制的(小编的理解,也就是token持有者来控制选举过程),因为网络不流畅时候,利益相关者的损失是最大的。人们是如何选举的,对于每时每刻的共识达成来说影响很小。因此,本文主要是聚焦在当块生产者被选出来后共识是如何达成的这一问题上。
为了更好的解释这个算法,我想假设三个块生产者:ABC,因为共识的达成是需要2/3+1比例数量的生产者来解决期间遇到的所有情况。在这个简化的模型中会假设C是一个打破平衡的生产者。在真实的场景中,一般会有21个或者更多的生产者。就比如工作量证明(POW),一般规定最长链为被认可的链(小编理解就是,这个规则作为打破平衡的条件,就类似前面提到的生产者C,当A、B各作出一个不同选择而达到平衡时,C必须选择跟A或者跟B,无论结果怎样,都会打包当前的平衡),任何时候,一个诚实的对等节点,看到一条有效的更长的链,自己都会从当前分支切换到最长链上。
我将会在任何能够想象到的网络状态下,通过例子展示DPOS是如何运行的。这些例子将会帮助你更清楚的认识,为什么DPOS鲁棒性强并且难以破坏。
注意:以下描述的案例,都是以3个节点为标准的

一般操作

在一般情况下,块生产者轮流每3秒钟生产一个块(小编补充一句,EOS将这一机制压缩到0.5秒了,公信宝还是3秒钟)。假设每轮中,每个生产者都没有错过生产块的机会,那么就会产生一条最长链。在被正常调度轮次之外,块生产者生产的块是无效的。

少数分叉

不超过1/3的节点是恶意的或者是故障的,并且它们有可能会制造少量的分叉。这种情况下(小编备注:这里是假设1/3的节点制造了一条分叉,也就是案例中3个节点中的1个节点),该分叉链每9秒钟产生一个块,而未分叉的2/3的节点所在链(案例中的2个节点),每9秒钟会产生2个块(这块小编按自己的理解翻译的,原文直译过来很晦涩),如此,拥有2/3节点的链始终比1/3节点的链长(也就是说,拥有2/3节点的链是被认可的诚实链)。

少数离线节点进行多重生产

少数离线的节点试图产生无限多的分支,但是它们每个分支都会比拥有多数节点的主链短。因为,拥有少量节点的分支,出块的速度始终比拥有多数节点的分支产生块的速度慢。

网络碎片化

网络碎片化(就是各种网络不稳定)完全有可能导致没有一个分支拥有较多的块生产者(就是每个分支都有相差不大的块生产者)。这种情况下,生产者数量最多的那个分支将会被认为是主链。当网络状况恢复正常时,拥有较小数量生产者的分支将会倒向最大的那个分支,明确的共识也将会恢复。

完全有可能会有这样一种情况:有3条分支,而其中最长的2条分支的长度是一样的。此时,较短分支中的块生产者切换回这两条较长分支中的任意一条,平衡都会被打破,就是说其中一条变成了最长链(好吧,这块小编按自己的理解解释了,原文翻译过来看的会很心累的)。随后我们将讨论块生产者的洗牌机制,如此将会使得生产块的顺序是随机化的,这样就能保证即使两个分支分别拥有相同数量的块生产者,生产块的步长也是不一样的,最终导致其中一条分支长度比另一条长。

少数在线节点进行多重生产

在这种情况下,少数节点B同时生产了2个或者更多的块(正常生产者是只能生产一个块的),下一个正常生产者C生产出的一个块,要选择B生产的其中一个块作为父类块(这块小编也是按中文理解重新组织了语义,原文直译不好理解),一旦C选择了其中一个作为父类块,那逻辑上可判断出,C当前所在的链是最长链,B产生的其它块都是短链,如此一来,后面所有的节点都会以最长链为标准。主链上少数的不良生产者即使企图同时生产多个块也不会影响全局,每轮中,即使它们每个能生产的块再多,也最多只有一个能被认可。

最终不可逆转块(后半部分不知道是什么意思,求教)

在网络碎片的情况下,很有可能多个分叉同时增长相当长的时间。长远来看,最终还是会有一条最长的链胜出的。但是观察者需要一种准确的手段来知道,一个块绝对是在增长最快的那条链中。这个可以通过2/3+1多数块生产者的确认来决定。
在下面图中,块B已经被CA确认,这代表了2/3+1数量的确认。从中也可以知道,若2/3+1的生产者是诚实的,就不会有其它分叉链会比这条链长。

需要注意,这个规则类似于比特币中6个块的确认机制。一些聪明的人会设法促成一系列的事件,使得两个节点出现在不同的最后的不可逆块上,这种极端情况,需要攻击者能够完全的控制网络通信的延迟,同时在几分钟的时间内两次使用这个控制。但是,即便这种事发生,最长分支胜出的规则仍然是适用的。
我们评估后认为,这种估计成功的概率几乎为0,经济后果也不足为虑,因此也没必要担心。(然并卵,这一段话小编没看懂是在说什么,讲的太含糊了

生产者的法定人数不足

在某些情况下,块生产者的法定人数有可能不足,这种情况下这些生产者也是可以继续出块的(就是说生产者参与人数不是100%)。在这些块中的利益相关者,是可以包括更改投票的交易(小编理解:这句话的意思是,每一次投票也属于一个交易,这个交易信息被包含在这些块利益相关者之中了),这些投票可以选出一组新的生产者,并将块生产者参与率恢复为100%。这样一来,不久之后,短链(假设短链块生产者人数逐步由不足100变为了100%%)终将会超过长的链(假设长链块生产者人数不足100%)。
在这一个过程中所有的观察者都会明白,在一条链的块生产者参与率达到67%以前,整个网络状态是不稳定的。在这种状况下进行交易的风险(就是生产者的法定人数不足),类似于在比特币中块的确认不足6个。他们之所以愿意冒这个风险,是因为他们知道存在这样一种可能,最终会在不同的分叉中,各自建立共识。实践检验得知,dpos生产者的法定人数不足时候的问题,相比于比特币中少于3个块的确认问题安全很多。

多数生产者腐败(就是作弊)

如果大多数生产者作弊,这样就会产生无限数量的分叉,每个分叉看着都像是2/3确认的机制进行的。这种情况下,最终的不可篡改块的算法变成了最长链算法。最长链就是大多数生产者所认可的那条链,而这条链也是诚实节点所认可的链。这种行为不会长时间存在,因为最终会被利益相关者投票替换生产者。

基于交易的股权证明机制(TaPOS)

当用户对交易进行签名时,他的这个行为是在一定条件下假设的区块链状态中执行的。这个假设是基于最近几个块来预测的。如果最长链的共识发生了改变,潜在的会使得签名者根据先前的假设所认可的交易失效(小编觉得有点拗口,就是说,你先前根据当前链的状态判断自己的交易没问题,但是最终链的共识发生了变化,那你的交易就没能被记录进去,那就失效了)。
在TaPOS机制中,所有交易都包含最近一个块的hash,如果在链已有块中没有发现这个块,那这个块所包含的交易都会被认为是无效的(那这个块就被孤立了)。任何人在被孤立的块上进行交易都会发现交易是无效的,并且无法迁移到主链。
这个过程的另一个作用是,可以抵御意图通过长期攻击来形成另外一条链的行为。每个利益相关者在每次交易时,都会直接对交易作出确认。随着时间的推移,所有的块都是由所有的利益相关者确认,这也是无法伪造链的原因。

确定的对生产者洗牌(就是说公平的洗牌规则

在前面讲的所有例子中,我们展示的都是按顺序调度块生产者。实际上,每N个块之后就会对所有块生产者进行一次洗牌(N表示块生产者的人数)。这种随机方式确保了每个生产者都能公平的参与到块生产中来,全员参与,一个也不会被忽略(这句话小编换了一种说法),并且当形成拥有相同数量的块生产者的多个分叉时,这种僵局总会被打破。

总结

在我们能够想象到的自然网络异常或者大量生产者作弊的情况下,DPOS的鲁棒性都是很强的。不像别的共识算法,当大多数生产者不合格时,DPOS仍可以正常运转。这种时候,社区会通过选举来替换这些不合格的生产者,直到恢复为100%的参与度为止。我还没有发现别的还有哪个算法在高强度和多种异常变化的条件下依旧能够有如此好的鲁棒性(怎么说吧,小编觉得,要满足市场所需,又要满足安全可靠,DPOS是个合适的选择,就看怎么具体设计了)。
总的来说,DPOS引人注目的安全性来自它的选择块生产者和验证高质量节点的算法,使用这样一个投票方式,确保了即使某个人拥有50%的投票权,也不能光靠自己就选出一个生产者。DPOS通过优化确保拥有健壮网络连接的诚实节点都能够100%的参与到投票中来,这使得DPOS能够在平均1.5秒内准确的确认99.9%的交易,同时也可以通过优雅和可检测的方式很容易的实现降级(就是恢复)。
别的共识算法在网络条件差的不诚实节点的条件下进行设计,设计的结果结果导致网络性能低、高延迟、高开销,并且如果33%的节点失效,则整个网络将瘫痪。
Bitshares三年的成功运行以及Steem的一年运行期间,我们经历了各种各样的网络问题以及软件bug。DPOS在期间成功运转,并且它能比别的区块链处理更多的交易。

小编补充

优缺点

优点

  1. 能耗更低。DPoS机制将节点数量进一步减少到101个,在保证网络安全的前提下,整个网络的能耗进一步降低,网络运行成本最低。
  2. 更加去中心化。目前,对于比特币而言,个人挖矿已经不现实了,比特币的算力都集中在几个大的矿池手里,每个矿池都是中心化的,就像DPoS的一个受托人,因此DPoS机制的加密货币更加去中心化。PoS机制的加密货币(比如未来币),要求用户开着客户端,事实上用户并不会天天开着电脑,因此真正的网络节点是由几个股东保持的,去中心化程度也不能与DPoS机制的加密货币相比。
  3. 更快的确认速度。每个块的时间为10秒,一笔交易(在得到6-10个确认后)大概1分钟,一个完整的101个块的周期大概仅仅需要16分钟。而比特币(PoW机制)产生一个区块需要10分钟,一笔交易完成(6个区块确认后)需要1个小时。点点币(PoS机制)确认一笔交易大概也需要1小时。

缺点

  1. 投票的积极性并不高。绝大多数持股人(90%+)从未参与投票。这是因为投票需要时间、精力以及技能,而这恰恰是大多数投资者所缺乏的。
  2. 对于坏节点的处理存在诸多困难。社区选举不能及时有效的阻止一些破坏节点的出现,给网络造成安全隐患。

伪代码实现

1
2
3
4
5
6
7
8
9
10
for round i //分成很多个round,round无限持续
dlist_i = get N delegates sort by votes //根据投票结果选出得票率最高的N个受托人
dlist_i = shuffle(dlist_i) //随机改变顺序
loop //round完了,退出循环
slot = global_time_offset / block_interval
pos = slot % N
if dlist_i[pos] exists in this node //delegate在这个节点
generateBlock(keypair of dlist_i[pos]) //产生block
else
skip

go代码实现

请参考:https://github.com/bitxx/blockchain-demo/tree/master/src/github.com/jason/blockchain-demo/dpos

除翻译外,剩余内容参考自:http://liyuechun.org/

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信