Skip to main content

概述

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 数字)以从特定槽位开始回放数据。目前回放仅限于最近 216,000 个槽位(约 24 小时);请注意,超过约 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 客户端。

疑难解答/常见问题

A: LaserStream 连接的性能问题通常由以下原因引起:
  • JavaScript 客户端缓慢:JavaScript 客户端在处理过多消息或消耗过多带宽时可能会滞后。考虑更严格地过滤您的订阅以减少消息量,切换到 LaserStream JavaScript SDK,或试用其他语言。
  • 本地带宽有限:沉重的订阅可能会让网络带宽有限的客户端不堪重负。监控您的网络使用情况,并考虑升级您的连接或减少订阅范围。
  • 地理距离:长网络路径增加了延迟和数据包丢失。使用最靠近您服务器的终端。对于高延迟连接,增加您的网络读取缓冲区大小(可以提高带宽 5 倍以上):
    要在重启后保持效果,请添加到 /etc/sysctl.conf:
    将 HTTP/2 流和连接窗口大小增加到 64MB,以避免流控瓶颈。两者都是必需的——仅增加流窗口会留下连接级窗口作为绑定约束:
  • 客户端处理瓶颈:确保您的消息处理逻辑经过优化,不会长时间阻塞主线程。
调试客户端延迟:为了帮助您调试客户端,我们建立了一个工具来测试从您的节点到一个 Laserstream gRPC 服务器的最大带宽。要使用它,请运行:
输出返回您的服务器和 Laserstream 服务器之间的最大网络容量。至少需要 10MB/s 来订阅所有交易数据和 80MB/s 来订阅所有账户数据。我们建议至少有所需容量的 2 倍以获得最佳性能。
A: 请验证您的 API 密钥和终端是否正确,并确认您的网络允许到指定终端的出站 gRPC 连接。检查 Helius 状态页面 以获取任何正在进行的事件。
A: 请仔细检查过滤器部分中描述的逻辑运算符(AND/OR)。确保公钥正确。查看您的请求中指定的承诺级别。
A: 是的,您可以在同一个 SubscribeRequest 对象下定义多个键(例如,accounts、transactions)的过滤配置。
A: 我们不实现消费者组。相反,LaserStream 提供团队想要的相同结果:无需协调层(以及随之而来的延迟/开销)的恢复、回放和多节点可靠性。我们认为消费者组对大多数工作负载是不必要的,并且会增加延迟和操作开销。例如,一个单独的 LaserStream gRPC 连接可以发射高达 Solana 交易数据 + 账户数据的 10 倍,大多数客户端订阅一个小型、过滤的片段。在这种情况下,使用消费者组会消耗性能余量并增加一个故障点。
A: LaserStream 默认将交易日志信息截断为 10 KB,以提高速度和性能。如果您需要完整日志,请连接到专用未截断终端——参见 日志截断 了解列表。
A: 在您的初始 SubscribeRequest 中包含 ping 字段会导致 LaserStream 静默忽略所有订阅过滤器——只有一个 Pong 返回,没有账户、交易或槽位数据。要解决此问题,请从初始订阅请求中删除 ping,然后在建立订阅后通过流的 sink 分别发送 ping。这可以保持连接活跃而不会干扰您的过滤器。