westend-local中继链运行时升级缩短EPOCH_DURATION_IN_SLOTS报BABE错误如何解决
BABE epoch时长参数调整问题解答
结论
无法直接在不中断链运行的前提下调低EPOCH_DURATION_IN_SLOTS参数,你遇到的报错是直接修改该核心共识参数后的典型共识不兼容问题。
报错原因
EPOCH_DURATION_IN_SLOTS是BABE共识的核心底层参数,Substrate客户端会提前基于链上当前的epoch配置,预计算后续至少2个epoch的权威节点集合、出块槽位分配等信息。直接通过运行时升级修改参数值,会导致客户端本地预计算的epoch切换高度与运行时新配置的切换高度完全不匹配,因此触发babe: Error with block built on 0x...: ClientImport("Unexpected epoch change")错误,客户端会直接拒绝导入不符合预计算规则的块。
无中断调整的实现方案
你可以通过延迟生效的升级逻辑实现无中断调整,操作步骤如下:
- 不要直接修改EPOCH_DURATION_IN_SLOTS常量值,而是在运行时中新增存储项存储新的epoch时长参数,同时添加生效高度判断逻辑:只有当块高度达到你指定的未来生效高度时,才会读取新的参数值生效。
- 生效高度需要设置为距离当前块高度至少2个原epoch时长(也就是至少2小时)以上的高度,保证所有权威节点在当前旧规则的epoch运行结束前,都已经同步到升级逻辑,提前基于新参数预计算后续的epoch分配。
- 完成运行时代码修改后发起升级,等待链上治理通过、升级生效后,继续运行到指定的生效高度即可完成参数调整,不会出现共识错误。
已卡链的修复方案
如果已经因为直接升级导致链停止出块,需要所有4个权威节点统一回滚到升级前的最后一个正常块高度,再按照上述延迟生效的方案重新发起升级即可。
注:你使用的0.9.12版本Substrate未内置BABE epoch时长动态调整的原生支持,必须自行添加上述延迟生效的判断逻辑。
内容的提问来源于stack exchange,提问作者Georgi Zlatarev
相关产品推荐
相关产品推荐

