GMP调用Gas不足未补充的执行后果及链上通知安全问询
GMP调用Gas不足的结果及相关问题解答
一、Gas不足且未补充的直接结果
当发起GMP(通用消息传递)调用时提供的Gas不足,且未通过UI或编程方式补充Gas,源链上的callContract交易本身不会回滚——只要源链上执行该调用的基础Gas足够完成消息提交到Axelar网关的操作,交易就会在源链确认。但目标链上的合约调用会因预留Gas不足以覆盖执行逻辑而失败回滚,跨链消息无法在目标链完成执行。
二、指定调用是否会回滚?
你先执行以下代码:
GAS_RECEIVER.payNativeGasForContractCall{value: msg.value}(address(this), destinationChain, destContract, payload, msg.sender);
再执行:
AXELAR_GATEWAY.callContract(destinationChain, destContract, payload);
这个流程中:
- 只要源链上这两个调用的执行Gas足够(比如能完成向网关提交消息、支付Gas的操作),源链交易不会回滚,消息会成功提交到Axelar跨链系统。
- 但如果
payNativeGasForContractCall传入的msg.value对应的目标链Gas不足以覆盖目标合约执行所需Gas,目标链上的合约调用会失败回滚,源链交易不受影响。
三、获取Gas不足未执行的链上通知的安全事项
要在目标链调用因Gas不足失败时获得链上通知,需注意以下安全要点:
- 在目标合约中添加失败回调逻辑:用
try/catch包裹核心执行代码,当执行失败(包括Gas不足)时,发射包含调用信息、失败原因的事件。需确保回调逻辑本身所需Gas足够,避免连事件都无法发射。 - 验证回调来源合法性:如果通过Axelar的回调机制接收通知,必须验证回调发送者是Axelar官方网关合约,防止攻击者伪造失败通知。
- 防范重入攻击:处理失败通知的回调函数中,避免调用外部不可信合约,或使用重入锁机制,防止恶意利用回调发起重入攻击。
- 保证事件数据完整性:发射的失败事件需包含源链地址、交易ID、目标合约方法、失败类型(明确标记Gas不足)等关键信息,方便后续查询与验证。
- 预留通知逻辑的冗余Gas:调用
payNativeGasForContractCall时,除目标合约执行所需Gas外,额外预留部分Gas用于失败通知的事件发射或回调执行,避免因通知逻辑Gas不足导致无法发出通知。
内容的提问来源于stack exchange,提问作者mohamed abu younes
相关产品推荐
相关产品推荐

