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日 |
1038 在 神奇豆子
2,703 每月下载量
在 8 个crate(5个直接) 中使用
2.5MB
43K SLoC
桥梁并行链组件
桥梁并行链组件是桥梁中继链的一个或多个并行链的轻量级客户端。它作为最终确定的并行链头部的来源,并在需要与并行链建立桥梁时使用。
该组件需要桥梁GRANDPA组件在同一链上部署 — 它用于验证在桥梁中继链上生成的存储证明。
关于Parachains最终性的简介
您可以在Polkadot-SDK仓库中找到关于Parachains最终性的详细信息。本节简要概述了Parachains最终性是如何工作的以及如何为Parachains构建轻客户端。
其中最主要的是,Parachains可以自己生成块,但无法在没有其中继链的帮助下实现最终性。相反,Parachains的收集器创建一个块并将其交给中继链验证者。验证者验证该块并在Heads
映射中注册新的Parachains头部,这个映射是由paras
组件部署在中继链上的。请注意,这个部署在中继链上的组件不是一个桥梁组件,尽管它们的名称相似。
桥梁Parachains组件所做的,就是简单地验证那个Heads
映射中Parachains头部的存储证明。它是通过使用之前由桥梁GRANDPA组件导入的中继链头部来做到这一点的。一旦证明被验证,组件就知道给定的Parachains头部已经被中继链最终化。Parachains头部字段随后可以用来验证来自Parachains的存储证明。这允许组件被用作例如消息组件最终性的来源。
组件操作
组件的主要入口点是submit_parachain_heads
调用。它有三个参数
-
来自
Heads
映射的Parachains头部存储证明; -
来自存储证明的Parachains标识符及其头部哈希;
-
生成存储证明的中继块。
组件可以跟踪多个Parachains。Parachains可能使用不同的原语——一个可能使用128位块号,另一个可能使用32位。为了避免额外的解码操作,组件使用中继链块号来排序Parachains头部。任何已最终化的中继块的后代,在其Heads
映射中包含Parachains块PB
,都保证有PB
或其后代。因此,Parachains块号随着中继块号的增加而增长。
如果组件已经知道更好的(或相同的)头部,它可能会拒绝Parachains头部。此外,组件还会拒绝未跟踪的Parachains的头部。
组件不跟踪Parachains头部之后的内容。因此,它不需要初始化——部署后即可接受头部。
非基本功能
在部署桥梁Parachains模块的每个运行时中,可能都有一个特殊的账户。这个账户,名为“模块所有者”,类似于模块级别的sudo账户——他可以暂停和恢复所有模块操作,而无需运行时升级。与该账户相关的调用包括:
-
fn set_owner()
:当前模块所有者可以调用它将“所有权”转让给另一个账户; -
fn set_operating_mode()
:模块所有者(或sudo账户)可以调用此函数来停止所有模块操作。在此调用之后,所有最终性证明都将被拒绝,直到下一次set_operating_mode
调用。此调用可以在桥梁发生异常情况时使用。
如果未定义pallet所有者,可以使用治理来执行这些调用。
拒绝过时头部的签名扩展
最好让任何人(对于链和提交者)都拒绝将已知的平行链头部提交给pallet的所有交易。这样,我们可以为其他有用的交易留出区块空间,并且不向同时提交的交易收取费用。
为了处理这个问题,我们有一个签名扩展,可以添加到运行时中。它正好完成所需的工作——拒绝所有带有已知头部的交易。提交者不需要为这种交易付费——它们在构建区块时直接从交易池中删除。
然而,签名扩展有点有限——它只适用于提供单个平行链头部的交易。因此,它不适用于多个平行链头部的事务。这符合我们对Kusama <> Polkadot桥梁的需求。如果您需要处理其他事务格式,您可以为您的运行时实现类似的扩展。
您还可以查看generate_bridge_reject_obsolete_headers_and_messages
宏,它将多个类似的签名扩展打包成一个。
平行链最终性中继
我们有一个离线actor,它会监视新的平行链头部并将它们提交给桥梁链。这是平行链中继——您可以查看crate级别文档和代码。
依赖项
~20–35MB
~598K SLoC