Skip to content

共识机制(BFT-DPoS)

共识机制(BFT-DPoS)

BTC和ETH采用的共识机制都是PoW(Proof of Work,工作量证明机制),由于该机制需要矿工消耗电力资源挖矿,而且其共识算法效率较低,很难进一步满足全球范围内的交易量和上层应用开发的大交易量需求。

EOS项目早期时候使用的共识机制是DPoS(Deligated Proof of Stake,委托股权证明),类似于Bitshares和Steem采用的共识机制,该共识机制类似于西方国家的议会制度,共识效率比较高。

DPoS主要由五大部分组成:Token、区块链、社区、计算机和规则。在整个区块链系统中,Token代币的持有者以Token为选票,通过投票选出其认可的节点,选出的节点根据一定的规则来运行区块链计算机网络。在EOS网络中,最终会选出21个主节点,它们有权力生产区块、这些主节点被称为区块生产者,简称BP(BlockProducer)。

DPoS共识机制采用随机的BP出块顺序,出块速度为3秒/块,每一个BP的出块都代表了对之前整条区块链进行了一次信息确认。由于交易需要得到全网2/3以上BP的确认,在EOS中即需要得到14个BP的确认,因此确认交易的不可逆总共需要45秒(15*3)。

An image

在传统的DPoS中,BP在出块时在全网广播该区块,其他BP即使收到了目前的新区块,也无法立即进行确认回复,而是需等到轮到自己生产区块时才能进行确认。由于该方法交易的确认时间过长(确认交易至少要45秒),为了提升整个网络的性能,BM借鉴了Practical Byzantine Fault Tolerance(拜占庭容错算法)的机制,采用了BFT-DPoS共识机制。

在新共识机制下,BP生产新的区块时依然向全网络广播,其他BP收到新区块时,立即对此区块进行验证,并将验证完成的签名区块立即返回给出块BP,不需要等到轮到自己出块时再确认。因此在生产新的区块并全网广播之后,在收到全网2/3的BP确认后,该区块就不可逆了。该机制下的交易确认时间由原先的45秒缩短至3秒,消耗时间主要为等待生产区块的时间。

An image

为了继续挖掘EOS的性能,BM又对以上机制进行了修改。他将出块速度由原来的3秒缩短为 0.5 秒,这样可以极大地提升系统性能,但该做法也会带来系统的网络延迟问题:由于网络延迟的存在, 0.5 秒的确认时间可能会导致下一个出块的节点还没有收到上一个出块节点的区块即产生新的节点,从而导致区块链分叉。例如:中国一节点生产区块后紧接着轮到美国一节点,但因中美网络的延迟高达300毫秒,在美国的节点要出块时还没收到中国节点的区块,则会忽略中国节点产生的区块,形成区块链分叉。

针对上述问题的不可避免性,BM将原先的随机出块顺序改为由BP商议后确定的出块顺序,这样网络延迟较低的BP之间相邻出块,从而可尽量避免区块链分叉。同时为了更有效地解决上面的问题,不让任何一个BP因为网络延迟而被跳过生产,BM设计让每个BP生产区块时连续生产12个区块,即拥有6秒的连续出块时间。这样的机制能够保证即使在最恶劣的情况下,BP连续生产的12个区块中,只有最后一个或者两个区块可能因为网络延迟而被下一个BP忽略,但能保证前列的区块能够有效传递给下一个BP

现有的完整BFT-DPoS机制如下:每个区块拥有6秒的出块时间(能够连续生产12个区块),区块生产后立即对全网进行广播,区块生产者一边生产新的区块一边接收其他BP对于上一个区块的确认。在大部分情况下,交易会在一秒以内确认(即达到不可逆状态),该时间包含了 0.5 秒的区块生产和 0.5 秒的其他BP的确认。

An image

EOS系统规定,一旦区块达到不可逆状态(2/3BP确认),就无法在此之前进行分叉,从而保证了交易的永久可信。另外,即使多数BP想分叉区块链,也只能以相同的速度( 0.5 秒)与主链竞争,就算主链只剩下一个见证人,分叉链也永远不会追上主链,保证了系统的稳定。

超级节点竞选

所谓超级节点,就是指EOS网络中那些收集交易信息并打包到区块里的节点,又称区块生产者(Block Producer,BP)。超级节点主要负责以下事务:

  • 收集网络里的交易;
  • 验证交易并把交易打包到区块;
  • 广播区块给其他节点,通过验证后将区块添加到自己本地区块链上。

与支撑BTC和ETH的PoW(工作量证明共识机制)不同,EOS网络采取了BFT-DPoS的解决方案,该方案能够很好地解决前者延迟和低吞吐量的痛点。但另一面,EOS也为自己带来了隐患一要想提升整个网络的效率,就必须减少节点,然而过少的节点又会对整个网络的安全性造成影响。

因此,EOS设计者BM提出了“超级节点”的解决方案。超级节点一共有21个,为整个网络提供计算和带宽支持,每一个超级节点都组织了自身的EOS社区,而超级节点也会像现实中的城市一样去竞争发展。该方法能够以有限的中心化实现广义的去中心化,并让EOS获得极快的交易速度与容错能力。

EOS超级节点的产生是根据全网用户持有的EOS Token投票实现的。不同于以太坊的POA一个节点一票的形式,EOS是通过持币数量来决定手里的票数。因为以太坊的POA是基于小场景的私链或者联盟链的,这与大规模对外公开的公链EOS的场景是不同的。

节点被选举成功,以太坊POA是没有确定数量限制的,随时按照全网投票与票数清零以后的每一轮投票结果去增删超级节点。而EOS超级节点只有21个,在整个投票周期结束以后,排名前21的节点即胜任。并且这21个超级节点必须符合非常高的性能要求、运维能力和社区规模等,当某个超级节点出块方面出现问题时,在一定规则下其会被丢弃,然后重新选出新的节点替代它作为超级节点的身份。

持币者投票

主网上线后,EOS Token持有者可以在已支持EOS的钱包中或者其他插件中进行EOS节点的投票。其投票流程如下:

  1. EOS Token"抵押” 持有者要获得选票,首先需要将手里的EOS Token抵押,转换成相应的CPU和带宽资源(NET),可投的选票数与抵押的可用资源(CPU+NET)相等。这里需要注意的是,EOS系统中通过抵押或者购买得到的RAM,只能获得RAM的使用权而不具有投票权。抵押的EOS会被锁定,不再具有转账和交易等其他功能,如果想取消抵押并赎回EOS Token,则在系统中经过赎回操作后需要再等待72小时,EOS Token才能回到自己账户上,即赎回抵押的EOS Token具有72小时的锁定期。

  2. 一票30投、委托代理 在EOS系统中,通过上述抵押获得的选票最多可以投给30个不同的节点,假如你持有1个EOS Token对应的选票,那可以将这一票投给一个节点,也可以投给30个节点,这30个节点都会获得1选票。如果想修改自己的投票,可以立即进行改投,更改会在下一轮的区块开始生产时生效(每一轮区块生产时间为21×6秒)。还有一种投票方式为委托代理,即你可以把投票的权利交给指定的投票代理人,让他来代替你进行投票。委托代理机制对那些想要投票,但无法了解全部节点候选人的用户来说是非常有用的。

  3. 投票权重衰减 系统为了推进整个系统的治理更新,希望持有EOS Token的用户能够根据节点的发展运营情况经常更新他们的投票,为此引入了一个时长为一年的投票权重半衰期机制。该机制规定从投票一周后开始,如果用户在一周后不重新投票,该选票的权重就会衰减,一年后的权重会降低至初始的50%。如果用户重新投票,其选票的权重就会完全恢复。在每一轮区块生产时,系统会根据每个节点的选票数和每张选票的权重值得到各个节点的选票值,根据排名筛选出前21个节点作为系统的超级节点。

超级节点治理

超级节点可以类比理解为PoW系统中的矿工。EOS中区块产生的过程:EOS的区块生产过程和比特币系统类似,都是收集网络中的交易信息并将其打包为区块。不同的地方是,EOS中的超级节点不需要完成工作量证明即可直接广播区块到网络中,让其他节点进行验证。

EOS系统中,每生产252个区块为一个区块周期,即每个超级节点在一个区块周期中应该产生12个区块。每个区块周期内,EOS系统设置了每隔 0.5 秒产生一个区块。在每个区块周期开始时,EOS会根据代币投票结果选出21个超级节点。这21个超级节点会约定一个区块产生顺序,这些节点按照这个顺序每隔 0.5 秒产生一个区块。如果一个节点在指定的时间内没有产生出一个区块,那么这个区块就会被跳过,并在区块链上留下时间戳间隔。如果一个节点在最近的24个小时内都没有产生区块,那么它将被移出超级节点的候选名单。

一旦一个节点完成了区块生产并通过其他节点的验证,它就可以将这个区块添加到区块链上,并获得新的代币作为出块奖励。白皮书中规定,所有超级节点的期望奖励的中位数决定了系统最终会产生多少新代币。EOS系统有一个硬性的条件,即每年产生的新代币数量不能超过代币总量的5%。BM 在 DAWN-446 提议中认为,应该将生产奖励分为三部分,分别作为超级节点区块生产奖励、备用节点奖励和新提案奖励。