Explorer 调试
调试失败的消息
当消息处理失败时,您会在页面顶部看到消息状态显示为"Error",并且页面右上角会说明消息无法处理的原因。
如果您的消息未能传递,可能是由于以下几个因素。
无效的目标链
如果中继客户端不知道目标域标识符(uint32
),他们将无法传递您的消息。请参考域文档了解已知域及向这些目标发送消息时使用的规范标识符。
无效的接收者
如果接收者地址(bytes32
)不是实现了 IMessageRecipient
的合约地址,中继器将无法传递您的消息。
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
interface IMessageRecipient {
function handle(
uint32 _origin,
bytes32 _sender,
bytes calldata _message
) external payable;
}
注意
EVM 地址(address
)必须用零左填充才能符合要求。请参考 TypeCasts 库中的 pure addressToBytes32
工具函数,以及消息发送部分的其他详细信息。
无法处理
如果消息接收者的 IMessageRecipient.handle()
函数的 gas 估算失败,中继器将无法传递消息。中继器会继续估算消息传递所需的 gas,因为状态变化可能会使之前无法传递的消息变得可以成功传递。
由验证者签名但中继器无法处理的交易异常示例。
信息
如果您有此行为无法满足的用例,请在 Discord 上联系我们加入 Discord。
资金不足
资金不足的消息意味着为传递此消息所做的跨链 gas 支付不足。
中继器使用目标链上的 eth_estimateGas
RPC 来确定中继消息的绝对成本。如果这个数额超过了在源链上支付的总 gas 数额,中继器通常会拒绝传递消息。
您可以手动支付跨链 gas来解决这个问题。
使用 Etherscan
您也可以查看目标链上接收者的 Etherscan 页面,但请注意处理交易不会像您通常想象的那样出现在交易列表中。这是因为中继器实际上是调用 Mailbox 合约,然后 Mailbox 合约再调用接收者的 handle
函数。因此,您会在 Internal Txns
标签下找到处理的证据