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

在这篇文章中,我们将介绍在 Solana 上构建此类系统的几种方法、示例用例以及如何使用 Helius 构建更好的系统。
聆听区块链
监听链上事件主要有两种方式:
轮询
流媒体
轮询是一种客户端或应用程序反复检查服务器或数据源是否有新数据的方法。这可以按设定的时间间隔或按需进行。当请求发送到服务器时,服务器会以最新数据进行响应,无论是否有任何更改。这意味着客户端或应用程序可能会重复收到相同的数据,即使没有更新。
而流式传输则是一种当有更新时服务器将数据推送到客户端或应用程序的技术。这意味着客户端不需要重复请求数据,服务器只在有变化时发送数据。由于服务器只发送相关数据,因此数据传输更加高效、实时。
虽然轮询是一种简单且广泛使用的技术,但它可能导致高网络流量并且占用大量资源,尤其是在频繁发出请求时。另一方面,流式传输效率更高,因为服务器只发送更新,从而减少了传输的数据量和网络流量。
流式传输通常用于实时数据更新至关重要的应用程序,例如股票市场动态、社交媒体更新和在线游戏。轮询更常用于数据更新不太频繁或不太重要的应用程序,例如电子邮件客户端或新闻网站。
虽然这两种技术都有各自的优点和缺点,但对于实时数据更新来说,流式传输通常是一种更有效、更可取的方法,而轮询对于数据更新不太频繁的某些应用程序来说仍然很有用。
对于区块链上的大多数类型的工作流(尤其是 Solana),您都需要坚持使用 Streaming。这样做有几个原因,但 Streaming 的实现要简单得多,并且对于高流量用例(Solana 擅长的)来说也更容易处理。
如何在 Solana 上监听链上事件
Solana 是一个非常快的区块链。它每 400 毫秒发出一个新区块,这些区块通常包含数千个交易。疯狂的是,这是它有史以来最慢的速度。随着核心工程师继续开发系统,该链处理新数据的速度只会增加。因此,在设计系统时考虑可扩展性至关重要。
幸运的是,你有几种方法可以在 Solana 上监听链上数据:
轮询
Websockets
喷泉
Helius Webhook
轮询
这是在 Solana 上监听事件的最不优先的方式,尽管从概念上来说它可能是最简单的。
根据您要获取的数据,您只需设置一个循环,该循环重复调用 Solana RPC(如 Helius)上的 JSON-RPC 方法。这里的常见用例是轮询getBlock方法来监听新块或轮询“getSignaturesForAddress”以检查给定地址的新交易。
有趣的是,对于非常高级的用例,这也可能是最佳方法,在这些用例中,您有非常自定义的逻辑来触发新的更新。
Websockets
Solana RPC 还向开发人员公开了 PubSub websocket。可用的事件类型包括:
帐户取消订阅
账户订阅
日志订阅
日志取消订阅
程序订阅
取消订阅
签名订阅
签名取消订阅
slot订阅
slot取消订阅
下面是一个使用 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 的一个非常重要的警告是,虽然它们对于原型设计非常有用,但我们发现它们在实践中非常脆弱和不可靠。强烈建议您不要将它们用于关键任务工作流程,因为您会错过事件。
喷泉
TL;DR — 您可以让 Solana 上的节点通过插件界面直接向您传输数据,该界面可自定义您接收数据的方式。这是在 Solana 上传输数据的最快和最低延迟方式,对于 DeFi 清算和延迟敏感型应用程序等而言是绝对必要的。
Solana 验证器和 RPC 具有独特的、Solana 原生的流数据方式:Geyser 插件。
验证器已得到增强,可支持名为“Geyser”插件的插件机制,通过该插件,有关账户、插槽、区块和交易的信息可以传输到外部数据存储,例如关系数据库、NoSQL 数据库或 Kafka。然后可以开发 RPC 服务来使用来自这些外部数据存储的数据,并可以进行更灵活、更有针对性的优化,例如缓存和索引。
不幸的是,设置 Geyser 可能相当复杂且昂贵。即使在设置完成后,您仍需要大量的 DevOps 工作来确保它顺利运行。幸运的是,我们在 Helius 开发了一种名为 GeyserVM 的东西 - 它可以让您上传插件并在几秒钟内运行它们。我们高度可用且冗余的集群确保您不必担心任何数据问题,而且由于资源是共享的,您可以节省超过 200% 的每月费用!
如果您想要专用的 Geyser-as-a-Service,我们当然也提供。单击此处了解更多信息。
Webhook
Webhook 是一个简单的概念。简而言之,webhook 会监听事件,并在事件发生时将其发送到您设置的服务器。例如,您可能希望在发生 NFT 销售时向您的 Discord 服务器发送通知 — webhook 可以无缝实现这一点。
对于 Solana 上的大多数事件监听工作流,webhook 将是最简单、最灵活且最具成本效益的方法。只有在极低延迟的用例中,5 毫秒的差异可能会成就或毁掉您的应用程序,例如高频交易,webhook 才应该让您停下来。
在 Helius,我们构建了加密领域最强大的 webhook 产品。
您最多可以监听 100,000 个地址(每个 webhook!),配置您想要监听的事件类型(我们会为您解析这些!),然后简单地输入您服务器的 URL — 这就是您开始所需的全部内容,而且是免费的。
此类服务的众多好处之一是,您不仅可以节省数周或数月的开发时间和精力,还可以获得可随着您的成长而扩展的弹性后端。
要了解有关 webhook 的更多信息,请单击此处。
使用案例
好的,现在您知道了如何在 Solana 上监听链上事件,接下来应该做什么?以下是一些可能有趣的用例:
机器人
当 NFT 在市场 X 上架时,触发“nft 购买”操作。
当保证金仓位不健康时,触发“清算”行动。
监控和警报
当程序发出某个日志时,触发 PagerDuty 集成。
当代币账户余额变化超过X%时,使用方言传达警告操作。
事件驱动索引
当给定程序发生任何事务时,将其直接发送到您的数据库或后端。
通知和活动追踪
当从钱包 X 到钱包 Y 发生转账时 — — 发送 Slack 通知或电子邮件。
分析与日志
当事件 X 发生时,将其发送到 ETL 管道或直接将其保存在 Helius 上以查看随时间变化的趋势。
工作流自动化
当事件X发生时,触发任意一组动作。
结论
在这篇文章中,我们介绍了轮询和流式传输之间的区别、监听 Solana 区块链的不同方式以及一些示例用例。
总之,您可以通过轮询、websockets、Geyser 或 Helius webhook 监听 Solana 上的链上事件。每种方法都有其优缺点,在决定实施哪种方法之前,考虑系统的要求很重要。感谢您的阅读!