8 分钟实战教程
2024 年起,Solana 官方 JavaScript 库正式更名为 Solana Kit,带来了更现代化的 WebSocket 订阅接口。本文将手把手教你从零搭建一台“实时分账监控器”,通过 Solana Kit 的新 API 监听任意账户的 SOL 余额变化,并在控制台即时展示变动详情。
新旧 API 对比:为什么要升级?
- 类型安全
全链路 TypeScript 泛型,告别any
魔法。 - 现代异步流
用for await…of
取代回调地狱,与浏览器标准同步。 - AbortController 整合
内置清理机制,避免内存泄漏。 - 错误处理升级
细粒度的错误类型与栈回溯。
关键词:Solana Kit、WebSocket 实时监控、账户监听、TypeScript、现代异步迭代、AbortController、余额追踪
一分钟跑通:核心流程速览
- 创建空项目并初始化
- 一键安装
@solana/kit
与 TypeScript - 通过三行代码订阅账户通知
- 将 Lamports 格式化为 SOL 并打印
- 优雅收尾:用完即销毁订阅
环境准备
1. 新建目录与初始化
mkdir monitor-sol-balance && cd monitor-sol-balance
npm init -y
2. 安装依赖
npm install @solana/kit
npm install -D typescript ts-node @types/node
3. 配置 tsconfig.json
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "NodeNext",
"target": "ESNext",
"noEmit": true
}
}
一步步写出监控脚本
建议将以下代码按章节粘贴到 src/app.ts
文件中。
1. 引入必要模块
import {
createSolanaRpcSubscriptions,
RpcSubscriptions,
address,
Address
} from '@solana/kit';
2. 配置常量
const WSS_PROVIDER_URL = 'wss://your-wss.quicknode.endpoints/mainnet/abc123';
const LAMPORTS_PER_SOL = 1_000_000_000;
const TARGET_ACCOUNT = address('CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM');
把你的 WSS 地址替换到 WSS_PROVIDER_URL
。
3. 格式化工具函数
const lamportsToSOL = (lamp: number): string =>
(lamp / LAMPORTS_PER_SOL).toLocaleString('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
4. 创建监听接口
interface MonitorArgs {
rpc: RpcSubscriptions;
address: Address;
abort: AbortSignal;
}
5. 核心监听逻辑
async function monitorAccount({ rpc, address, abort }: MonitorArgs) {
let prev: number | null = null;
const stream = await rpc
.accountNotifications(address, { commitment: 'confirmed' })
.subscribe({ abortSignal: abort });
for await (const note of stream) {
const slot = note.context.slot.toLocaleString();
const current = Number(note.value.lamports);
const delta = prev !== null ? current - prev : 0;
const sign = delta > 0 ? '+' : delta < 0 ? '-' : ' ';
console.log(
`Slot ${slot}: New Balance ${lamportsToSOL(current)} SOL (${sign}${lamportsToSOL(Math.abs(delta))})`
);
prev = current;
}
}
6. 启动函数
async function main() {
console.log('🔔 启动 Pump.fun 手续费账户监听...');
const client = createSolanaRpcSubscriptions(WSS_PROVIDER_URL);
const controller = new AbortController();
process.on('SIGINT', () => {
console.log('\n🛑 终止监听...');
controller.abort();
process.exit(0);
});
try {
await monitorAccount({ rpc: client, address: TARGET_ACCOUNT, abort: controller.signal });
} catch (err) {
console.error('订阅异常', err);
}
}
main();
运行脚本:
npx ts-node src/app.ts
控制台会实时展示类似:
Slot 301,428,932: New Balance 265,598.16 SOL (+0.14)
性能与成本提示
WebSocket 模式按 返回的消息数量 计费,每条约 20 credits。建议:
- 非工作时间调用
AbortController.abort()
暂停订阅 - 配合
commitment
滤波,仅在finalized
级别获取关键数据 - 若需超高吞吐,可评估 [ Yellowstone Geyser gRPC ] 或 QuickNode Streams
FAQ:开发者最关心的 6 个问题
Q1:监听失败常见原因?
A:检查 WSS 链接是否带有 ?reconnect=true
参数,确保网络可穿透防火墙。测试连通可用 wscat:wscat -c wss://...
。
Q2:能监听 SPL Token 余额吗?
A:Solana Kit 同样支持 tokenAccountNotifications
,只需将 Token 账户地址替换为关联代币账户(ATA)即可。
Q3:不同环境(devnet vs mainnet)如何切换?
A:在 QuickNode 控制台复制对应链的 WSS 地址,替换常量 WSS_PROVIDER_URL
即可;无需改动其余代码。
Q4:捕错后该怎么优雅重启?
A:在 monitorAccount
外层加 Run-Loop,监听关闭信号或异常后再 setTimeout
延迟重连,同时引入指数退避。
Q5:需要保存历史余额快照吗?
A:推荐将 Slot 与余额一起写入 Postgres/SQLite,后续用 slot
做 replay 校验。也可通过附加 gRPC 流回填遗漏数据。
Q6:想私有化部署节点可行吗?
A:可使用官方 agave-validator 自托管,确保开启 --rpc_pubsub_enable
并调高 rpc_pubsub_max_connections_per_ip
参数。
小结与进阶阅读
至此,你已掌握:
- Solana Kit 新一代 WebSocket API 的使用方式
- 如何优雅关流、处理异常
- 账单模型与优化策略
如果你想进一步优化消息过滤与同步,请务必阅读: