#block #substrate #set #grandpa #authority #change #gadget

sc-finality-grandpa

将 GRANDPA 最终性小工具集成到 substrate 中

30 个版本 (16 个破坏性版本)

0.24.0 2023 年 2 月 26 日
0.22.0 2023 年 2 月 12 日
0.16.0 2022 年 12 月 21 日
0.9.0 2021 年 2 月 10 日
0.8.0-alpha.52020 年 3 月 24 日

#6 in #grandpa

Download history 764/week @ 2024-03-13 1100/week @ 2024-03-20 1056/week @ 2024-03-27 1027/week @ 2024-04-03 860/week @ 2024-04-10 1031/week @ 2024-04-17 1066/week @ 2024-04-24 875/week @ 2024-05-01 871/week @ 2024-05-08 977/week @ 2024-05-15 998/week @ 2024-05-22 1088/week @ 2024-05-29 831/week @ 2024-06-05 731/week @ 2024-06-12 854/week @ 2024-06-19 737/week @ 2024-06-26

3,318 每月下载量
用于 12 个 crate (3 直接)

GPL-3.0-or-later…

530KB
12K SLoC

将 GRANDPA 最终性小工具集成到 substrate 中。

此 crate 不稳定,API 和用法可能会更改。

此 crate 提供一个长时间运行的 future,用于生成最终性通知。

用法

首先,使用 block_import 函数创建一个块导入包装器。GRANDPA 工作者需要与这个块导入对象链接起来,因此还会返回一个 LinkHalf。所有导入的块(从网络、共识或其他方式)都必须通过此包装器,否则共识可能会以意想不到的方式中断。

接下来,使用 LinkHalf 和本地配置来 run_grandpa_voter。这需要一个 Network 实现。返回的 future 应该被驱动完成,并将块在后台最终化。

更改权限集

GRANDPA 中更改权限集的大致想法是,在某个时刻,我们就当前集可以最终化的最大区块高度达成一致,一旦达到该高度的区块被最终化,下一个集将从这个高度开始最终化。

技术上讲,这将作为投票规则实现,规则如下:“如果在区块 B 中有 N 个块的更改信号,则只在长度为 NUM(B) + N 且包含 B 的链上进行投票”。这种条件包含逻辑计算复杂,因为它需要查看链中任意远的历史。

相反,我们跟踪所有已看到的信号列表(跨所有分叉),按它们应用的区块号升序排序。我们永远不会在高于最早交接区块号的链上进行投票(这是 num(signal) + N)。在最终化区块时,我们根据信号区块是否包含在新最终化的链中来应用或修剪任何信号更改。

许可证: GPL-3.0-or-later WITH Classpath-exception-2.0

依赖项

~54–94MB
~1.5M SLoC