概述
LaserStream 是一个托管的 Solana gRPC 流式服务。它与开放的 Yellowstone gRPC 协议线兼容,因此任何 Yellowstone 客户端都可以直接使用,并增加了生产功能,如历史重放、多节点故障转移和完全托管的环境。 LaserStream使用开源的gRPC协议,确保没有供应商锁定,并与现有的gRPC实现最大限度兼容。 您可以使用标准@triton-one/yellowstone-grpc 客户端连接,或使用性能优化的 Helius LaserStream SDK 以获得更高的吞吐量、自动重连、订阅管理、错误处理等额外优势。
LaserStream SDK比JavaScript Yellowstone客户端快40倍
终端与区域
LaserStream 在全球多个区域提供服务。 选择最靠近您的应用程序的终端以获得最佳性能:主网终端
测试网终端
- 对于 生产应用,选择离您的服务器最近的主网终端以获得最佳性能(例如,如果在欧洲部署,使用阿姆斯特丹 (
ams) 或法兰克福 (fra)) - 对于 测试,使用:
https://laserstream-devnet-ewr.helius-rpc.com。
zstd 压缩
所有 LaserStream gRPC 终端支持 zstd 压缩。压缩是可选择的:响应保持未压缩,除非您的客户端声明支持 zstd。
在 Helius LaserStream TypeScript SDK 中启用 zstd:
zstd 减少网络带宽,但会增加压缩工作。在启用它用于对延迟敏感的流之前,请通过您的订阅工作负载基准测试。
日志截断
默认情况下,LaserStream 会将事务日志消息截断为 10 KB 以提高速度和性能。如果您需要完整日志,可以使用专用的未截断终端——参见 日志截断。快速入门
创建新项目
安装依赖
tsx,因为 TypeScript 5.x 的默认设置会设定 verbatimModuleSyntax、module: "nodenext" 和 types: [],这些都会破坏快速 ts-node index.ts 运行。tsx 在没有 tsconfig 的情况下运行 .ts 文件。获取您的 API 密钥
创建订阅脚本
index.ts,内容如下:替换您的 API 密钥并选择您的区域
index.ts 中更新 config 对象:- 您从 Helius 仪表板 获取的真实 API 密钥
- 离您的服务器位置最近的 LaserStream 终端
- 生产(主网):
- 欧洲:使用
fra(法兰克福)、ams(阿姆斯特丹)或lon(伦敦) - 美国东部:使用
ewr(纽约) - 美国西部:使用
slc(盐湖城)或lax(洛杉矶) - 亚洲:使用
tyo(东京)或sgp(新加坡)
- 欧洲:使用
- 开发(测试网):
- 使用
https://laserstream-devnet-ewr.helius-rpc.com
- 使用
运行并查看结果
confirmed 令牌交易涉及 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA 时,您将在控制台中看到数据。常见工作流程
我们最常见工作流程的分步指南。每个指南使用内置自动重新连接和历史回放功能的helius-laserstream SDK。
账户订阅
交易监控
槽位与区块监控
解码交易数据
transactionUpdate 负载解析为可读的 Solana 交易。流泵 AMM 数据
订阅请求
在订阅请求中,您需要包括以下通用参数:SubscribeRequest 对象中添加 fromSlot 字段(u64 数字),以重放从特定时隙开始的数据。目前只能重放过去约 48 小时的数据(按当前网络速度计算,约为 864,000 个时隙);请注意,重放约 20 分钟之前的数据时,只会返回已最终确认的数据。{ offset: uint64, length: uint64 } 组成的数组,使你能够仅接收账户中所需的数据切片。槽位
槽位
账户
账户
tokenAccounts)是此特定过滤器配置的用户定义标签。datasize 和/或 memcmp 过滤器的数组。对于 memcmp,比较值在 bytes、base58 或 base64 直接在 memcmp 对象上。notifyOn 没有效果。该字段将在后续版本中移除。- 字段以逻辑 AND 运算。
- 数组内的值作为逻辑 OR(
filters中除外,作为逻辑 AND)。
交易
交易
myTxSubscription)是此特定过滤器配置的用户定义标签。accountInclude 相反)。tokenAccounts(关联代币账户)扩展。设置后,如果 accountInclude 钱包拥有某个 SPL 代币余额,则涉及该余额的交易也会匹配,例如传入的代币转账仅涉及钱包的代币账户而非其公钥。接受 "balanceChanged"(匹配余额增量)、"all"(匹配任何引用,数据量更大)或 "none"(不扩展,默认值)。SDK 会将该字符串转换为传输层的 TokenAccountExpansionControlFlag 枚举(属于 yellowstone-grpc-proto 12.5.0+)。有关其用途和工作原理,请参阅代币账户(ATA)过滤。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除外,必须全部匹配)。
区块
区块
区块元数据
区块元数据
blockmetadata)是此订阅的用户定义标签。目前,区块元数据没有可用的过滤器——所有消息默认都会广播。条目
条目
entrySubscribe)是此订阅的用户定义标签。目前,没有可用于条目的过滤器;所有条目都会被广播。代码示例(LaserStream SDK)
- 槽位更新
- 账户更新
- 交易更新
- 区块
- 区块元数据
- 条目
- Unary Methods
SDK 选项
我们为多种编程语言提供官方 SDK:- TypeScript:LaserStream TypeScript SDK
- Rust:LaserStream Rust SDK
- Go:LaserStream Go SDK
故障排除 / 常见问题
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
- JavaScript 客户端速度较慢:处理过多消息或占用过多带宽时,JavaScript 客户端可能出现延迟。请考虑进一步缩小订阅过滤范围以减少消息量,改用 LaserStream JavaScript SDK,或尝试使用其他语言。
- 本地带宽有限:大量订阅可能使网络带宽有限的客户端不堪重负。请监控网络使用情况,并考虑升级网络连接或缩小订阅范围。
-
地理距离:较长的网络路由会增加延迟和丢包率。请使用最靠近你服务器的端点。对于高延迟连接,请增大网络读取缓冲区(可将带宽提升 5 倍以上):
要让设置在重启后仍然生效,请将其添加到
/etc/sysctl.conf:将 HTTP/2 流和连接的窗口大小增至 64MB,以防止流量控制成为瓶颈。两者都必须调整——如果只增大流窗口,连接级窗口仍会成为主要限制: - 客户端处理瓶颈:确保你的消息处理逻辑已优化,并且不会长时间阻塞主线程。
Q: I'm getting connection errors. What should I check?
Q: I'm getting connection errors. What should I check?
Q: Why aren't my filters working as expected?
Q: Why aren't my filters working as expected?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
SubscribeRequest 对象中的多个键(例如 accounts、transactions)下定义过滤器配置。Q: Does LaserStream support consumer groups?
Q: Does LaserStream support consumer groups?
Q: Why are my transaction log messages cut off?
Q: Why are my transaction log messages cut off?
Q: Why am I only receiving Pong responses with no account or slot data?
Q: Why am I only receiving Pong responses with no account or slot data?
SubscribeRequest 中包含 ping 字段,LaserStream 会静默忽略所有订阅过滤器——只返回 Pong,不包含任何账户、交易或槽位数据。要解决此问题,请从初始订阅请求中移除 ping,并在订阅建立后通过流的接收器单独发送 ping。这样既能保持连接活跃,又不会干扰过滤器。