使用 WebSocket 与 Solana Kit 实时监控链上账户变动

·

8 分钟实战教程

2024 年起,Solana 官方 JavaScript 库正式更名为 Solana Kit,带来了更现代化的 WebSocket 订阅接口。本文将手把手教你从零搭建一台“实时分账监控器”,通过 Solana Kit 的新 API 监听任意账户的 SOL 余额变化,并在控制台即时展示变动详情。

新旧 API 对比:为什么要升级?

关键词:Solana Kit、WebSocket 实时监控、账户监听、TypeScript、现代异步迭代、AbortController、余额追踪


一分钟跑通:核心流程速览

  1. 创建空项目并初始化
  2. 一键安装 @solana/kit 与 TypeScript
  3. 通过三行代码订阅账户通知
  4. 将 Lamports 格式化为 SOL 并打印
  5. 优雅收尾:用完即销毁订阅

环境准备

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。建议:


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 实时数据沙盒