4种方法监听Solana链上事件

你可以通过轮询、websockets、Geyser 或 Helius webhooks 监听 Solana 上的链上事件。 每种方法都有其优点和缺点。

4种方法监听Solana链上事件
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK

作为加密货币开发人员最基本的部分之一是建立监听区块链的系统。 你可能正在监听付款确认、NFT 销售、资金转账,或者您可能只是出于安全目的而监控账户。 无论用例是什么,你为监视链而构建的系统必须具有容错性、可靠性并针对延迟进行优化,这一点至关重要。

在这篇文章中,我们将介绍在 Solana 上构建此类系统的几种方法、示例用例,以及如何使用 Helius 构建更好的系统。

1、链上事件监听方法概述

监听链上事件主要有两种方式:

  • 轮询
  • 流送

轮询(polling)是一种客户端或应用程序重复检查服务器或数据源是否有新数据的方法。 这可以按设定的时间间隔或按需完成。 当请求发送到服务器时,无论是否发生任何变化,服务器都会以最新的数据进行响应。 这意味着客户端或应用程序可能会重复接收相同的数据,即使没有更新。

另一方面,流送(streaming)是一种当有更新时服务器将数据推送到客户端或应用程序的技术。 这意味着客户端不需要重复请求数据,服务器只在有变化时才发送数据。 由于服务器仅发送相关数据,因此数据传输更加高效和实时。

虽然轮询是一种简单且广泛使用的技术,但它可能会导致较高的网络流量,并且可能会占用大量资源,尤其是在频繁发出请求时。 另一方面,流式传输更加高效,因为服务器仅发送更新,从而减少了传输的数据量和网络流量。

流送通常用于实时数据更新至关重要的应用程序,例如股票市场动态、社交媒体更新和在线游戏。 轮询更常用于数据更新不太频繁或不重要的应用程序,例如电子邮件客户端或新闻网站。

虽然这两种技术都有其优点和缺点,但流式传输通常是实时数据更新的更有效和首选方法,而轮询对于数据更新不太频繁的某些应用程序仍然有用。

对于区块链上的大多数类型的工作流程(尤其是 Solana),你需要坚持使用流式处理。 造成这种情况的原因有几个,但流式处理将更容易实现,并且更容易处理 Solana 擅长的高流量用例。

2、如何监听 Solana 上的链上事件

Solana 是一个非常快的区块链。 它每 400 毫秒发出新块,这些块通常包含数千个交易。 疯狂的是,这是有史以来最慢的。 随着核心工程师不断致力于系统的开发,链上处理新数据的速度只会增加。 因此,在设计系统时考虑到可扩展性至关重要。

幸运的是,你有几种方法可以监听 Solana 上的链上数据:

  • 轮询
  • websocket
  • Geyser
  • Helius Webhook

2.1 轮询

这是侦听 Solana 上事件的最不优先的方式,尽管它在概念上可能是最简单的。

根据你尝试获取的数据,只需设置一个循环,在 Solana RPC(如 Helius)上重复调用 JSON-RPC 方法。 这里的常见用例是轮询“getBlock”方法以侦听新块,或轮询“getSignaturesForAddress”以检查给定地址的新交易。

有趣的是,这也可能是非常高级的用例的最佳方法,在这些用例中,你有非常自定义的逻辑来触发新的更新。

2.2 Websocket

Solana RPC 还公开 PubSub Websockets 供开发人员连接。 可用的事件类型有:

下面是一个使用 JavaScript 编写的小代码示例,用于通过 Helius RPC(支持 websockets)监听帐户更改:

const solanaWeb3 = require(‘@solana/web3.js’)
const connection = new solanaWeb3.Connection(“https://rpc.helius.xyz?api-key=“);
(async () => {  
connection.onAccountChange(
new solanaWeb3.PublicKey(“5yv6Vh8FNx93TXeSS94xy8VLZMbTqx4vXp7Zg5bDLZtE”),
(updatedAccountInfo, context) => console.log(“Updated account info: “, updatedAccountInfo),“confirmed”  );
})();

关于 Websocket 的一个非常重要的警告是,虽然它们对于原型设计非常有用,但我们发现它们在实践中非常脆弱且不可靠。 强烈建议你不要将它们用于关键任务工作流程,因为你会错过事件。

2.3 Geyser

TL;DR — 你可以让 Solana 上的节点直接通过插件界面向你传输数据,该插件界面可自定义你接收数据的方式。 这是 Solana 上传输数据最快、延迟最低的方式,对于 DeFi 清算和延迟敏感应用程序来说绝对是必需的。

Solana 验证器和 RPC 具有独特的 Solana 原生流数据方式:Geyser 插件。

验证器得到了增强,支持一种称为“Geyser”插件的插件机制,通过该插件可以将有关帐户、槽、块和交易的信息传输到外部数据存储,例如关系数据库、NoSQL 数据库或 Kafka。 然后可以开发 RPC 服务来使用来自这些外部数据存储的数据,并可以进行更灵活和更有针对性的优化,例如缓存和索引。

不幸的是,设置 Geyser 可能非常复杂且昂贵。 即使在设置完成之后,你也需要大量的 DevOps 工作来确保其顺利运行。 幸运的是,在 Helius,我们开发了一种名为 GeyserVM 的东西,它可以让你上传插件并在几秒钟内运行它们。 我们的高可用性和冗余集群确保你不必担心任何数据问题,并且由于资源是共享的,你每月可以节省 200% 以上的成本!

2.4  Webhook

Webhook 是一个简单的概念。 简而言之,Webhooks 监听事件并在事件发生时将它们发送到你设置的服务器。 例如,你可能有兴趣在 NFT 销售发生时向你的 Discord 服务器发送通知 - Webhook 可以无缝完成此操作。

对于 Solana 上的大多数事件侦听工作流程,Webhook 将是最简单、最灵活且最具成本效益的方法。 Webhook 唯一应该让你暂停的情况是极低延迟的用例,其中 5 毫秒的差异可能会决定你的应用程序的成败,例如高频交易。

Helius构建了所有加密货币中最强大的 Webhook 产品,你最多可以侦听 100,000 个地址,配置你想要侦听的事件类型,然后只需输入你的服务器的 URL — 这就是开始所需的全部内容 。

此类服务的众多好处之一是,你不仅可以节省开发人员数周或数月的时间和精力,而且还可以获得一个可随着你的成长而扩展的弹性后端。

3、用例

好的,现在你知道如何监听 Solana 上的链上事件了,接下来应该做什么? 以下是一些可能有趣的用例:

机器人:

  • 当 NFT 在市场 X 上列出时,触发“nft 购买”操作。
  • 当保证金头寸不健康时,触发“强平”动作。

监控和警报:

  • 当程序发出特定日志时,触发 PagerDuty 集成。
  • 当代币帐户余额变化超过 X% 时,使用方言传达警告操作。

事件驱动索引:

  • 当给定程序发生任何交易时,将其直接发送到你的数据库或后端。

通知和活动跟踪:

  • 当从钱包 X 转账到钱包 Y 时——发送 Slack 通知或电子邮件。

分析和日志:

  • 当事件 X 发生时,将其发送到 ETL 管道或直接将其保留在 Helius 上以查看一段时间内的趋势。

工作流程自动化:

  • 当事件 X 发生时,触发任意一组操作。

4、结束语

在这篇文章中,我们介绍了轮询和流式传输之间的差异、监听 Solana 区块链的不同方式以及一些示例用例。

总之,你可以通过轮询、websockets、Geyser 或 Helius webhooks 监听 Solana 上的链上事件。 每种方法都有其优点和缺点,在决定实施哪种方法之前,请务必考虑系统的要求。


原文链接:Listening to On-chain Events on Solana

DefiPlot翻译整理,转载请标明出处

通过 NowPayments 打赏