大家好
近期收到开发者反馈alaya底层日志中出现了包含’BAD BLOCK’的日志,经过核心开发者定位发现是一个由随机数导致的底层bug。
问题描述:
个别节点日志中出现BAD BLOCK,详情见issue:https://github.com/PlatONnetwork/PlatON-Go/issues/1880
问题原因:
在选举共识节点代码中使用到math包下的rand.Seed和rand.Shuffle,而广播区块和广播交易中也使用了rand.Seed,这导致在特殊的情况下,因为goroutine的调度,导致经济模型执行后的Seed被广播逻辑中的Seed污染了,造成结果和其他节点不一致,出现BAD BLOCK。
解决方案:将rand.Seed改为局部的实例化Rand
问题影响:
- 如果节点出的第一个块没有受到影响,后续出的块中出现过Seed被污染,则影响节点出块率 (本来一轮可以出10个,结果只有9个或更少被确认)
- 如果第一个块就被污染,因Giskard共识机制,出块后没有确认即可出下个区块,该场景下节点的所有区块都将得不到确认,最终将导致节点被处罚(0出块)
- 对于非出块节点,因验证区块时Seed可能被污染,因此验证区块不通过, 因此会降低共识整体容错性(被污染节点没投票)
当前核心开发者已经对问题进行了紧急修复,将于近期发布紧急修复版本,请大家关注并及时升级。