节点出块顺序随机的问题在社区广泛讨论下,形成了以下提案内容,我们将择时进行合并升级。
PIP-6:节点出块顺序优化-引入VRF随机性因子
背景
在测试网允许的过程中根据拉力赛赛程内容安排,特定块高被定义为“幸运块”,即该高度的块的提议人可以收到特殊奖励,但在当前网络实际运行中发现特定高度的区块的提议人出现一定的规律性,随机性不够,这一方面有失比赛公平性,另一方面暴露出一个的安全隐患:网络中的出块人和出块顺序有规律可循,攻击者极有可能利用这点对网络中的特定节点进行提前预判并发起攻击。
目的
保证共识的稳定性和安全性,在每个共识轮中将所有共识节点的出块顺序进行随机排序,以保证每个共识的出块顺序随机化。
内容
目前一个共识轮共25个验证人节点,在每个共识轮结束前会选出新的8个验证人节点,并在下一共识论替换掉上25个其中8个,所以剩余的未被替换的节点则会连续参与最多3个共识轮。连续参与共识轮的次数称之为任期数,新选进来的节点其任期数为0。
当共识轮的节点确定后,首先将25个共识节点按任期从大到小排序,权衡网络的随机性和稳定性,将所有共识节点分成两个组,第一组为任期最高的前8个节点,第二组为剩余的17个节点,之所以这样划分是因为任期高的验证人节点比任期低的节点稳定性好。
接下来将分别对两个组在各自组内利用VRF进行随机排序,首先获取当前块的前25个区块的VRF输出的随机数值,然后分别分配给每个节点:
按任期从大到小排序后的节点顺序,为每个节点分配不同的VRF随机数
当前块的前25个区块的VRF随机数用nonce25表示
以此类推,前第25个区块的VRF随机数代表:nonce0
node0 | node1 | node2 | node3 | … | … | node23 | node24 |
---|---|---|---|---|---|---|---|
nonce0 | nonce1 | nonce2 | nonce3 | … | … | nonce23 | nonce24 |
当为每个共识节点分配完随机数之后,分别为两组进行组内随机排序,当排序完成后,组的顺序不变第一组排在前面,第二组在后面,组内的节点顺序随机化。
随机排序规则如下:
使用上一步骤中每个节点被分配的VRF随机数值,取其前20个字节和节点地址(由节点ID转换而来的address)做异或,然后根据异或后的值从大到小排序即完成随机排序。
提案PR:https://github.com/PlatONnetwork/PIPs/pulls
提案详情:https://github.com/PlatONnetwork/PIPs/blob/d7970ffa3d6f7e3619d1f91c402f57d003317af7/TestNet/PIP-6.md