新消息:Helius 收购 Light Protocol
监听 Solana 上的链上事件
博客/基础知识

监听 Solana 上的链上事件

联合创始人兼 CEOX 上的 Mert MumtazLinkedIn 上的 Mert Mumtaz
阅读需 7 分钟

简介

作为一名加密领域的开发者,最基础的工作之一就是搭建监听区块链的系统。你可能需要监听付款确认、NFT 销售和资金转账,也可能只是出于安全目的监控账户。无论你的用例是什么,用于监控链上活动的系统都必须具备容错能力、可靠性,并针对延迟进行优化。

本文将介绍在 Solana 上构建此类系统的几种方式、示例用例,以及如何借助 Helius 构建更出色的系统。

监听区块链

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

  1. 轮询
  2. 流式传输

轮询是指客户端或应用反复检查服务器或数据源,以获取新数据。检查可以按固定间隔执行,也可以按需执行。当请求发送到服务器时,无论数据是否发生变化,服务器都会返回最新数据。这意味着,即使没有更新,客户端或应用也可能反复收到相同的数据。

相比之下,流式传输是指当有更新时,由服务器将数据推送给客户端或应用。这样,客户端无需反复请求数据,服务器也只会在数据发生变化时发送数据。由于服务器仅发送相关数据,因此数据传输更高效,也更具实时性。

轮询虽然简单且应用广泛,但会产生大量网络流量,也可能消耗较多资源,尤其是在频繁发送请求时。流式传输则更高效,因为服务器只发送更新,从而减少数据传输量和网络流量。

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

这两种技术各有优缺点,但对于实时数据更新,流式传输通常是更高效、更理想的方式;而在数据更新不频繁的特定应用中,轮询仍然很有用。

对于区块链上的大多数工作流,尤其是 Solana,你应该优先选择流式传输。原因有很多,但最重要的是,流式传输更容易实现,也更适合处理 Solana 所擅长的高流量用例。

如何监听 Solana 上的链上事件

Solana 是一条速度极快的区块链。它每 400ms 生成一个新区块,而这些区块通常包含数千笔交易。更惊人的是,这已经是它今后最慢的状态。随着核心工程师持续改进系统,链上处理新数据的速度只会越来越快。因此,在设计系统时,必须充分考虑可扩展性。

幸运的是,你可以通过以下几种方式监听 Solana 上的链上数据:

  1. 轮询
  2. WebSockets
  3. Geyser
  4. Helius Webhooks

轮询

这是监听 Solana 事件最不推荐的方式,不过从概念上看,它可能最简单。

根据你想获取的数据,只需设置一个循环,反复调用 Solana RPC 节点上的 JSON-RPC 方法。常见用例包括轮询 getBlock 方法来监听新区块,或轮询 `getSignaturesForAddress` 来检查指定地址的新交易。

有趣的是,对于需要使用高度自定义逻辑来触发新更新的高级用例,这也可能是最佳方法。

WebSockets

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”  );
})();

‍关于 WebSockets,有一点非常重要:虽然它们很适合用于原型开发,但我们发现在实际应用中,它们相当脆弱且不可靠。强烈建议不要将其用于关键任务工作流,否则你会遗漏事件。

Geyser

简而言之,你可以通过插件接口,让 Solana 上的节点直接向你流式传输数据,并自定义接收数据的方式。这是在 Solana 上流式传输数据最快、延迟最低的方式,也是 DeFi 清算和延迟敏感型应用等场景的必备选择。

Solana 验证者和 RPC 提供了一种 Solana 原生的独特数据流式传输方式:Geyser 插件。

验证者已得到增强,可支持一种名为“Geyser”插件的插件机制。通过该机制,账户、时隙、区块和交易信息可以传输到关系型数据库、NoSQL 数据库或 Kafka 等外部数据存储。随后可以开发 RPC 服务来使用这些外部数据存储中的数据,并实现缓存和索引等更灵活、更有针对性的优化。

遗憾的是,部署 Geyser 的过程可能相当复杂,成本也很高。即使完成部署,你仍需要投入大量 DevOps 工作,确保它稳定运行。幸运的是,Helius 开发了 GeyserVM,让你可以上传插件,并在几秒内完成运行。我们的高可用冗余集群让你无需担心任何数据问题;由于资源共享,你每月的成本可降低超过 200%!

如果你需要专属的 Geyser 即服务,我们当然也可以提供。点击此处了解更多信息。

Webhook

Webhook 的概念很简单。简而言之,webhook 会监听事件,并在事件发生时将其发送到你设置的服务器。例如,你可能希望每次发生 NFT 销售时,都向 Discord 服务器发送通知。Webhook 可以无缝实现这一点。

对于 Solana 上的大多数事件监听工作流,webhook 都是最简单、最灵活且最具成本效益的方法。只有在对延迟要求极高、5ms 的差异就可能决定应用成败的用例中,你才需要谨慎考虑是否使用 webhook,例如高频交易。

Helius 打造了整个加密行业中最强大的 webhook 服务。

你可以监听多达 100,000 个地址(每个 webhook!),配置要监听的事件类型(我们会为你解析!),然后只需填入服务器的 URL。就这么简单,而且可以免费开始使用。

此类服务的众多优势之一是:它不仅能为你节省数周乃至数月的开发时间和精力,还能提供可随业务增长弹性扩展的后端。

点击此处详细了解 webhook。

用例

好了,现在你已经知道如何监听 Solana 上的链上事件,接下来该做什么?以下是一些可能值得关注的用例:

机器人

  • 当 NFT 在市场 X 上架时,触发“购买 NFT”操作。
  • 当保证金头寸处于不健康状态时,触发“清算”操作。

监控与警报

  • 当程序发出特定日志时,触发 PagerDuty 集成。
  • 当代币账户余额变化超过 X% 时,使用 Dialect 发出警告。

事件驱动的索引

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

通知与活动跟踪

  • 当钱包 X 向钱包 Y 发起转账时,发送 Slack 通知或电子邮件。

分析与日志

  • 当事件 X 发生时,将其发送到 ETL 管道,或直接持久化到 Helius,以查看长期趋势。

工作流自动化

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

总结

本文介绍了轮询与流式传输之间的区别、监听 Solana 区块链的不同方式,以及一些示例用例。

总而言之,你可以通过轮询、WebSockets、Geyser 或 Helius webhook 监听 Solana 上的链上事件。每种方式都有各自的优缺点。在决定采用哪种实现方式之前,务必先考虑系统的具体要求。感谢阅读!

如需详细了解 Helius 提供的 Solana RPC、Solana API、Solana Webhooks 和 Solana 基础设施,请访问我们的网站。

‍

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新