CCIP源交易成功但目标未完成:核消息状态与手工执行前提
链小知 · 进阶 · 核验 · 依官方文档整理
从已有CCIP 2.0消息回执定位验证、索引或执行阶段,区分外层交易成功与消息SUCCESS。
开始前准备
- 准备已有脱敏配置、错误或回执记录,保留网络、对象身份、版本及时间;缺项标待核。
- 仅阅读公开文档和已有记录,不登录、安装、调用RPC/API、获取报价、签名、部署、转账或重试业务。
1. 把源链发送与目标交付分开
CCIP 2.0依次发送、验证、索引和目标执行。原CCIPMessageSent与源交易成功仅证明发送阶段,不能据此把目标Token到账或接收回调记为完成。
源交易可能包含多个消息,需保留原日志所对应messageId、目标链及OffRamp,避免拿同一交易hash下另一条消息的状态对账。
检查结果:有具体messageId对应的源事件和目标状态记录。
2. 区分未执行与已失败
UNTOUCHED表示目标链尚未执行,可来自未选执行器、Indexer缺数据或服务重试窗口结束等;FAILURE表示执行尝试在OffRamp保护路径内失败,原因需要读错误。
手工执行在2.0不要求原发送者/接收者身份,但仍须正确encodedMessage、所有必需证明及目标链Gas。本教程只核前提,不提交手工执行。
检查结果:未执行/已尝试失败/成功分列,未把UNTOUCHED当资产丢失。
3. 按错误定位验证、Token处理或回调
RequiredCCVMissing或版本解析失败属证明/配置层;TokenHandlingError可能是Token Pool、代币条件或rate limit,不能靠提高回调Gas修复。
ReceiverError空数据可能是回调Gas不足,非空数据常指接收逻辑错误,仍需原trace证实。NotEnoughGasForCall等可能需要外层交易Gas;gasLimitOverride只改变ccipReceive预算,不等于整笔交易预算。
检查结果:错误层级与已有trace对应,未把所有失败归为Gas不足。
4. 拆开已付服务费与再次执行Gas
CCIP费用可包含执行器、CCV、Token Pool和网络费;源链收费可能有在feeToken上追加与从转移代币中扣除两种方式,不能仅看净到账相差就认定少币。
原用户指定回调gasLimit按预算收费,未用Gas不退;手工执行目标链Gas由提交账户支付,文档明确不由Chainlink Labs报销。没有当次费记录时不填固定费用或退款金额。
检查结果:服务费组成、附加/扣减方式和目标手工Gas付款方分列。
5. 以消息执行状态及目标效果核完成
外层交易receipt status=1仍可能在OffRamp记录FAILURE;要对照已有getExecutionState/ExecutionStateChanged记录。SUCCESS后消息不能再执行;再次失败可能以NoStateProgressMade外层回滚,原消息仍为FAILURE。
将消息成功、目标Token余额变化和接收合约业务完成各列证据;只完成其中一层时不推广为全部业务完成,也不为补证重新广播。
检查结果:外层回执、消息状态和最终业务效果分开,重复执行风险可识别。
怎样确认完成
- 形成条件、费用、执行阶段与未证实项的核对记录。
- 本教程仅documentation;未验收实际配置、服务可用性或资金交付。
常见错误与边界
- 本教程仅覆盖CCIP 2.0的EVM目标OffRamp路径,不套用其他目标链或旧版手工证明。
- SUCCESS不可重执行;外层交易成功不代表消息成功。