跳到主要内容

接收消息

为了投递跨链消息,中继器会调用 Mailbox.process()

该函数接收要投递的消息以及中继器可以指定的任意元数据作为参数。

Mailbox 会将消息和元数据传递给接收者的跨链安全模块(ISM)进行验证。如果 ISM 成功验证了消息,Mailbox 会通过调用 recipient.handle() 将消息投递给接收者。

信息

查看 Message.sol 了解更多关于 Hyperlane 消息编码的细节

Handle

当收到消息时,该函数会被 Mailbox 合约调用。

危险

为了确保只接受有效的跨链消息,限制只允许 Mailbox 地址的访问控制非常重要。

function handle(
uint32 _origin,
bytes32 _sender,
bytes calldata _message
) external payable;

参数

  • origin: 源链的域 ID
  • sender: 源链上发送者的地址(bytes32格式)
  • messageBody: 消息体的原始字节内容
信息

为了兼容不同寻址方式的虚拟机,发送者地址会左填充至 bytes32TypeCasts提供了以下实用工具:

// alignment preserving cast
function bytes32ToAddress(bytes32 _buf) internal pure returns (address) {
require(
uint256(_buf) <= uint256(type(uint160).max),

访问控制

如果合约只接受跨链消息的调用,handle 函数应该限制只允许 Mailbox 地址调用。

MailboxClient提供了以下实用工具:

    require(
Address.isContract(_contract),
"MailboxClient: invalid mailbox"
);
_;
}

示例

function handle(
uint32 _origin,
bytes32 _sender,
bytes calldata _data
) external payable virtual override {
emit ReceivedMessage(_origin, _sender, msg.value, string(_data));
lastSender = _sender;
lastData = _data;
}

验证

当收到消息时,Mailbox 会在调用消息接收者的 handle 之前通过跨链安全模块验证安全性。

默认安全性

你可以调用 defaultIsm 函数查询默认的 ISM 地址。

function defaultHook() external view returns (IPostDispatchHook);

模块化安全性

为了利用 Hyperlane 的模块化安全性,消息接收者可以指定自定义的跨链安全模块来验证传入消息的任何内容。当指定了自定义 ISM 时,Mailbox 会使用该模块进行验证。