跳转到主要内容

概述

LaserStream 是一个托管的 Solana gRPC 流式服务。它与开放的 Yellowstone gRPC 协议线兼容,因此任何 Yellowstone 客户端都可以直接使用,并增加了生产功能,如历史重放、多节点故障转移和完全托管的环境。 LaserStream使用开源的gRPC协议,确保没有供应商锁定,并与现有的gRPC实现最大限度兼容。 您可以使用标准 @triton-one/yellowstone-grpc 客户端连接,或使用性能优化的 Helius LaserStream SDK 以获得更高的吞吐量、自动重连、订阅管理、错误处理等额外优势。

LaserStream SDK比JavaScript Yellowstone客户端快40倍

了解我们如何使用Rust Core与零拷贝NAPI绑定来最大化JavaScript SDK的性能
性能注意:如果您在 LaserStream 连接中遇到任何延迟或性能问题,请参阅故障排除部分以获取常见原因和解决方案。

终端与区域

LaserStream 在全球多个区域提供服务。 选择最靠近您的应用程序的终端以获得最佳性能:

主网终端

测试网终端

网络与区域选择:
  • 对于 生产应用,选择离您的服务器最近的主网终端以获得最佳性能(例如,如果在欧洲部署,使用阿姆斯特丹 (ams) 或法兰克福 (fra))
  • 对于 测试,使用: https://laserstream-devnet-ewr.helius-rpc.com。

zstd 压缩

所有 LaserStream gRPC 终端支持 zstd 压缩。压缩是可选择的:响应保持未压缩,除非您的客户端声明支持 zstd。 在 Helius LaserStream TypeScript SDK 中启用 zstd:
zstd 减少网络带宽,但会增加压缩工作。在启用它用于对延迟敏感的流之前,请通过您的订阅工作负载基准测试。

日志截断

默认情况下,LaserStream 会将事务日志消息截断为 10 KB 以提高速度和性能。如果您需要完整日志,可以使用专用的未截断终端——参见 日志截断。

快速入门

从您的 Helius 仪表板 开始使用 LaserStream。主网需要商业或专业计划;测试网在开发者计划及以上可用。详情请参阅 计划与定价。
1

创建新项目

2

安装依赖

我们使用 tsx,因为 TypeScript 5.x 的默认设置会设定 verbatimModuleSyntax、module: "nodenext" 和 types: [],这些都会破坏快速 ts-node index.ts 运行。tsx 在没有 tsconfig 的情况下运行 .ts 文件。
3

获取您的 API 密钥

从 Helius 仪表板 生成一个密钥。此密钥将作为您 LaserStream 的身份验证令牌。
计划要求:LaserStream 测试网适用于所有 计划。LaserStream 主网需要商业或专业计划。
4

创建订阅脚本

创建 index.ts,内容如下:
5

替换您的 API 密钥并选择您的区域

在 index.ts 中更新 config 对象:
  1. 您从 Helius 仪表板 获取的真实 API 密钥
  2. 离您的服务器位置最近的 LaserStream 终端
网络与区域选择示例:
  • 生产(主网):
    • 欧洲:使用 fra(法兰克福)、ams(阿姆斯特丹)或 lon(伦敦)
    • 美国东部:使用 ewr(纽约)
    • 美国西部:使用 slc(盐湖城)或 lax(洛杉矶)
    • 亚洲:使用 tyo(东京)或 sgp(新加坡)
  • 开发(测试网):
    • 使用 https://laserstream-devnet-ewr.helius-rpc.com
6

运行并查看结果

每当一个 confirmed 令牌交易涉及 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA 时,您将在控制台中看到数据。

常见工作流程

我们最常见工作流程的分步指南。每个指南使用内置自动重新连接和历史回放功能的 helius-laserstream SDK。

账户订阅

监控特定账户的余额、数据和所有权变更,并进行过滤。

交易监控

流式传输涉及目标账户的交易,按程序、投票或失败状态进行过滤。

槽位与区块监控

跟踪网络共识、区块生产及承诺级别的变化。

解码交易数据

将二进制 transactionUpdate 负载解析为可读的 Solana 交易。

流泵 AMM 数据

真实示例:使用安全重新连接的过滤器监控泵 AMM 交易。
如果您更喜欢原始 Yellowstone 协议,@triton-one/yellowstone-grpc 客户端与相同终端配合使用。查看 Yellowstone gRPC 参考 了解协议级细节。

订阅请求

在订阅请求中,您需要包括以下通用参数:
**历史重放:**你可以选择在主 SubscribeRequest 对象中添加 fromSlot 字段(u64 数字),以重放从特定时隙开始的数据。目前只能重放过去约 48 小时的数据(按当前网络速度计算,约为 864,000 个时隙);请注意,重放约 20 分钟之前的数据时,只会返回已最终确认的数据。
enum
指定确认级别,可以是 processed、confirmed 或 finalized。
array
一个由对象 { offset: uint64, length: uint64 } 组成的数组,使你能够仅接收账户中所需的数据切片。
boolean
某些云服务提供商(如 Cloudflare)可能会在一段时间无活动后关闭空闲流。为防止这种情况并保持连接活跃,而无需重新发送过滤器,请将此项设置为 true。服务器将每 15 秒回复一条 Pong 消息。
接下来,您需要指定要订阅的数据过滤器,例如账户、区块、槽位或交易。
为槽位更新定义过滤器。您使用的键(例如,mySlotLabel)是此特定过滤器配置的用户定义标签,允许您根据需要定义多个命名配置(尽管通常一个就足够)。
boolean
默认情况下,会发送所有确认级别的插槽。使用此过滤器,你可以选择仅接收指定确认级别的插槽。
boolean
允许订阅接收插槽内发生变化时的更新,而不仅是在新插槽开始时接收更新。这适用于获取粒度更细、延迟更低的插槽数据。
为账户数据更新定义过滤器。您使用的键(例如,tokenAccounts)是此特定过滤器配置的用户定义标签。
array
匹配提供数组中的任何公钥。
array
账户所有者的公钥。匹配提供数组中的任何公钥。
array
类似于 getProgramAccounts 中的过滤器。这是一个包含 datasize 和/或 memcmp 过滤器的数组。对于 memcmp,比较值在 bytes、base58 或 base64 直接在 memcmp 对象上。
enum
已弃用
已弃用 — 从 Agave 4.2 起无操作。 设置 notifyOn 没有效果。该字段将在后续版本中移除。
如果所有字段为空,则会广播所有账户。否则:
  • 字段以逻辑 AND 运算。
  • 数组内的值作为逻辑 OR(filters 中除外,作为逻辑 AND)。
跟踪超过约 10,000 个账户?使用压缩的 cuckoo filter(每个账户约 3–4 字节)代替显式 pubkey 列表(每个账户 32 字节),可以在单一流中订阅数十万个账户。可在 Rust 和 JavaScript SDK 中使用。
为交易更新定义过滤器。您使用的键(例如,myTxSubscription)是此特定过滤器配置的用户定义标签。
boolean
启用或禁用投票交易广播。
boolean
启用或禁用失败交易广播。
string
仅广播与指定签名匹配的交易。
array
过滤涉及所提供列表中任意账户的交易。
array
排除涉及所提供列表中任意账户的交易(与 accountInclude 相反)。
array
过滤涉及所提供列表中所有账户的交易(必须使用全部账户)。
string
可选的 tokenAccounts(关联代币账户)扩展。设置后,如果 accountInclude 钱包拥有某个 SPL 代币余额,则涉及该余额的交易也会匹配,例如传入的代币转账仅涉及钱包的代币账户而非其公钥。接受 "balanceChanged"(匹配余额增量)、"all"(匹配任何引用,数据量更大)或 "none"(不扩展,默认值)。SDK 会将该字符串转换为传输层的 TokenAccountExpansionControlFlag 枚举(属于 yellowstone-grpc-proto 12.5.0+)。有关其用途和工作原理,请参阅代币账户(ATA)过滤。
boolean
可选的 matchMints 标志(默认为 false)。当设为 true 时,除了与交易的账户密钥匹配外,还会将 accountInclude、accountExclude 和 accountRequired 列表与交易前后代币余额中的铸币地址进行匹配。将铸币地址放入 accountInclude,即可接收涉及该代币的每笔交易,包括账户密钥中从未引用该铸币地址的普通 SPL 转账。这是选择启用的功能,不会影响现有过滤器。需要 helius-laserstream 0.8.5+(JS)、0.6.4+(Rust)或 go/v0.3.0+(Go)。有关语义和示例,请参阅代币铸币地址过滤。
如果所有字段均留空,则会广播所有交易。否则:
  • 字段以逻辑 AND 运算。
  • 数组内的值被视为逻辑 OR(accountRequired 除外,必须全部匹配)。
为区块更新定义过滤器。您使用的键(例如,myBlockLabel)是此特定过滤器配置的用户定义标签。
array
过滤涉及所提供列表中任意账户的交易和账户。
boolean
在广播中包含所有交易。
boolean
在广播中包含所有账户更新。
boolean
在广播中包含所有条目。
功能类似于区块,但不包含事务、账户和条目。您使用的键(例如,blockmetadata)是此订阅的用户定义标签。目前,区块元数据没有可用的过滤器——所有消息默认都会广播。
订阅分类账条目。您使用的键(例如,entrySubscribe)是此订阅的用户定义标签。目前,没有可用于条目的过滤器;所有条目都会被广播。

代码示例(LaserStream SDK)

SDK 选项

我们为多种编程语言提供官方 SDK: 对于其他语言或自定义实现,你可以直接使用 Yellowstone gRPC proto 文件,为你偏好的语言生成 gRPC 客户端。

故障排除 / 常见问题

**答:**LaserStream 连接的性能问题通常由以下原因引起:
  • JavaScript 客户端速度较慢:处理过多消息或占用过多带宽时,JavaScript 客户端可能出现延迟。请考虑进一步缩小订阅过滤范围以减少消息量,改用 LaserStream JavaScript SDK,或尝试使用其他语言。
  • 本地带宽有限:大量订阅可能使网络带宽有限的客户端不堪重负。请监控网络使用情况,并考虑升级网络连接或缩小订阅范围。
  • 地理距离:较长的网络路由会增加延迟和丢包率。请使用最靠近你服务器的端点。对于高延迟连接,请增大网络读取缓冲区(可将带宽提升 5 倍以上):
    要让设置在重启后仍然生效,请将其添加到 /etc/sysctl.conf:
    将 HTTP/2 流和连接的窗口大小增至 64MB,以防止流量控制成为瓶颈。两者都必须调整——如果只增大流窗口,连接级窗口仍会成为主要限制:
  • 客户端处理瓶颈:确保你的消息处理逻辑已优化,并且不会长时间阻塞主线程。
调试客户端延迟:为了帮助你调试客户端,我们构建了一个工具,用于测试从你的节点到 Laserstream gRPC 服务器的最大带宽。运行以下命令即可使用:
输出结果会返回你的服务器与 Laserstream 服务器之间的最大网络容量。订阅所有交易数据至少需要 10MB/s,订阅所有账户数据至少需要 80MB/s。为获得最佳性能,我们建议至少预留所需容量的 2 倍。
**答:**请确认你的 API 密钥和端点正确无误,并且你的网络允许向指定端点建立出站 gRPC 连接。查看 Helius 状态页面,了解当前是否存在故障。
**答:**再次检查过滤器章节中介绍的逻辑运算符(AND/OR)。确保公钥正确。检查请求中指定的承诺级别。
**答:**可以,你可以在同一个 SubscribeRequest 对象中的多个键(例如 accounts、transactions)下定义过滤器配置。
**答:**我们没有实现消费者组。LaserStream 无需协调层(以及随之而来的延迟和开销),即可提供团队期望的相同效果:恢复、重放和多节点可靠性。我们认为大多数工作负载并不需要消费者组,而且消费者组会增加延迟和运维开销。例如,单个 LaserStream gRPC 连接最多可输出相当于 Solana 交易与账户数据总量 10 倍的数据,而大多数客户端只订阅经过过滤的一小部分数据。在这种情况下使用消费者组会消耗性能余量,并引入另一个故障点。
**答:**为了提高速度和性能,LaserStream 默认会将交易日志消息截断至 10 KB。如果你需要完整日志,请连接到专用的未截断端点——有关端点列表,请参阅日志截断。
**答:**如果在初始 SubscribeRequest 中包含 ping 字段,LaserStream 会静默忽略所有订阅过滤器——只返回 Pong,不包含任何账户、交易或槽位数据。要解决此问题,请从初始订阅请求中移除 ping,并在订阅建立后通过流的接收器单独发送 ping。这样既能保持连接活跃,又不会干扰过滤器。