本文介绍了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订阅系统引入了几个改进:
for await...of
循环而不是回调,符合现代异步迭代协议。mkdir solana-subscriptions-v2 && cd solana-subscriptions-v2
npm init -y
npm install @solana/web3.js@2
如果你没有全局安装开发依赖项,请安装:
npm install --save-dev typescript ts-node @types/node
tsc --init
并用以下内容更新配置文件:
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "NodeNext",
"noEmit": true,
"target": "ESNext"
},
}
创建一个名为app.ts
的新文件,让我们一步一步实现账户监控系统。
echo > app.ts
在代码编辑器中打开该文件,我们开始吧!
在app.ts
文件中添加以下导入:
import {
createSolanaRpcSubscriptions,
RpcSubscriptions,
SolanaRpcSubscriptionsApi,
address,
Address
} from '@solana/web3.js';
简化调试的日志
你现在可以访问RPC端点的日志,帮助你更有效地排查问题。如果你在RPC调用中遇到问题,只需在QuickNode仪表板中检查日志即可快速识别和解决问题。了解有关日志历史限制的更多信息,请参见我们的定价页面。
在你的导入下面添加以下常量:
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端点来连接到网络。
复制WSS提供者链接并更新你的WSS_PROVIDER_URL
常量以匹配链接。
我们将监控Pump.fun费用账户(CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM)的余额变更,但你可以随意使用任何你喜欢的Solana账户。请注意,Solana Web3.js 2.0库要求我们使用@solana/web3.js
库中的_Address_类型——我们可以使用库中的address
函数从字符串创建Address。
在你的常量下面添加以下辅助函数:
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)。
让我们创建一个接口来定义我们追踪函数的参数:
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方法。请查看我们的文档以获取更多信息。
将以下内容添加到你的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;
}
}
让我们拆解一下:
lastLamports
的变量,并将其设置为null
。这个变量将用于存储账户的最后已知余额,以便我们在收到新通知时计算增量。try/catch
块来处理创建订阅时的错误。try
块中,我们在rpcSubscriptions
对象上调用accountNotifications
方法(类似于v1库中的onAccountChange
方法),传入accountAddress
和commitment
选项。我们还传入abortSignal
,以便在需要时取消订阅。try/catch
块来处理处理通知时的错误。try
块中,我们使用for await...of
循环来迭代从订阅中收到的通知。我们从context
中获取slot
,并从每个通知的value
中获取lamports
,然后进行一些轻处理,将余额变化记录到控制台中。将以下内容添加到你的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积分页面以获取更新的计费费率。
为了优化你的订阅并确保你没有为不必要的订阅或无关的响应付费,你应该考虑以下事项:
QuickNode提供几种从Solana获取实时数据的解决方案。查看以下选项以找到适合你用例的工具:
有关更多信息,请查看我们的博客文章。
Web3.js 2.0提供了一种更健壮、类型安全的方法来处理Solana WebSocket订阅。新的API使管理订阅、处理错误和正确清理资源变得更容易。当构建需要监控Solana区块链事件的应用程序时,这些新功能有助于创建更可靠和可维护的代码。
告诉我们 如果你有任何反馈或新的主题请求。我们很乐意听到你的声音。
有关更多信息,请查看:
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!