使用WebSockets和Solana Kit监控Solana账户

QuickNode 发布于 2026-05-11 阅读 161

本文介绍了Solana Kit(原Solana Web.js 2.0)的新WebSocket订阅系统,通过监控Pump.fun费用账户的余额变化,展示了如何使用TypeScript设置订阅、处理通知和资源清理。文章包含环境搭建、代码实现、运行示例及优化建议。

🛠️ 更新通知

本指南已更新,以反映 Solana Web3.js 2.0 的新名称——Solana Kit。我们遵循最新的最佳实践,帮助你保持领先。在此了解更多关于 Solana Kit 的信息

概述

2024 年 9 月,Solana 宣布了 Solana Web3.js 2.0(现称为 Solana Kit)——这是他们用于与 Solana 区块链交互的 JavaScript 库的一次重大更新。除了许多其他功能外,Solana Kit 引入了一种更强大的新方式来处理 WebSocket 订阅,以监控链上事件。本指南将向你展示如何使用新的订阅系统实现账户监控,该系统相比之前的版本提供了更好的类型安全性和错误处理能力。

你将做什么

在本指南中,你将学习如何:

  • 使用新的 @solana/kit API 设置 WebSocket 连接
  • 创建账户订阅以监控 Pump.fun 费用账户的余额变化
  • 处理订阅清理和错误情况
  • 以用户友好的方式格式化和显示余额变化

脚本演示

你需要什么

  • Node.js(建议版本 20.0 或更高)
  • npm 或 yarn 包管理器
  • 已安装 TypeScript 和 ts-node

与 Web3.js 1.0 的主要区别

新的 @solana/kit 订阅系统引入了以下改进:

  1. 类型安全:新 API 全程使用 TypeScript 泛型和严格类型。
  2. 现代异步迭代:使用 for await...of 循环替代回调,符合现代异步迭代器协议
  3. AbortController 集成:内置使用 AbortController 进行订阅清理的支持。如果你不熟悉,AbortController 是一个内置的 JavaScript 类,允许你中止异步操作,例如 HTTP 请求或 WebSocket 连接。
  4. 更好的错误处理:改进的错误类型和处理机制。

设置环境

1. 创建新项目目录:

mkdir solana-subscriptions-v2 && cd solana-subscriptions-v2

2. 初始化新的 npm 项目:

npm init -y

3. 安装所需的依赖:

npm install @solana/kit

以及开发依赖(如果你没有全局安装):

npm install --save-dev typescript ts-node @types/node

4. 创建 TypeScript 配置文件 (tsconfig.json):

tsc --init

并使用以下内容更新配置文件:

{
  "compilerOptions": {
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "noEmit": true,
    "target": "ESNext"
  },
}

创建账户监控器

创建一个名为 app.ts 的新文件,让我们逐步实现账户监控系统。

echo > app.ts

在代码编辑器中打开该文件,让我们开始吧!

1. 导入所需依赖:

app.ts 文件中添加以下导入语句:

import {
    createSolanaRpcSubscriptions,
    RpcSubscriptions,
    SolanaRpcSubscriptionsApi,
    address,
    Address
} from '@solana/kit';

2. 定义常量:

在导入语句下方,添加以下常量:

const WSS_PROVIDER_URL = 'wss://your-quicknode-endpoint.example';
const LAMPORTS_PER_SOL = 1_000_000_000;
const PUMP_FUN_FEE_ACCOUNT = address("CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM");

要在 Solana 上构建,你需要一个 API 端点来连接网络。

了解为什么超过 50% 的 Solana 项目选择 Quicknode,并在此注册账户。我们将使用 Solana 主网端点。

Solana 主网端点

复制 WSS 提供者链接,并更新你的 WSS_PROVIDER_URL 常量以匹配该链接。

我们将监控 Pump.fun 费用账户 (CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM) 的余额变化,但你也可以使用任何 Solana 账户。注意,@solana/kit 库要求我们使用 @solana/kit 库中的 Address 类型——我们可以使用库中的 address 函数从字符串创建 Address

3. 定义辅助函数:

在常量下方添加以下辅助函数:

const lamportsToSolString = (lamports: number, includeUnit = true): string => {
    const solAmount = lamports / LAMPORTS_PER_SOL;
    return `${solAmount.toLocaleString('en-US', {
        minimumFractionDigits: 2,
        maximumFractionDigits: 2
    })} ${includeUnit ? 'SOL' : ''}`;
};

此函数将 lamports 格式化为 SOL,保留两位小数,并可选择在字符串中包含单位 (SOL)。

4. 定义接口:

让我们创建一个接口来定义跟踪函数的参数:

interface TrackAccountArgs {
    rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;
    accountAddress: Address;
    abortSignal: AbortSignal;
}

在前面的部分中,我们讨论了 AddressAbortSignal,让我们快速了解一下 RpcSubscriptionsSolanaRpcSubscriptionsApi

在新的 Solana Kit API 中,之前通过 Connection 类暴露的方法现在通过两个类暴露:RpcRpcSubscriptions,一个用于 HTTP 请求,一个用于 WebSocket。RpcSubscriptions 类提供对 WebSocket 方法的访问,用于跟踪链上事件(例如账户变化、程序变化、日志、插槽等)。请查看我们的文档了解更多信息。

5. 创建账户跟踪函数:

将以下内容添加到 app.ts 文件中。我们将在下面逐步解释:

async function trackAccount({ rpcSubscriptions, accountAddress, abortSignal }: TrackAccountArgs) {
    let lastLamports: number | null = null;

    try {
        const accountNotifications = await rpcSubscriptions
            .accountNotifications(accountAddress, { commitment: 'confirmed' })
            .subscribe({ abortSignal });

        try {
            for await (const notification of accountNotifications) {
                const { slot } = notification.context;
                const currentLamports = Number(notification.value.lamports);
                const delta = lastLamports !== null ? currentLamports - lastLamports : 0;
                const sign = delta > 0 ? '+' : delta < 0 ? '-' : ' ';
                console.log(`   在插槽 ${slot.toLocaleString()} 检测到账户变化。新余额:${lamportsToSolString(currentLamports)} (${sign}${lamportsToSolString(Math.abs(delta))})`);
                lastLamports = currentLamports;
            }
        } catch (error) {
            throw error;
        }
    } catch (error) {
        throw error;
    }
}

让我们分解一下:

  1. 首先,我们定义一个名为 lastLamports 的变量并将其设置为 null。此变量将用于存储账户的最后已知余额,以便我们每次收到新通知时计算差额。
  2. 接下来,我们创建一个 try/catch 块来处理创建订阅时的错误。
  3. try 块内部,我们在 rpcSubscriptions 对象上调用 accountNotifications 方法(类似于 v1 库中的 onAccountChange 方法),传入 accountAddresscommitment 选项。我们还传入 abortSignal,以便在需要时取消订阅。
  4. 接下来,我们创建一个 try/catch 块来处理处理通知时的错误。
  5. try 块内部,我们使用 for await...of 循环迭代从订阅接收的通知。我们从每个通知的 context 中获取 slot,从 value 中获取 lamports,并进行一些简单的处理以将余额变化记录到控制台。

6. 创建入口点:

将以下内容添加到 app.ts 文件中以执行跟踪函数:

async function main() {
    console.log(`💊 跟踪 Pump.fun 费用账户:${PUMP_FUN_FEE_ACCOUNT} 💊`);
    const rpcSubscriptions = createSolanaRpcSubscriptions(WSS_PROVIDER_URL);
    const abortController = new AbortController();
    try {
        await trackAccount({
            rpcSubscriptions,
            accountAddress: PUMP_FUN_FEE_ACCOUNT,
            abortSignal: abortController.signal
        });
    } catch (e) {
        console.log('订阅错误', e);
    } finally {
        abortController.abort();
    }
}

main();

我们实际上是在为脚本创建一个入口点,当我们使用 ts-node 运行脚本时,该入口点将被执行。我们将在文件底部调用 main 函数。 main 函数将使用我们的 WSS_PROVIDER_URL 创建一个新的 RpcSubscriptions 类实例,我们将使用它来创建订阅。然后,我们将调用 trackAccount 函数,传入 RpcSubscriptions 实例、PUMP_FUN_FEE_ACCOUNT 地址和 abortController.signal

现在,让我们运行脚本。

运行监控器

当你准备好时,使用 ts-node 运行脚本:

ts-node app.ts

监控器将开始跟踪指定账户的变化,并以以下格式显示余额变化:

在插槽 301,428,932 检测到账户变化。新余额:265,598.16 SOL (+0.14 SOL)

干得好!🚀 🚀 🚀

计费与优化

WebSocket 方法的计费积分基于收到的响应数量,而不是创建的订阅数量。例如,如果你打开一个 accountNotifications 订阅并收到 100 个响应,你的账户将被计费 2,000 积分(每个响应 20 积分 X 100 个响应)。请查看 API 积分页面 了解最新计费率。

要优化你的订阅并确保你不会为不必要的订阅或不相关的响应付费,请考虑以下方面:

  • 使用 AbortController 或其他订阅逻辑在不再需要时取消订阅。
  • 对适用的方法使用过滤器,以仅接收相关数据。

替代方案

Quicknode 提供了多种从 Solana 获取实时数据的解决方案。请查看以下选项,找到适合你用例的工具:

  • WebSockets:如本指南所述,WebSockets 提供与 Solana 节点的直接连接,用于实时更新——它们适用于简单的应用程序和快速开发。
  • Yellowstone Geyser gRPC:Yellowstone Geyser gRPC 提供了一个强大的 gRPC 接口,用于流式传输 Solana 数据,并内置过滤和历史数据支持。
  • Streams:托管解决方案,用于将 Solana 数据处理并路由到多个目的地,并内置过滤和历史数据支持。

更多信息,请查看我们的博客文章

结论

Solana Kit 提供了一种更强大、类型安全的方式来处理 Solana WebSocket 订阅。新的 API 使得管理订阅、处理错误和正确清理资源变得更加容易。在构建需要监控 Solana 区块链事件的应用程序时,这些新功能有助于创建更可靠和可维护的代码。

我们 ❤️ 反馈!

如果你有任何反馈或新主题请求,请告诉我们。我们很乐意听到你的意见。

更多信息,请查看:

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论