#header #pallet #bridge #set #grandpa #chain #block

无 std pallet-bridge-grandpa

模块实现用于跨接基于 Substrate 的链的共识的链上轻客户端 GRANDPA。 (polkadot v1.15.0)

16 个重大版本发布

0.17.0 2024 年 7 月 18 日
0.14.0 2024 年 6 月 24 日
0.10.0 2024 年 3 月 18 日
0.6.0 2023 年 12 月 13 日
0.0.0 2023 年 6 月 20 日

3#grandpa

Download history 127/week @ 2024-05-05 325/week @ 2024-05-12 591/week @ 2024-05-19 444/week @ 2024-05-26 578/week @ 2024-06-02 620/week @ 2024-06-09 311/week @ 2024-06-16 860/week @ 2024-06-23 472/week @ 2024-06-30 462/week @ 2024-07-07 886/week @ 2024-07-14 508/week @ 2024-07-21 715/week @ 2024-07-28 412/week @ 2024-08-04 594/week @ 2024-08-11 883/week @ 2024-08-18

2,695 每月下载量
9 个crate中(6 个直接使用)

GPL-3.0-or-later…

2.5MB
40K SLoC

桥接 GRANDPA 模块

桥接 GRANDPA 模块是桥接链上运行的 GRANDPA 最终性小工具的轻客户端。它可以导入桥接链的头部及其 GRANDPA 最终性证明(证明)。导入的头部可以用于通过其他模块验证存储证明。这使得桥接 GRANDPA 模块成为所有基于 Substrate 的桥接模块的基本模块。它被所有桥接类型(独立链之间的桥接,平行链和这些类型的任意组合)以及其他桥接模块使用。它被平行链轻客户端(桥接平行链模块)和消息模块使用。

GRANDPA 最终性的简要介绍

您可以通过探索其 仓库 了解有关 GRANDPA 的详细信息。以下是了解模块工作原理所需的最小 GRANDPA 信息。

任何底链都可能使用不同的区块作者算法(如BABE或Aura)来确定区块生产者并生成区块。但这与最终性无关——区块作者的任务是协调区块生成。如果区块未最终确定,则任何区块都可能被回滚(如果有分叉)。基于Substrate的独立链的最终性解决方案是GRANDPA最终性设备。如果某个区块被设备最终确定,则不能回滚。

在GRANDPA中,有验证者,由它们的公钥来识别。它们选择一些生成的区块并对该区块哈希进行签名。如果有足够的签名(超过2 / 3 * N,其中N是验证者的数量),则该区块被认为是最终确定的。区块的签名集合称为证明。任何知道验证者公钥的人都可以验证GRANDPA证明以及它是否为提供的标头生成。

GRANDPA中有两个主要事情有助于构建轻客户端

  • 无需导入桥接链的所有标头。轻客户端可以导入最终确定的标头或仅导入一些它认为有用的最终确定的标头。当验证者集合保持不变时,客户端可以导入该集合最终确定的任何标头;

  • 当验证者集合发生变化时,GRANDPA设备将下一个集合添加到标头中。因此,轻客户端在这种情况下无需验证存储证明——它只需要查看标头并检查它是否改变了集合。一旦集合更改,所有后续的证明都是由新集合生成的。改变集合的标头在组件中称为“强制”。正如其名所示,轻客户端需要导入所有这样的标头才能正常运行。

组件操作

组件的主要入口点是submit_finality_proof_ex调用。它有三个参数——最终确定的标头、相关的GRANDPA证明和生成此证明的权限集合ID。该调用简单地使用当前验证者集合验证证明,并检查标头是否优于上一个最佳标头。如果两个检查都通过,则标头(仅其有用字段)将被插入到运行时存储中,并可供其他组件验证存储证明。

提交者必须为提交所有标头支付正常费用,除了强制标头。由于它是组件操作所必需的,提交此类标头是免费的。因此,如果您对会话长度延迟(意味着每个会话恰好有一个强制标头)没有问题,组件调用的成本为零。

当组件看到强制标头时,它将验证者集合更新为标头中的集合。所有后续的证明(直到下一个强制标头)必须由这个新集合生成。

组件初始化

如前所述,有两个强制性组件操作:最佳最终确定的标头和当前验证者集合。没有它们,组件无法导入任何标头。但如何为这些字段提供初始值?有两种选择。

第一种选择虽然更容易,但并非在所有情况下都适用。这是在链规范中指定初始标头和验证者集合的情况下启动链。然而,如果我们想向已启动的链添加桥接,则这不会起作用。

对于后一种情况,我们有initialize调用。它接受初始标头和初始验证者集合。该调用可以由治理机构、root或组件所有者(如果已设置)调用。

非必需功能

在每个运行时中,可能都有一个特殊的账户,其中部署了桥接GRANDPA模块。这个账户,名为'模块所有者',类似于模块级sudo账户——他能够暂停和恢复所有模块操作,而无需升级运行时。与此账户相关的调用是

  • fn set_owner(): 当前模块所有者可以调用它将“所有权”转让给另一个账户;

  • fn set_operating_mode(): 模块所有者(或sudo账户)可以调用此函数停止所有模块操作。在此调用之后,所有最终性证明都将被拒绝,直到进一步的set_operating_mode调用。此调用可以在桥接发生异常情况时使用;

  • fn initialize(): 模块所有者可以调用此函数初始化桥接;

如果未定义pallet所有者,则可以使用治理来执行这些调用。

拒绝过时头的签名扩展

对于任何人(对于链和提交者)来说,拒绝所有向pallet提交已知头的交易都是更好的选择。这样,我们为其他有用的交易留出区块空间,并且不对并发提交者的诚实行为收费。

为了处理这个问题,我们有一个签名扩展,可以添加到运行时。它正好做了所需的事情——拒绝所有带有已知头的交易。提交者不需要为这种交易付费——它们在构建区块时简单地从交易池中删除。

您还可以查看generate_bridge_reject_obsolete_headers_and_messages宏,它将多个类似的签名扩展捆绑在一个中。

GRANDPA最终性中继

我们有一个离线actor,它会监视GRANDPA的证明并将其提交到桥接链。它是最终性中继——您可以查看crate级别的文档和代码

依赖关系

~20–35MB
~596K SLoC