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

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

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

## 使用工具
- [Switchboard](https://lianxiaozhi.com/tools/switchboard) · [官方入口](https://switchboard.xyz/)

## 前置条件
- 准备 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。
依据：[Switchboard：Solana managed quote 更新与 feed ID](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/basic-price-feed)
依据：[Switchboard：canonical quote 账户、可变长度与解码范围](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/quote-program-accounts.md)

## 2. 对照 canonical 账户地址

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

核对结果：已有账户与对应派生规则一致，或明确留下 queue/feed/program 差异。
依据：[Switchboard：canonical quote 账户、可变长度与解码范围](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/quote-program-accounts.md)
依据：[Switchboard：QuoteVerifier、新鲜度与授权更新边界](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/advanced-price-feed.md)

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

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

核对结果：数据类型和解码器范围匹配，解析来源/版本可复查，未使用硬编码账户偏移。
依据：[Switchboard：canonical quote 账户、可变长度与解码范围](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/quote-program-accounts.md)

## 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、原始/显示单位和年龄均有依据；阈值来自实际业务配置或标为未取得。
依据：[Switchboard：canonical quote 账户、可变长度与解码范围](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/quote-program-accounts.md)
依据：[Switchboard：Solana managed quote 更新与 feed ID](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/basic-price-feed)
依据：[Switchboard：QuoteVerifier、新鲜度与授权更新边界](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/advanced-price-feed.md)

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

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

核对结果：形成身份、解析、新鲜度与验证缺口清单，未把读取日志当新报价已更新上链。
依据：[Switchboard：canonical quote 账户、可变长度与解码范围](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/quote-program-accounts.md)
依据：[Switchboard：QuoteVerifier、新鲜度与授权更新边界](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/advanced-price-feed.md)

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

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

## 相关知识
- [预言机价格与交易池价格有什么区别？清算应看哪一个](https://lianxiaozhi.com/learn/oracle-and-market-price)
- [区块确认与最终性是什么？交易成功和充值到账为何不同步](https://lianxiaozhi.com/learn/confirmations-and-finality)

## 官方依据
- [Switchboard：canonical quote 账户、可变长度与解码范围](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/quote-program-accounts.md)
- [Switchboard：Solana managed quote 更新与 feed ID](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/basic-price-feed)
- [Switchboard：QuoteVerifier、新鲜度与授权更新边界](https://docs.switchboard.xyz/docs-by-chain/solana-svm/price-feeds/advanced-price-feed.md)
