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

整理：链小知（AI 辅助）
资料核对日期：2026-10-12
引用地址：https://lianxiaozhi.com/tools/guides/cctp-v2-expired-attestation-finality-record-check
难度：进阶
核验方式：官方文档整理，未执行真实账户操作

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

## 使用工具
- [Circle CCTP](https://lianxiaozhi.com/tools/circle-cctp) · [官方入口](https://developers.circle.com/cctp)

## 前置条件
- 已有源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与消息版本没有混同。
依据：[Circle：按源domain取得消息与证明](https://developers.circle.com/api-reference/cctp/all/get-messages-v2)
依据：[Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)

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

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

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

核对结果：请求等级、实际等级和接收方要求分列，缺原值不猜原因。
依据：[Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)
依据：[Circle：按源domain取得消息与证明](https://developers.circle.com/api-reference/cctp/all/get-messages-v2)

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

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

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

核对结果：权限与过期各有对应证据，不把地址或区块层混用。
依据：[Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)

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

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

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

核对结果：受理、新证明、目标执行三阶段分开，恢复条件和费用未知可见。
依据：[Circle：重新证明的回执与费用边界](https://developers.circle.com/api-reference/cctp/all/reattest-message)
依据：[Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)

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

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

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

核对结果：新证明与原转移可关联，重复使用或目标执行未知没有被掩盖。
依据：[Circle：按源domain取得消息与证明](https://developers.circle.com/api-reference/cctp/all/get-messages-v2)
依据：[Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)

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

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

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

核对结果：报告包含消息身份、finality、过期层、恢复受理及独立目标/hook结果。
依据：[Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)
依据：[Circle：重新证明的回执与费用边界](https://developers.circle.com/api-reference/cctp/all/reattest-message)

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

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

## 相关知识
- [跨链显示已发送却未到账？来源交易、消息与目标执行分开查](https://lianxiaozhi.com/learn/bridge-transfer-status)
- [原始、解码和整理后的链上数据有什么区别？](https://lianxiaozhi.com/learn/raw-decoded-curated-data)
- [链上指标历史数值为什么会变？](https://lianxiaozhi.com/learn/point-in-time-metrics)

## 官方依据
- [Circle：V2消息、finality与过期恢复](https://developers.circle.com/cctp/references/technical-guide)
- [Circle：按源domain取得消息与证明](https://developers.circle.com/api-reference/cctp/all/get-messages-v2)
- [Circle：重新证明的回执与费用边界](https://developers.circle.com/api-reference/cctp/all/reattest-message)
