接收消息
为了投递跨链消息,中继器会调用 Mailbox.process()
。
该函数接收要投递的消息以及中继器可以指定的任意元数据作为参数。
Mailbox
会将消息和元数据传递给接收者的跨链安全模块(ISM)进行验证。如果 ISM 成功验证了消息,Mailbox
会通过调用 recipient.handle()
将消息投递给接收者。
信息
查看 Message.sol
了解更多关于 Hyperlane 消息编码的细节
Handle
当收到消息时,该函数会被 Mailbox
合约调用。
危险
为了确保只接受有效的跨链消息,限制只允许 Mailbox 地址的访问控制非常重要。
- Solidity
function handle(
uint32 _origin,
bytes32 _sender,
bytes calldata _message
) external payable;
参数
origin
: 源链的域 IDsender
: 源链上发送者的地址(bytes32格式)messageBody
: 消息体的原始字节内容
信息
为了兼容不同寻址方式的虚拟机,发送者地址会左填充至 bytes32
。TypeCasts
库提供了以下实用工具:
// alignment preserving cast
function bytes32ToAddress(bytes32 _buf) internal pure returns (address) {
require(
uint256(_buf) <= uint256(type(uint160).max),
访问控制
如果合约只接受跨链消息的调用,handle
函数应该限制只允许 Mailbox 地址调用。
MailboxClient
库提供了以下实用工具:
- Solidity
require(
Address.isContract(_contract),
"MailboxClient: invalid mailbox"
);
_;
}
示例
- Solidity
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 地址。
- Solidity
function defaultHook() external view returns (IPostDispatchHook);
模块化安全性
为了利用 Hyperlane 的模块化安全性,消息接收者可以指定自定义的跨链安全模块来验证传入消息的任何内容。当指定了自定义 ISM 时,Mailbox 会使用该模块进行验证。