接收消息
合约可以通过实现handle
函数来接收链间消息。
Handle
当收到消息时,该函数由Mailbox
合约调用。
danger
为了确保只接受有效的链间消息,将access control限制为邮箱地址是很重要的。
- Solidity
- CosmWasm
- Sealevel
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中提供了以下实用程序。
- Solidity
- CosmWasm
- Sealevel
* @notice Only accept messages from an Hyperlane Mailbox contract
*/
modifier onlyMailbox() {
require(
msg.sender == address(mailbox),
"MailboxClient: sender not mailbox"
);
🚧 即将到来! 🚧
🚧 即将到来! 🚧
示例
- Solidity
- CosmWasm
- Sealevel
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
函数查询。
- Solidity
function defaultHook() external view returns (IPostDispatchHook);
模块化安全
为了利用Hyperlane的模块化安全性,消息接收者可以指定一个自定义的链间安全模块来验证任何关于传入消息的内容。当指定时,该邮箱将遵从此ISM。
- Solidity
- CosmWasm
- Sealevel
function interchainSecurityModule()
external
view
returns (IInterchainSecurityModule);
🚧 即将到来! 🚧
🚧 即将到来! 🚧