关于节点出块几率变化的说明
大家好
自Alaya0.15.0版本升级成功后,部分用户反馈不同权重(质押+委托总量)的节点被选中为共识节点的概率和之前的版本差异比较大,在这里跟大家做个简要的说明, 欢迎大家从各自角度反馈不同的意见。
新版本做了什么调整
细心的用户会发现,相对于0.14.0版本,在本次升级后,节点权重低的节点不容易被选中做为出块节点了,而权重高的节点每次被选中的概率相比以前却大大增加。
之所以出现上面的现象是因为底层0.15.0版本对涉及到选取节点算法的一个参数p的取值方式做了调整,这里先简单介绍一下参数p的作用:
- p的取值越大,则系统越公平,这里说的公平体现在节点被选中出块的概率跟权重占比的差异大
- p的取值越小,则系统去中心化程度越高,系统越安全,也就意味着权重低的节点被选中的概率相应提高,避免出块节点过于集中,也鼓励更多节点参与共识
Alaya自上线以来p值的变化曲线如下:
如果您对p值的具体含义和算法实现感兴趣,可以参考“二项分布”和“选取共识节点”章节
调整p值计算方法的原因
在alaya网络中,p值是动态计算得出的,因此是时刻变化的,从0.13.2版本到0.14.0版本之间,底层并未对p值的计算方式进行调整,但由上图可以明显看出p值在逐渐减小。
为了防止p值越来越小,0.15.0版本才对p值的计算方法做了调整,目的是防止出现权重高的节点被选中出块的概率过低,出现明显的不公平。
至于具体的调整方式,就需要详细说明一下Alaya网络选举共识节点的规则了。
共识节点的选取规则
目标
Alaya选取共识节点有2个目标:
- 公平性:按权益分配出块权,高权重的节点获得多的出块权,低权重的节点获得相对更低的出块权
- 去中心化:抑制权力集中,低权重的节点也能参与共识,鼓励更多节点加入,增加网络的安全性
目前Alaya共识上的优化主要就是对以上两点目标做权衡。
Alaya底层选取共识节点涉及两个算法:可验证随机函数(VRF)算法和二项分布,这里简单说明一下两个算法的作用,详细算法请参考技术说明
VRF
简单来说可验证随机函数VRF算法要解决的是选取节点的"随机性"问题,在每次需要选举新的共识节点时,每个节点通过VRF产生一个完全随机的数字,用这个数字来参与选取共识节点。
二项分布
二项分布函数算法能解决的是”按权益分配选票“的问题,如果只有随机性,那么每个节点都有相同的概率被选中出块,这显然打消了大家持有权益的积极性,Alaya网络属于PoS共识,高权重(质押+委托总量)的节点理应比低权重的节点有更多的记账权。
选取共识节点
设单次从总票数N中选取出一张选票的概率为p,为了每次都能从验证节点中选举出指定数量的共识节点,令每个节点做n次独立的次伯努利试验以选出D张选票(期望),则每个节点需要进行试验的次数n是符合二项分布的。
简单点说,对于选取固定的期望值D,权重大的节点(票多)将比权重小的节点机会多(为了抑制权力过于集中,对节点的权重开了根号)
为保证网络稳定性,Alaya每次选取最少8个节点替换原共识节点中的节点,入选新节点的规则为所有剩余76个验证人分别使用VRF算法计算出得出一个(0,1)范围内的随机数y,在各自节点对应的累积二项分布曲线中根据y对应的x值进行排序,取前8个节点进入下一个共识论参与共识。
累积二项分布曲线
本次优化以及原因
在Alaya中,p=D/N,在0.13.2版本中期望值D为固定值200,但由于总权重N在不断增大,导致p值逐渐减小,意味着低权重节点被选中的概率越来越高,高权重的节点被选中的概率越来越低。
由于之前的版本平衡点在逐渐向去中心化程度方向倾斜,本次升级对D的取值使用了按阶梯变化取值:
总权重 | 期望 |
---|---|
1000000 - 10000000 | 3000 |
10000000 - 100000000 | 3000 |
100000000 - 1000000000 | 6000 |
1000000000 - 10000000000 | 10000 |
10000000000 - 100000000000 | 60000 |
当前网络中质押总权重大约为550万,因此D当前取值为3000。
从运行的结果看,目前选择的p值偏大,公平性有余,去中心化不足,体现在权重高的节点被选中的概率更高,权重低的节点被选择的概率偏低。
例如:经过一定数量的共识轮,有10万权重的节点A被选中的次数/有1万权重的节点B > 10
继续优化
如何在公平性和去中心化程度之间获得较好的平衡,的确是个两难的事情,欢迎大家一起来献计献策,对平衡策略提出宝贵意见和建议,让Alaya网络更加繁荣。接下来我们也会做更多更细致的测试和验证,并将测试结果提供给社区参考和讨论。