如何在浏览器里监听 Solana 新币发射(可运行示例)
想做看板、告警,还是机器人「第一时间看到新 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](https://solana.com/docs/rpc/websocket/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](https://github.com/blockreq/blog-demos)(examples/solana-new-mint)。
程序常量:
- SPL Token:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - Token-2022:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
4. 走读:这个 demo 在干什么
逐步对应 src/index.ts / src/shared.ts:
- **连 WSS** — 打开 BlockReq 公共 WebSocket。
- **订两条 logsSubscribe** —
mentions每次只能一个地址,所以 Token 与 Token-2022 各订一次,commitment: "confirmed"。 - **过滤日志** — 用正则匹配
Instruction: InitializeMint/InitializeMint2;丢掉err != null的失败交易。 - **去重** — 用
signatureSet,避免重放刷屏。 - **打印 signature** — 先输出
[mint?] slot=… sig=…;随后可选调getTransaction解析 mint。 - **断线重连** —
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 一致):
POSTgetTransaction,带maxSupportedTransactionVersion: 0。- 合并
message.instructions与meta.innerInstructions[].instructions。 - 筛选 program 为 Token / Token-2022,且
parsed.type含initializemint。 - 返回
parsed.info.mint。
把 watcher 打印的 signature 粘进第二个页面即可验证。
6. 换成 BlockReq 带 Key:只讲做法,demo 不含密钥
可运行 demo **故意只用公共 endpoint**,仓库里不会出现 API Key。你自己的应用要长期订阅时:
| 用途 | Endpoint |
|---|---|
| 公共 HTTPS | https://solana-rpc.blockreq.com/v1/rpc/public |
| 私有 HTTPS | https://solana-rpc.blockreq.com/v1/rpc/{API_KEY} |
| 公共 / 私有 WSS | wss://…/public 或 wss://…/{API_KEY} |
公共按 **IP 限流**;长期订阅请用私有 Key,并在控制台确认 WSS / 订阅对你的套餐开启。客户端仍要自己做:指数退避重连、重订、signature 去重。多上游故障转移解决的是「节点挂了还能通」,不是「浏览器 WS 永不掉」。
更多:[Public Endpoints](https://docs.blockreq.com/build/public-endpoints/) · [Solana API](https://docs.blockreq.com/build/api-reference/solana/)
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。
---
小结
- 浏览器路径:
WebSocket→logsSubscribe+mentions: [Token Program]→ 过滤InitializeMint(2)→getTransaction取 mint。 - Token 与 Token-2022 分开订;launchpad 另订其 program。
logsSubscribe适合原型与轻量告警;低延迟大规模用 Geyser。- 可运行示例在 StackBlitz / [blog-demos](https://github.com/blockreq/blog-demos);换成带 Key 的 BlockReq 只改 URL,不要把 Key 写进公开仓库。
下一步通常是:解析 mint → 拉 metadata → 盯池子创建。那是另一篇文章的事了。