跳到正文
← 使用教程

CCTP V2 证明过期或最终性不够:按同一消息检查恢复记录

链小知 · 进阶 · 核验 · 依官方文档整理

区分API版本、消息版本、最小与已执行finality、过期区块及重新证明受理,沿同一nonce排查目标执行。

开始前准备

  • 已有源burn、去敏message/attestation、目标错误和可选reattest记录;没有记录时按字段表核对缺项。
  • 本篇限V2消息恢复,不提交POST、不重新burn、不发送receiveMessage。

1. 保留环境、版本与整组消息

主网与sandbox host、源domain与chainId分别记录。/v2/messages支持不同CCTP版本;当前V2技术表的header和body version均用1,响应cctpVersion可为2,三个层次不能互相替代。

响应messages按日志索引升序;逐条保存原message、eventNonce、decodedMessage.nonce和cctpVersion。官方例子的两种nonce值并不一致,不擅自当别名或取数组首项。

检查结果:目标消息由原身份和日志定位,API与消息版本没有混同。

2. 核对finality字段而不是只看complete

minFinalityThreshold是最小请求等级,finalityThresholdExecuted是实际等级;1000/2000为协议等级,不是通用区块确认数。文档低于1000按1000、超过1000按2000处理。

目标handler按已执行等级低于2000或至少2000区分;完整证明可能仍不满足目标接收方要求,不能以status complete直接断言执行成功。

检查结果:请求等级、实际等级和接收方要求分列,缺原值不猜原因。

3. 分别检查调用者限制和过期区块

destinationCaller非零会限制调用者;header.recipient处理消息,body.mintRecipient接收资产,两者角色不同。核对原目标错误,不用当前浏览器钱包替代。

expirationBlock是目标过期判断字段;ARB-stack目标使用Ethereum L1区块,不用L2高度比较。没有正确层的历史高度与时间,只能标未核实过期。

检查结果:权限与过期各有对应证据,不把地址或区块层混用。

4. 读取已有重新证明回执的真实含义

POST /v2/reattest/{nonce}的200只说明过程已启动,不是新证明或目标mint完成;400/404保留原响应。本篇不执行该写入方法。

方法说明可提高最终性但已预留allowance时仍承担相应费用;技术页也允许仍在源链存在的过期Fast burn申请刷新expirationBlock,并称没有额外申请截止期限。适用条件不扩成任意链/版本永久可恢复。

检查结果:受理、新证明、目标执行三阶段分开,恢复条件和费用未知可见。

5. 沿原消息比对新证明与目标结果

若原系统已有新响应,按原sourceTxHash、domain与对应nonce核对message/attestation及新expirationBlock,保存取得时间。不要拼接旧message和新attestation或将另一条消息替代。

forwardState/forwardTxHash只作原执行线索;实际目标交易是否成功、是否同一mintRecipient仍需回执,nonce在目标域只能使用一次。

检查结果:新证明与原转移可关联,重复使用或目标执行未知没有被掩盖。

6. 保留hook业务和证明读取的边界

mint成功不自动证明hook业务完成;核心协议把hookData留给集成方处理,恢复和错误规则另看原应用。输出已证明阶段和仍缺证据。

技术页列40次/秒、超限后五分钟HTTP429;这是服务限制,不是钱包故障。本次没有轮询或验证当前资格,错误读取不变成零资产。

检查结果:报告包含消息身份、finality、过期层、恢复受理及独立目标/hook结果。

怎样确认完成

  • 同一消息的原证明、新证明和目标结果分别留证,或明确哪些未取得。
  • 没有重burn、reattest、签名或真实恢复验收。

常见错误与边界

  • /v2路径、cctpVersion与message header版本数互相替代。
  • 两种nonce例值当一致,或者complete/reattest200写成mint成功。
  • 用L2高度比较L1expirationBlock;拼接不同版本消息与证明。

本教程根据官方资料整理,尚未完成逐步操作验收。界面、支持范围及费用变化时,先核对官方说明。 纯文本版 · 提交纠错依据