跳到正文
← 使用教程

Switchboard 报价排查:feed ID、canonical 账户与 slots 新鲜度

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

离线复核已有 Solana quote 账户或程序日志,区别存储账户与 Ed25519 指令,避免错误解码、旧价格和旧 PullFeed 混用。

开始前准备

  • 准备 Solana 网络、完整 queue 公钥、目标 32 字节 feed ID、已有 quote 账户/指令记录与采样时间。
  • 如需新鲜度判断,准备同环境同时点的 current slot 与 quote slot;记录使用的 SDK/程序版本及解析来源。

1. 确认队列、feed 和现行路径

从 Switchboard 官方 Basic Price Feed 文档的 Explorer 入口确认目标 feed ID 与报价含义;feed ID 是 32 字节十六进制标识,不是账户公钥。对照已有 queue 公钥和 Solana 环境,新 feed-hash 集成应为 managed quote-program 路径;旧 PullFeed 只用于兼容特定历史集成。

检查结果:记录网络、queue、feed ID 和报价口径,已辨认 quote-program 或经典 PullFeed。

2. 对照 canonical 账户地址

以 queue.pubkey 与 [feedId] 对照 OracleQuote.getCanonicalPubkey 的本地派生结果;相同输入应得到相同 canonical quote 账户。若既有程序用了 custom program ID,还要对照其实际派生参数,不能把默认账户当自定义程序账户。账户不同就先标身份不匹配,不以同名 BTC/USD 补齐。

检查结果:已有账户与对应派生规则一致,或明确留下 queue/feed/program 差异。

3. 按数据类型选择解码方式

先区分手中的数据是 Ed25519 quote 指令 payload 还是链上存储账户 bytes。OracleQuote.decode 适用于前者,不能作为稳定的账户解码器;存储账户可变长度,按当前 Rust 的 SwitchboardQuote/PackedFeedInfo 类型读取,避免固定字节偏移。没有匹配版本的解析输出时先保留待查,不能把随意截取的整数显示为价格。

检查结果:数据类型和解码器范围匹配,解析来源/版本可复查,未使用硬编码账户偏移。

4. 复核 feed、精度与新鲜度

在解析结果中逐一对照 feed_id、feed_value/value() 与 min_oracle_samples。raw feed_value 是按 Switchboard 精度缩放的 i128,显示值优先核对文档 value() helper;不猜是 6 位或 9 位。用同一采样环境的 current slot 与 quote slot 判断年龄;max_age 的单位是 slots,文档 30/50 等例值不是业务阈值。缺 current slot 时不能宣称价格仍新鲜。

检查结果:报价 ID、原始/显示单位和年龄均有依据;阈值来自实际业务配置或标为未取得。

5. 限定验证与更新的结论

将 canonical 身份、解析、样本数量和年龄检查分别记录。QuoteVerifier 涉及 queue、Clock、SlotHashes、Instructions 等上下文;只有日志显示数值,不能宣称已独立验证全部上下文。若旧 PullFeed 返回 ORACLE_UNAVAILABLE,先检查路径兼容,不能换一个默认账户绕过错误。离线排查结束于证据整理,managed update、授权 unchecked 写入和部署是另外的操作。

检查结果:形成身份、解析、新鲜度与验证缺口清单,未把读取日志当新报价已更新上链。

怎样确认完成

  • 输出可追溯的网络、queue、feed ID、账户身份、解析类型、单位和新鲜度,缺上下文时明确保持未验证。
  • 仅官方文档核验与既有记录流程整理,未请求新报价、创建账户、更新 feed 或签名。

常见错误与边界

  • 新 quote-program 与经典 PullFeed 使用不同账户路径,ORACLE_UNAVAILABLE 不必然表示整个预言机服务停用。
  • SDK 能 decode 指令不表示能 decode 可变长度存储账户。
  • Advanced unchecked 写入信任授权 signer,不能直接等同经过完整密码学验证的写入。

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