13 个版本 (重大更改)
0.9.0 | 2024年7月18日 |
---|---|
0.7.0 | 2024年6月24日 |
0.3.1 | 2024年3月26日 |
#3 in #snowbridge
1,862 每月下载量
用于 3 crates
2.5MB
50K SLoC
以太坊出库队列
将 Polkadot 生态系统中的消息发送到以太坊。
lib.rs
:
用于将出库消息提交以发送到以太坊的 Pallet
概述
消息要么来自 XCM 的姐妹平行链,要么来自 BridgeHub 本身通过 snowbridge-pallet-system
snowbridge_router_primitives::outbound::EthereumBlobExporter::deliver
snowbridge_pallet_system::Pallet::send
消息提交管道的工作方式如下
- 消息首先通过
snowbridge_core::outbound::SendMessage::validate
的实现进行验证 - 消息随后通过
snowbridge_core::outbound::SendMessage::deliver
的实现进行排队,以供后续处理。 - 底层消息队列由
Config::MessageQueue
实现。 - 消息队列通过
frame_support::traits::ProcessMessage::process_message
的实现将消息返回给该组件。 - 消息在
Pallet::do_process_message
中进行处理:a. 分配一个唯一标识码 b. 使用ABI进行编码、哈希,并存储在MessageLeaves
向量中 - 在块的末尾,从
MessageLeaves
中的所有叶子节点构建一个Merkle根。 - 这个Merkle根作为摘要项插入到 parachain 的头部。
- 离线中继器在以下操作后能够将消息中继到Ethereum:a. 使用
prove_message
运行时API为提交的消息生成一个Merkle证明 b. 从存储中读取Messages
向量中的实际消息内容
在Ethereum的一侧,消息根是Polkadot轻客户端最终要验证的内容。
消息优先级
治理命令的处理永远不会停止。这实际上允许我们在暂停处理普通用户消息的同时,仍然允许将治理命令发送到Ethereum。
费用
必须支付预付费来发送消息。此费用涵盖了多个组成部分
- 本地处理消息的权重
- 向中继器支付的消息提交的gas退款
- 向中继器支付的额外奖励,用于消息提交
通过重量确定消息在Ethereum上可能消耗的最大gas量。使用这个上限,可以计算最终的费用。
费用计算还需要以下参数
- 某个时期内的平均ETH/DOT汇率
- 桥愿意为中继器每单位gas支付的最多费用
按照设计,预计治理应手动每隔几周使用系统组件中的 set_pricing_parameters
外部调用更新这些参数。
这是一个临时措施。一旦Polkadot网络中有可用的ETH/DOT流动性池,我们将使用它们作为定价信息的来源,同时受一定的保障。
费用计算函数
LocalFee(Message) = WeightToFee(ProcessMessageWeight(Message))
RemoteFee(Message) = MaxGasRequired(Message) * Params.MaxFeePerGas + Params.Reward
RemoteFeeAdjusted(Message) = Params.Multiplier * (RemoteFee(Message) / Params.Ratio("ETH/DOT"))
Fee(Message) = LocalFee(Message) + RemoteFeeAdjusted(Message)
按照设计,计算出的费用包括一个安全系数(乘数),以覆盖ETH/DOT汇率的不利波动。
费用结算
在远程端,在网关合约中,中继器累积
Min(GasPrice, Message.MaxFeePerGas) * GasUsed() + Message.Reward
或者换句话说,中继器使用至少是实际gas价格或 Message.MaxFeePerGas
的价格来退款gas消耗。
外部调用
Call::set_operating_mode
:设置操作模式
运行时API
prove_message
:为提交的消息生成梅克尔证明calculate_fee
:计算消息的配送费用
依赖项
~22–37MB
~632K SLoC