1. 使用 ERC7786 和 Axelar 适配器发送消息
本教程使用 Base Sepolia
作为源链,使用 Arbitrum Sepolia
作为目标链。
概念
ERC7786 定义了两个主要接口用于跨链消息传递:
IERC7786GatewaySource
- 源链接口,允许发送消息。关键组成部分:
sendMessage
:用于启动消息发送的函数,接受:
- destinationChain(CAIP-2 格式,例如
eip155:421614
表示 Arbitrum Sepolia)
- 接收者地址
- 负载(任意字节)
- 属性(可选的特定协议参数)
- 返回一个用于跟踪消息的出盒子 ID
- 触发
MessagePosted
事件
IERC7786Receiver
- 目标链接口,接收消息。关键组成部分:
executeMessage
:目标网关调用的函数,以传递消息
- 必须验证调用网关是受信任的
- 必须返回特定选择器(
0x675b049b
)以确认成功执行
需要理解的重要概念:
- 一些协议(如 Axelar)可能需要额外步骤,例如:
- 注册协议特定和 CAIP-2 标识符之间的链等价性
- 注册远程适配器地址
- 支付目标链的Gas费和可能的中继或协议费用
- 在目标链上进行消息批准和执行
该标准旨在保持与协议无关的同时,允许通过属性参数实现特定协议的功能。
适配器设置
- 第一步是在源链和目标链上部署适配器。适配器可以是仅接收、仅发送或双向工作。为了能够双向发送消息,我们在两个链上部署了
AxelarGatewayDuplex.sol
。
注意,在部署合约时,其中一个构造函数参数是 Axelar 网关代理,这是负责接收(或发送)各自链上所有消息的合约。
注意每条链都有自己的网关代理(至少一个)。这种架构用于将所有消息集中在一个地方,便于中继器监听事件。
这相当于 LayerZero 端点和 Hyperlane 邮箱。例如,Axelar 不同链上网关的合约地址可在其 文档 中查看。
- 合约部署(源链和目标链)后,我们需要注册 Axelar ID 和 ERC7786 标准之间的链等价性。这是因为在发送消息时,目标链的 参数 应遵循 CAIP-2 标准以识别目标链。然而,Axelar 使用的是自己的一组 ID 来表示 链。其他协议如 LayerZero 也存在类似情况,使用其 eids。
这使得保持 CAIP-2 标识符和每个桥接协议自己的链标识符之间的映射成为必要。AxelarGatewatBase.sol
通过注册具有这些标识符的链等价性来解决此问题。
- 在 这笔交易 中,我们注册了
eip155:421614
和 arbitrum-sepolia
(Axelar 名称标识符)之间的链等价性。
- 在 这笔交易 中,我们注册了
eip155:84532
和 base-sepolia
(Axelar 名称标识符)之间的链等价性。
- 下一步是注册远程适配器,以使源链上的适配器知道目标链上的适配器(反之亦然)。
- 在 这笔交易 中,我们将地址
0x050193203845D4145Dea5200C7eA49EF28b5f870
(目标链上的适配器)映射到其链的 CAIP-2 标识符( eip155:421614
)。
- 在 这笔交易 中,我们将地址
0xBb6A11d2FdEF18522cC9d14DdAdb676c8c126AEE
(源链上的适配器)映射到其链的 CAIP-2 标识符( eip155:84532
)。
- 在适配器配置完成后,我们只需要在目标链上有一个遵循
IERC7786Receiver
的合约,以接收和执行消息。
发送消息
- 要发送消息,应在源链适配器中调用
sendMessage
函数。
- 在 这笔交易 中,我们正从源链向目标链发送消息。
参数为:eip155:421614
(目标链,遵循 CAIP-2 标准),0x60ff0d6060722db7357f6976c8e5b8f2f42b8759
(接收者,支持 IERC7786Receiver 的目标链合约),随机负载和空属性列表。
- 下一步是支付目标链上的执行费用。这可以根据协议和适配器通过多种方式进行。
- 在 这笔交易 中,我们使用 Axelar 的原生Gas服务为消息添加了原生Gas费用。
- 在 Axelar 的架构中,消息由网关代理批准,然后由适配器执行。
- 在 这笔交易 中,我们正在网关代理中批准交易。
- 在 这笔交易 中,我们正在适配器中执行消息(调用接收者)。
整个流程(设置和发送消息)可以使用 此脚本 进行复制(尚未合并到主分支,且尚未准备好投入生产)。