13 个版本 (重大更改)

0.9.0 2024年7月18日
0.7.0 2024年6月24日
0.3.1 2024年3月26日

#3 in #snowbridge

Download history 88/week @ 2024-05-06 320/week @ 2024-05-13 520/week @ 2024-05-20 439/week @ 2024-05-27 578/week @ 2024-06-03 589/week @ 2024-06-10 261/week @ 2024-06-17 811/week @ 2024-06-24 525/week @ 2024-07-01 338/week @ 2024-07-08 829/week @ 2024-07-15 523/week @ 2024-07-22 607/week @ 2024-07-29 229/week @ 2024-08-05 408/week @ 2024-08-12 556/week @ 2024-08-19

1,862 每月下载量
用于 3 crates

Apache-2.0GPL-3.0-only

2.5MB
50K SLoC

以太坊出库队列

将 Polkadot 生态系统中的消息发送到以太坊。


lib.rs:

用于将出库消息提交以发送到以太坊的 Pallet

概述

消息要么来自 XCM 的姐妹平行链,要么来自 BridgeHub 本身通过 snowbridge-pallet-system

  1. snowbridge_router_primitives::outbound::EthereumBlobExporter::deliver
  2. snowbridge_pallet_system::Pallet::send

消息提交管道的工作方式如下

  1. 消息首先通过 snowbridge_core::outbound::SendMessage::validate 的实现进行验证
  2. 消息随后通过 snowbridge_core::outbound::SendMessage::deliver 的实现进行排队,以供后续处理。
  3. 底层消息队列由 Config::MessageQueue 实现。
  4. 消息队列通过 frame_support::traits::ProcessMessage::process_message 的实现将消息返回给该组件。
  5. 消息在 Pallet::do_process_message 中进行处理:a. 分配一个唯一标识码 b. 使用ABI进行编码、哈希,并存储在 MessageLeaves 向量中
  6. 在块的末尾,从 MessageLeaves 中的所有叶子节点构建一个Merkle根。
  7. 这个Merkle根作为摘要项插入到 parachain 的头部。
  8. 离线中继器在以下操作后能够将消息中继到Ethereum:a. 使用 prove_message 运行时API为提交的消息生成一个Merkle证明 b. 从存储中读取 Messages 向量中的实际消息内容

在Ethereum的一侧,消息根是Polkadot轻客户端最终要验证的内容。

消息优先级

治理命令的处理永远不会停止。这实际上允许我们在暂停处理普通用户消息的同时,仍然允许将治理命令发送到Ethereum。

费用

必须支付预付费来发送消息。此费用涵盖了多个组成部分

  1. 本地处理消息的权重
  2. 向中继器支付的消息提交的gas退款
  3. 向中继器支付的额外奖励,用于消息提交

通过重量确定消息在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消耗。

外部调用

运行时API

  • prove_message:为提交的消息生成梅克尔证明
  • calculate_fee:计算消息的配送费用

依赖项

~22–37MB
~632K SLoC