不用连接钱包核对 Solana USDC:读取 mint、精度与权限字段
链小知 · 进阶 · 核验 · 已验证只读操作
把发行方公布的主网 mint 与 Solana 公开 RPC 的账户数据对上,区分 mint、钱包和 token account。本篇已完成三个只读 RPC 调用,未核验用户余额或收款到账。
开始前准备
- 先从 Circle 主网地址表确认 Solana 一行;Devnet 使用另一 mint,名称相同不能混用。
- 准备能发送 JSON 的本地 HTTP 客户端。本文请求使用公开 RPC,无需安装钱包、API 密钥或签名。
- 公共端点有速率与访问限制。本次直连超时后使用本机已有代理完成读取;不据此推断所有用户都能直连或服务整体停机。
1. 固定主网与发行方的完整 mint
Circle 主网表的 Solana USDC mint 为 EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v。逐字抄完整字符串;不要从代币名称、Logo、聊天截图或余额列表推断身份。请求目标是 mint 本身,不能把钱包地址或其收款 token account 代入本步骤。
本次使用 Solana 官方客户端文档映射的 https://api.mainnet-beta.solana.com。先以 JSON-RPC POST 发送 {"jsonrpc":"2.0","id":1,"method":"getGenesisHash"},记录返回值和端点。样本返回 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d;本次仅记录该值,没有用独立节点验证它。
检查结果:网络、发行方完整 mint 和实际 RPC 端点有记录;收到 HTTP 200 后仍检查 RPC error,不能只按 HTTP 状态判定成功。
2. 发送只读 getAccountInfo 请求
设置 Content-Type: application/json,请求体为 {"jsonrpc":"2.0","id":2,"method":"getAccountInfo","params":["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",{"commitment":"finalized","encoding":"jsonParsed"}]}。读取 result.value 与 context.slot。
value=null 时表示该承诺状态下没有取得账户,先查地址、网络与请求;error、429 或超时都保留失败。encoding 未得到 parsed 数据时不自行猜字段含义,应查解析支持或按官方格式解码。本次 parsed.type 为 mint、isInitialized=true、executable=false,账户上下文 slot=455712999。
检查结果:请求确实针对发行方 mint,返回已初始化 mint 类型及上下文;未把 null、错误或无法解析的数据填为零。
3. 区分程序 owner 与铸币、冻结权限
result.value.owner 是维护账户的程序,不是个人持有人。本次为原始 Token Program 地址 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,与官方程序源码 ID 相同。parsed.info.mintAuthority 和 freezeAuthority 是另外两项权限字段,应分别记录其地址或 null。
样本 decimals=6,铸币和冻结权限字段均存在。权限存在说明相应能力的配置,不能仅凭这一点判定项目有恶意;权限为 null 也不能证明所有其他风险消失。查询 mint 不会给出某个用户 token account 当前是否被冻结,更不会证明资产储备或兑付能力。
检查结果:程序 owner、mintAuthority、freezeAuthority 三项分开记录;没有把程序地址当个人持有人或作安全评级。
4. 独立读取供应字段,保存不同 slot
发送 {"jsonrpc":"2.0","id":3,"method":"getTokenSupply","params":["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",{"commitment":"finalized"}]}。使用 amount 字符串和 decimals 记录数量,不把大整数原值先转成 JavaScript Number;uiAmount 为显示值。
本次返回原始 amount=7937954857172205、decimals=6,与账户解析字段数值一致;但 supply 的 slot=455713000,与前一步不同。这是相邻时点的两个快照,不是同一 slot 的供应一致性证明。后续 mint/burn 会改变 supply,不能把这里的历史数字当实时供应量或某个钱包余额。
检查结果:原始字符串、精度与两个 slot 保留;只有同一上下文才比较当时状态,异时点差异不能直接判异常。
5. 写出身份核对完成与未验证范围
最终记录发行方 URL、网络、mint、RPC、读取时刻、两个 slot、程序 owner、精度和权限字段。可以说明本次读取的是发行方表列 mint 的已初始化账户数据;不能说明你的钱包已持有它、转账可到账或第三方交易对可卖出。
本次三个只读 RPC POST 均为 HTTP 200,字段检查通过。没有连接钱包、调用 sendTransaction、支付费用或查询用户地址;没有验证用户余额、商户账单、储备资产、兑付或冻结用户账户。公共 RPC 的访问成功也不构成生产可用性与 SLA 证明。
检查结果:交付可复查的 mint 身份及字段读数,钱包、支付、储备和服务可靠性未验证项明确保留。
怎样确认完成
- 发行方主网 mint 与请求地址一致,已初始化账户类型和程序 owner 可复查。
- 精度、权限、原始供应字符串与上下文分别记录。
- 公共端点连接失败与成功路径均保留;用户余额、转账和储备范围没有被扩大。
常见错误与边界
- USDC 名称相同,却混用主网、Devnet、包装资产或错误 mint。
- getAccountInfo 查询钱包或 token account 后,当作 mint 的供应与权限字段。
- 把程序 owner、持有人地址、mintAuthority 或 freezeAuthority 混为一谈。
- 大整数经 Number 丢失精度,或不同 slot 的供应差异被当作协议错误。
- 公开 RPC 的一次读取成功被当作转账、钱包余额、商户到账或储备兑付验收。