BlockReq
返回全部文章

实战示例

如何在浏览器里监听 Solana 新币发射(可运行示例)

如何用浏览器 WebSocket logsSubscribe 监听 Solana 新 mint:场景与原理、StackBlitz 可运行示例(公共 endpoint),过滤 InitializeMint / InitializeMint2,再用 getTransaction 解析 mint。

BlockReq Engineering2026年10月1日8 分钟阅读

想做看板、告警,还是机器人「第一时间看到新 mint」?不一定先上 Geyser。本文按「如何监听」教程写法:先讲场景与原理,再用 StackBlitz 可运行示例 订 Token Program 日志、过滤 InitializeMint / InitializeMint2,再从 signature 用 getTransaction 取出 mint。

本文不依赖自定义 RunSnippet / OPTIONS;可运行路径是 StackBlitz 嵌入。示例默认连 BlockReq 公共 endpoint(已对 HTTPS getHealth 做过连通性探测,结果为 ok)。公共节点按 IP 限流,适合学习,不适合长时间高频生产订阅。

1. 场景:为什么要听新 mint

常见需求三类:

  • 看板:列出新发射的 mint,再补 metadata、流动性、部署者。
  • 告警:只关心特定程序路径(例如某 launchpad)或异常高频创建。
  • 机器人:检测到创建指令后走解析 / 下单(延迟与误报都很敏感)。

共同点:要的是「某类指令刚出现」的推送,而不是轮询 getProgramAccounts。浏览器最小路径就是 WebSocket logsSubscribe;服务端高吞吐再考虑 Geyser / Yellowstone。

2. 原理:logsSubscribe vs Geyser

logsSubscribe(JSON-RPC WebSocket)Geyser / Yellowstone gRPC
接入成本浏览器、任意语言都能连需要 gRPC 客户端,浏览器不直接友好
数据形态日志字符串 + signature结构化账户 / 交易 protobuf
延迟与吞吐够做看板、告警;高频时易抖更适合低延迟、大规模过滤
过滤粒度mentions 一次只能一个地址;细节靠客户端扫 log服务端按 program / account 等细过滤
断线重连后窗口内容易丢,需自补部分实现可从 slot 续订 / 回放

怎么选: 原型、浏览器 demo、轻量告警 → logsSubscribe。生产级 sniper、大规模索引 → Geyser,需要时再用 RPC 补详情。

经典 SPL Token 创建日志类似:

Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]
Program log: Instruction: InitializeMint

更常见的是 InitializeMint2。Token-2022 程序 ID 不同,指令名同样会出现在 log 里。

官方参考:logsSubscribe。

3. 可运行示例 #1:订阅 Token Program → 过滤 InitializeMint

打开下方 StackBlitz 后,若预览未自动跑,请点 Run(ctl=1)。示例默认:

  • WSS:wss://solana-rpc.blockreq.com/v1/rpc/public
  • HTTPS:https://solana-rpc.blockreq.com/v1/rpc/public
  • 无 API Key、无 .env 密钥

仓库:blockreq/blog-demos(examples/solana-new-mint)。

程序常量:

  • SPL Token:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
  • Token-2022:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb

4. 走读:这个 demo 在干什么

逐步对应 src/index.ts / src/shared.ts:

  1. 连 WSS — 打开 BlockReq 公共 WebSocket。
  2. 订两条 logsSubscribe — mentions 每次只能一个地址,所以 Token 与 Token-2022 各订一次,commitment: "confirmed"。
  3. 过滤日志 — 用正则匹配 Instruction: InitializeMint / InitializeMint2;丢掉 err != null 的失败交易。
  4. 去重 — 用 signature Set,避免重放刷屏。
  5. 打印 signature — 先输出 [mint?] slot=… sig=…;随后可选调 getTransaction 解析 mint。
  6. 断线重连 — onclose 后指数退避重连,并重新订阅。

关键订阅参数(示意):

params: [{ mentions: [programId] }, { commitment: 'confirmed' }]

过滤核心:

const MINT_LOG = /Instruction:\s*InitializeMint2?/i;
if (!logs.some((line) => MINT_LOG.test(line))) return;

5. 从 signature 到 mint:getTransaction

日志订阅本身通常不会直接给出 mint 公钥。生产流程:看到 InitializeMint* → 用同一节点的 HTTPS 调 getTransaction(encoding: "jsonParsed")→ 从顶层 / inner instructions 里找 initializeMint / initializeMint2,读 parsed.info.mint。

第二个入口在同一示例里:src/get-mint.ts(页面 get-mint.html)。嵌入打开后同样请点 Run。

解析思路(与 demo 一致):

  1. POST getTransaction,带 maxSupportedTransactionVersion: 0。
  2. 合并 message.instructions 与 meta.innerInstructions[].instructions。
  3. 筛选 program 为 Token / Token-2022,且 parsed.type 含 initializemint。
  4. 返回 parsed.info.mint。

把 watcher 打印的 signature 粘进第二个页面即可验证。

6. 换成 BlockReq 带 Key:只讲做法,demo 不含密钥

可运行 demo 故意只用公共 endpoint,仓库里不会出现 API Key。你自己的应用要长期订阅时:

用途Endpoint
公共 HTTPShttps://solana-rpc.blockreq.com/v1/rpc/public
私有 HTTPShttps://solana-rpc.blockreq.com/v1/rpc/{API_KEY}
公共 / 私有 WSSwss://…/public 或 wss://…/{API_KEY}

公共按 IP 限流;长期订阅请用私有 Key,并在控制台确认 WSS / 订阅对你的套餐开启。客户端仍要自己做:指数退避重连、重订、signature 去重。多上游故障转移解决的是「节点挂了还能通」,不是「浏览器 WS 永不掉」。

更多:Public Endpoints · Solana API

7. 踩坑:噪音、假币、确认数、launchpad

噪音 — 订 Token Program 会收到海量 Transfer / MintTo;务必先过滤 InitializeMint(2),再 getTransaction。processed 更快更抖;看板可用 confirmed,资金逻辑更偏向 finalized。

假币 / 垃圾发射 — 链上能 InitializeMint ≠ 有流动性 ≠ 可信 metadata。建议二次校验:权限是否立即 revoke、是否立刻建池、metadata URI、部署者历史。

launchpad — pump.fun 等往往走自己的 program create,不一定等于裸调 Token InitializeMint。要盯它们,应 mentions 对应 program ID,并按该程序规则解析;只扫 Token 会漏,只扫 launchpad 会漏手工 spl-token create-token。

确认数与漏消息 — 重连空窗、限流、日志截断都会漏。重要业务用第二来源对账(短时 getSignaturesForAddress 或 Geyser 备份流)。失败交易里也可能出现指令名字符串——示例直接丢弃 err != null。

---

小结

  1. 浏览器路径:WebSocket → logsSubscribe + mentions: [Token Program] → 过滤 InitializeMint(2) → getTransaction 取 mint。
  2. Token 与 Token-2022 分开订;launchpad 另订其 program。
  3. logsSubscribe 适合原型与轻量告警;低延迟大规模用 Geyser。
  4. 可运行示例在 StackBlitz / blog-demos;换成带 Key 的 BlockReq 只改 URL,不要把 Key 写进公开仓库。

下一步通常是:解析 mint → 拉 metadata → 盯池子创建。那是另一篇文章的事了。