Wormholescan 查不到VAA:核对环境、emitter与sequence
链小知 · 进阶 · 核验 · 依官方文档整理
用Wormhole三元消息身份和已有响应定位问题,区分Explorer与legacy Guardian封装、原VAA编码、分页窗口和重组重复记录。
开始前准备
- 已有源交易/事件记录中的emitter_chain、emitter_address与sequence,以及取得日期、环境与脱敏查询响应。
- 查询参数必须来自对应应用发消息事件,不从收款人地址或交易hash猜emitter/sequence。
- 只整理文档与既有记录,不向Wormholescan、Guardian或其他业务接口发请求,也不提交VAA。
1. 先确认mainnet、testnet与namespace
官方指南列mainnet https://api.wormholescan.io/api/v1、testnet https://api.testnet.wormholescan.io/api/v1。现行Swagger又区分Explorer/api/v1与legacy Guardian/v1,先抄原host/path,不用重复/api/v1或把两种响应互换。
Wormhole chain ID不是EVM chain ID:规范映射Solana=1、Ethereum=2;这不代表Ethereum主网EVM chainId=2。同一数值也不能代替环境;测试网资产/消息不与主网样本合并。
检查结果:原请求环境、namespace和Wormhole chain ID可追溯;链名与原数字没有互猜。
2. 核对三元身份和32字节地址
VAA按emitter_chain/emitter_address/sequence识别,emitter是调用Core发消息的应用合约/程序,不是用户发送地址、token地址、目标接收人或Core地址的通用替代。根据已有事件取完整值。
Wormhole地址格式是32字节hex;EVM与Solana原地址格式不同,Solana base58不能靠字符串补0转换。sequence是u64,保存精确十进制字符串,避免JS Number超安全整数;官方SDK转换仅作格式依据,未安装或运行。
检查结果:三元值来自同一消息事件,格式/大sequence精度完整,错地址或未知事件先列出。
3. 按方法检查响应外壳
Explorer GET /api/v1/vaas/{chain_id}/{emitter}/{seq}的规范路径占位符原写:chain_id/:emitter/:seq,表示替换参数,不是把冒号字面值当业务URL。200 schema为对象data数组及pagination;同ID可能不止一项,逐项核对id、emitterChain、emitterAddr、digest。
legacy GET /v1/signed_vaa/{chain_id}/{emitter}/{seq}定义为vaaBytes封装,不含Explorer txHash/payload等扩展。原响应是null、空data、缺data或错误时分列,不用从另一个namespace的样例补字段。
检查结果:每条VAA原记录与自身方法匹配;空数组、null、缺字段与HTTP失败未合并。
4. 保留原VAA编码与解析边界
当前Swagger VaaDoc.vaa及legacy vaaBytes声明integer数组;官方SDK3.x的Operation.vaa.raw却声明string,响应编码存在文档差异。先保存实际JSON类型与来源方法,不能对任意数组调用base64解码,也不能把未经确认的字符串一律认定hex/base64。
parsedPayload参数只说在可解析时附加payload;缺payload不等于无VAA。txHash/payload/isSolanaShim是Explorer扩展,不是VAA核心头字段;guardianSetIndex或原字节存在也不等于本地验签完成或目标合约已接受。
检查结果:记录区分索引扩展、原VAA字节/编码与解析结果;未执行decode/验签的部分明确未验证。
5. 检查重复VAA与源链最终性
低consistency或源链未最终确认时,重组可能让看似相同三元ID产生不同VAA。逐项保留digest、isDuplicated、txHash、timestamp/indexedAt/updatedAt;不要仅凭sequence去重删除内容不同的记录。
当前规范还有同ID/duplicated查询定义,但不需要现场补查。没有已有重复列表或源最终性证据时,写“重复/重组待核”。VAA是Guardian证明,原核心消息不自带唯一目标链;目标路由由应用payload和消费逻辑决定,不能据VAA存在判代币到账。
检查结果:消息身份与内容差异可复核;最终性、Guardian签署和目标消费三个状态分开。
6. 复核分页时间范围与原错误
如果记录来自VAA列表/api/v1/vaas/,核对txHash、page/pageSize、sortOrder(ASC/DESC)和from/to。该列表明确RFC3339匹配VAA timestamp;只有to时from默认前两周,只有from时to默认后两周,不能把漏出的旧消息当不存在。
响应pagination.next只有string定义,未明确终页哨兵/page起点;按原记录留页/next、不要猜空值代表全量完成。400/500等HTTP失败保留,不转换为0消息。官方称公共无需认证但部分方法限速,没有本轮具体RPM或免费额度,不能承诺无限重试。
检查结果:结论说明身份错误、环境/封装差异、窗口漏项、重复可能或仍未知;未取得数据不当链上无消息。
怎样确认完成
- 记录环境、namespace、三元ID、原响应类型、原字节与重复/时间范围。
- 能明确排查分支与补证条件,不承诺当前业务API可用或已取得/验证VAA。
常见错误与边界
- 把用户/收款地址或EVM chainId当Wormhole emitter/chain ID,或sequence浮点化。
- 把Explorer data数组、legacy vaaBytes和Operation.vaa.raw当同一种JSON封装/编码。
- 忽略默认两周时间窗口,将空页或缺parsedPayload当VAA不存在。
- VAA存在/Guardian签署不等于目标执行、到账或独立签名验证;同ID重组内容不能盲目去重。