我刚接触基板。我试图通过用类似Raft/PBFT的一致性算法代替Aura来提高许可网络的块生成的可用性。我指的是一种算法;谁可以生成块";在授权节点中选举领导者(通过libp2p
(的问题。
在运行了教程并查看了Aura的源代码之后,我仍然对是否可以做到这一点感到困惑。以下是一些问题:
- 是否可以实现链下领导者选择,并在运行时获得结果?(似乎链下工作人员只能提交事务。但运行时如何从中读取数据?(
- 如何与当前链下工作者中另一个节点的链下工作者进行通信?看来
sc-network
有能力做到这一点 - 为什么Aura的实现在
sc-consensus-aura
和frame-aura
中都有代码。client
在sc-consensus-aura
中做什么 - 这里说";Polkadot使用混合PBFT/Aurand共识机制";,这意味着我的问题是肯定的吗?不知怎么的,我找不到相关的代码
如果可能的话,有什么工作/例子可以借鉴吗?
谢谢你的帮助!
在阅读了AURA和[GRANDPA][grandpimplementation],甚至自己实现了终结性pbft[1]之后,我相信答案是肯定的。
这里的基本思想是,任何基于领导者(或非基于领导者(的共识都可能是GRANDPA的替代方案。AURA只是生成(密封(区块的一种方式。
- 领导人选举应该最终实行爷爷。它本身就嵌入基板中
- 如果你只是在实现一个共识机制,那么就没有必要使用链外工作者
- 在Substrate中,
client
/sc-
的行为与本机代码相同,而frame
/sp-
定义了Runtime
的行为。例如,AURA是一种块生成算法,因此它必须作为本地代码来实现。同时,AURA为运行时提供了一些钩子/函数。这就是为什么它在client
和frame
中都有代码的原因 - 尽管如此,我似乎找不到那个代码。但回应是肯定的
[1]最终性pbft和具有pbft 的底物
我认为使用Substrate当然可以做到这一点!不过,请注意,这将涉及到对Substrate内部的挖掘,遗憾的是,目前还没有大量的文档记录(大多数用户只想构建和运行自己的运行时(。
您必须在运行时之外完全实现Raft协议,并且可以使用Substrate中的网络功能与其他对等方通信(https://paritytech.github.io/substrate/master/sc_network/struct.NetworkService.html,https://paritytech.github.io/substrate/master/sc_network_common/service/trait.NetworkEventStream.html)。我认为Substrate中sc-finality-grandpa
的代码是一个很好的查找位置。
无论何时创建块,都可以通过发送事务或包含固有事务将领导者选举的结果传达给运行时。然后,您可以创建自己的托盘,用于处理这是固有的或处理事务,并使用当前选定的领导者更新存储条目。不过,我认为您仍然希望权限由运行时定义,这样您就可以在运行时使用staking来选择权限。因此,你的Raft工作人员还需要与运行时交互,以确定谁是权威(然后在其中进行领导人选举(。
你发布的关于Polkadot是一个混合系统的链接有点过时了(这里有一个更好的https://wiki.polkadot.network/docs/learn-consensus#hybrid-共识(,但它仍然成立。在Polkadot中,有两种不同的中继链共识协议:用于块生产的BABE和用于终结的GRANDPA。对于Raft(或PBFT(,只有一个用于块生成和最终性的共识协议(因为每个块都会立即最终确定(。
请记住,Raft不是拜占庭式的容错,节点可以离线,但它们被认为是诚实的。因此,这不适合对抗性环境。
最后,看看https://github.com/Cardinal-Cryptography/aleph-node因为他们还在Substrate中实现了BFT共识协议。