4 生产者投票/生产者调度
对下一轮次BP的投票过程是被第二层DPoS执行的。严格来说,一个Token(通证)持有者必须先抵押Token,变成一个stakeholder(权益持有者),然后才可以投票。
4.1 投票过程
每一个EOS权益持有者可以在一次投票行为中为30个BP投票。被选举出来的21个BP代表整个EOS通证持有者,来生产区块、校验区块。其他BP按照得票顺序被放置在后备列表(standby list)中,当某个BP宕机时顶上。
投票过程会一直执行,每个轮次(即每个BP用6秒时间生产12个块,共21*6=126秒)结束后,会重新计算BP获得的票数,产生新的21个BP。
本轮次中,没有被投票的BP会用之前获得的票计算,但是由于存在投票衰退(vote decay),所以会重新计算实际的票数。
被新投票的生产者也会保留他们原来的投票,并且如果某投票者重新投了该BP,则会用新的权重计算票数。
可能有点绕,简单来说,就是每一个轮次会重新计算每个BP得到的票数。可以简单理解:票数 = 通证数 * 权重。权重是随时间变化的,每周会更新一次,每周大概增加1.3%(2的1/52次方=1.013419)。
实际上,权重本身并没有”衰减“,只是投票的时间越新,其权重越大。也就是说,如果你在2018年6月投票,它的权重一直不变,如果赎回,现在重新投票,其权重就会增加。
EOS这样设计主要有两个目的:
通过允许新票比旧票更有分量来鼓励参与。
给予那些积极参与重要治理事务的用户更多发言权。
更加详细的内容可以见下面的扩展。
4.2 生产者调度
那么,被投票选中的前21个BP的生产块的顺序又是如何呢?其实很简单,就是按照生产者的字母顺序。因为前文也说了,这21个BP的权利是一样的,只要大家按照一致认可的一个顺序生产块即可。
这里有一个关键点:这些数据(投票数据,21个BP的顺序等等一切数据)也都是作为交易数据存储在区块链中的,也都需要通过aBFT层被大多数节点确认,从而变成不可逆的。
每个生产者在当前轮次的第一个块中接收下一个轮次的生产者集合,需要注意的是,这个块是当前轮次,在当前轮次进行验证。即轮次N中的第一个块包括轮次N+1的BP及其顺序。
当包含BP集合的第一个块被大多数生产者(2/3 + 1)认为是不可逆的时候,BP集合会在下一轮次中被激活。
4.2.1 生产块相关参数
每个轮次下:
Parameter Description Default Layer
P (producers) number of active producers 21 2
Bp (blocks/producer) number of contiguous blocks per producer 12 1
Tb (s/block) Production time per block (s: seconds) 0.5 1
不太理解为啥Bp和Tb属于aBFT层?
通过以上参数,可以推算出下列参数:
Variable Description Equation
B (blocks) Total number of blocks Bp (blocks/producer) x P (producers)
Tp (s/producer) Production time per producer Tb (s/block) x Bp (blocks/producer)
T (s) Total production time Tp (s/producer) x P (producers)
当某个块在指定的时间段内没有被特定的生产者生成时,就会产生缺口(gap)。如果生产者继续不产生超过给定超时(由第2层常量设置,现在貌似是24小时)的块,则生产者将被降级为备用列表(standby list)。
扩展
1、eos投票相关
参考:http://www.btb8.com/eos/1809/12951.html (详细,推荐阅读)
投票强度衰退背后的算法是什么? 当你深入研究计算投票衰减的代码时,你会注意到投票实际上并没有衰减。 相反却是所有的新选票的投票强度都比旧选票高,这种的方法效果相同但是更聪明有效。
网友评论