Substrate私有链对等节点已连通但区块无法最终确定如何解决
区块无法最终确定的核心原因
从你提供的节点日志可以直接定位到问题根源:
Detected prevote equivocation in the finality worker: Equivocation { round_number: 1, identity: Public(d049754412b60a77530486823eb946a74ef53c0e206943442ee8b47ca11e2c80 (5Gmoe182...)), first: (Prevote { target_hash: 0xce94add9ee3c35a0464432eaf9b4c546f3108cffb7b40bf4be87363c61ac77aa, target_number: 0 }, ... second: (Prevote { target_hash: 0x310c432a0daf8e8e47fed164b9bf05fdba70d97d6e438b7707f122d27ce53411, target_number: 85 }) }
Error reporting prevote equivocation: Safety("Refraining from sending equivocation report for our own equivocation.")
具体触发条件
- 你两个节点使用了同一个GRANDPA权威身份的密钥,导致同一个权威地址在不同节点同时运行,在同一个GRANDPA投票轮次为两个不同的区块投票,触发了GRANDPA共识的 equivocation(双重投票)检测机制,为了安全共识直接锁死,不再推进最终确认高度。
- 同时你可以观察到日志中同一区块高度出现了两个不同哈希的块导入记录(比如#213同时导入了
0x5d37…8526和0x5a46…87a9两个块),说明两个节点同时作为出块权威出块,本质是你的创世链规范配置错误,要么是默认本地测试网只有1个内置权威,要么是你没有把两个节点的AURA/GRANDPA公钥都正确加入创世权威列表。
修复步骤
- 停止所有运行中的节点,清除旧链数据,分别对两个节点执行清理命令(替换为你自己的节点路径、链规范文件名):
# 清理节点1数据 ./target/release/node-template purge-chain --base-path /tmp/node01 --chain yourCustomRawSpec.json # 清理节点2数据 ./target/release/node-template purge-chain --base-path /tmp/node02 --chain yourCustomRawSpec.json
- 重新生成自定义链规范:确认将两个节点的AURA公钥全部填入
aura.authorities数组,两个节点的GRANDPA公钥全部填入grandpa.authorities数组,之后导出为raw格式的链规范文件,两个节点必须使用完全相同的raw链规范文件启动,禁止使用默认的--chain local参数。 - 确认两个节点的密钥配置完全独立,节点1只存自己的AURA+GRANDPA密钥,节点2只存自己的对应密钥,不要重复配置。
- 用正确的参数重新启动两个节点,等待30秒左右即可看到finalized高度随最佳区块高度同步增长。
内容的提问来源于stack exchange,提问作者Julien Drevon
相关产品推荐
相关产品推荐

