使用WebSockets和Solana Web3.js 2.0监控Solana账户

  • QuickNode
  • 发布于 2025-01-13 16:41
  • 阅读 41

本文介绍了Solana Web3.js 2.0的新特性,详细讲解了如何使用新版的WebSocket订阅系统来监控Solana区块链上的账户变化,并提供了代码示例和步骤说明。

概述

Solana 最近宣布 Solana Web3.js 2.0,这是他们与Solana区块链交互的JavaScript库的一次重大更新。在许多其他功能中,Solana Web3.js 2.0引入了一种新的、更健壮的WebSocket订阅处理方式,用于监控链上事件。本指南将向你展示如何使用新的订阅系统实现账户监控,该系统比之前的版本提供了更好的类型安全和错误处理。

你将要做的事情

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

  • 使用新的Web3.js 2.0 API设置WebSocket连接
  • 创建一个账户订阅,以监控Pump.fun费用账户的余额变更
  • 处理订阅清理和错误情况
  • 以用户友好的方式格式化和显示余额变更

脚本演示

你将需要的东西

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

Web3.js 1.0的主要区别

新的Web3.js 2.0订阅系统引入了几个改进:

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

设置你的环境

1. 创建一个新的项目目录:

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

2. 初始化一个新的npm项目:

npm init -y

3. 安装所需的依赖:

npm install @solana/web3.js@2

如果你没有全局安装开发依赖项,请安装:

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/web3.js';

简化调试的日志

你现在可以访问RPC端点的日志,帮助你更有效地排查问题。如果你在RPC调用中遇到问题,只需在QuickNode仪表板中检查日志即可快速识别和解决问题。了解有关日志历史限制的更多信息,请参见我们的定价页面。

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端点来连接到网络。

Solana主网端点

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

我们将监控Pump.fun费用账户(CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM)的余额变更,但你可以随意使用任何你喜欢的Solana账户。请注意,Solana Web3.js 2.0库要求我们使用@solana/web3.js库中的_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;
}

在前面的部分中,我们讨论了_Address_和AbortSignal,接下来我们快速谈谈_RpcSubscriptions_和SolanaRpcSubscriptionsApi

在新的Web3.js 2.0 API中,以前通过_Connection_类暴露的方法现在通过两个类暴露:_Rpc_和RpcSubscriptions,一个用于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 gRPC Geyser插件:Yellowstone gRPC Geyser插件提供一个强大的gRPC接口,用于流式传输Solana数据,内置过滤和历史数据支持。
  • :管理解决方案,可将Solana数据处理并路由到多个目标,内置过滤和历史数据支持。

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

结论

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

我们❤️反馈!

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

有关更多信息,请查看:

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。