Skip to main content

接收消息

合约可以通过实现handle函数来接收链间消息。

Handle

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

danger

为了确保只接受有效的链间消息,将access control限制为邮箱地址是很重要的。

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

参数

  • origin: 原始链的域
  • sender: 发件人在原始链上的地址,以bytes32表示
  • messageBody: 消息体内容的原始字节
info

发送地址左填充为 bytes32,以兼容不同寻址的虚拟机。为了方便使用,TypeCasts library中提供了以下实用程序。

// alignment preserving cast
function bytes32ToAddress(bytes32 _buf) internal pure returns (address) {
return address(uint160(uint256(_buf)));
}

访问控制

如果合约只接受链间消息的调用,handle函数应限制为邮箱地址。

为了方便使用, MailboxClient library中提供了以下实用程序。

 * @notice Only accept messages from an Hyperlane Mailbox contract
*/
modifier onlyMailbox() {
require(
msg.sender == address(mailbox),
"MailboxClient: sender not 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;
}

验证

当收到消息时,在调用消息收件人的handle之前,邮箱将使用Interchain Security Module验证安全性。

Default Security

默认的ISM地址可以通过defaultIsm函数查询。

function defaultHook() external view returns (IPostDispatchHook);

模块化安全

为了利用Hyperlane的模块化安全性,消息接收者可以指定一个自定义的链间安全模块来验证任何关于传入消息的内容。当指定时,该邮箱将遵从此ISM。

function interchainSecurityModule()
external
view
returns (IInterchainSecurityModule);