Substrate中能否实现类Raft/PBFT共识替代Aura提升许可网络出块可用性?
你的方案在许可链场景下完全具备可行性,以下是对应问题的解答:
问题1:是否可以链下实现领导者选举,再将结果传入runtime?
可以,目前有两种成熟的实现路径:
- 若通过链下工作机提交普通交易:只需在runtime中新增
CurrentLeader类存储项,存储当选节点公钥、任期、有效期等信息,同时增加权限校验逻辑,仅接收超过2/3授权节点签名的选举结果上链生效,runtime直接读取对应存储项即可拿到选举结果。 - 更高性能的方案是走固有交易(Inherent)路径:客户端侧的选举模块直接将合法的领导者信息通过固有交易塞入区块,不需要支付手续费,runtime在执行区块时验证领导者身份合法性后直接更新存储即可,更适配共识类逻辑的时效要求。
问题2:当前节点的链下工作机如何与其他节点的链下工作机通信?
链下工作机本身不内置跨节点通信能力,你提到的sc-network是正确的依赖,实现路径如下:
不要依赖链下工作机实现跨节点通信,而是自行实现Substrate客户端侧的自定义共识服务,注册到节点启动生命周期中,该服务可直接调用sc-network提供的接口,自定义专用于领导者选举的libp2p私有协议,完成授权节点间的选举消息、投票、心跳数据同步。如果需要链下工作机和该共识服务交互,可通过链下工作机内置的本地HTTP请求能力,调用节点开放的本地RPC端点中转即可。
问题3:为什么Aura的实现分别分布在sc-consensus-aura和frame-aura两个包中?sc-consensus-aura中的client组件作用是什么?
这是Substrate共识组件的标准分层设计:
frame-aura属于runtime层逻辑,会被编译到Wasm runtime中部署上链,核心能力是验证出块节点是否在授权列表内、验证出块槽位签名的合法性,所有节点执行区块时都会运行这部分逻辑。sc-consensus-aura属于客户端侧(节点运行时)逻辑,不需要上链,仅在节点本地运行,负责槽位追踪、出块权判断、区块组装与广播、块同步等逻辑。
sc-consensus-aura中的client组件是客户端与runtime交互的抽象层,封装了读取runtime中Aura配置(授权节点列表、槽位时长等)、触发区块执行、查询链上状态等能力,实现客户端逻辑和runtime调用的解耦。
问题4:相关资料提到的Polkadot混合共识是否说明需求具备可实现性?
你看到的资料中提到的混合共识,本质对应Polkadot的BABE+GRANDPA双层共识架构:BABE是类似Aura的出块共识,GRANDPA是类PBFT的最终性确认共识,该架构本身就验证了你要做的许可链共识方案具备可行性。相关逻辑可以参考sc-consensus-grandpa(客户端侧投票、通信逻辑)和frame-grandpa(runtime侧投票验证、最终性确认逻辑)两个包,其分层设计、网络通信实现、链上校验逻辑都可以直接参考复用。
参考建议
开源社区已有可参考的Substrate Raft共识实现,你可以参考其客户端服务注册、自定义网络协议、runtime状态校验的完整流程。
内容的提问来源于stack exchange,提问作者Lavoris

