概述
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 不会压缩 gRPC 响应消息。将
Accept-Encoding 设置为 gzip 或 zstd 将无效——响应始终以未压缩形式返回。终端节点和地区
LaserStream 在全球多个地区提供。 选择离您的应用程序最近的终端节点以获得最佳性能:主网端点
开发网端点
网络和地区选择:
- 对于 生产应用,选择最靠近服务器的 mainnet 终端节点以获得最佳性能(例如,如果在欧洲部署,请使用阿姆斯特丹 (
ams) 或法兰克福 (fra)) - 对于 测试,使用:
https://laserstream-devnet-ewr.helius-rpc.com。
日志截断
默认情况下,LaserStream 会截断事务日志消息至 10 KB,以提高速度和性能。如果需要完整日志,可以使用专用的不截断端点 — 见 日志截断。快速开始
1
创建新项目
2
安装依赖
tsx,因为 TypeScript 5.x 上的默认 npx tsc --init 设置了 verbatimModuleSyntax、module: "nodenext" 和 types: [],这些都会中断快速 ts-node index.ts 运行。tsx 可以在没有 tsconfig 的情况下运行 .ts 文件。3
获取您的 API 密钥
从 Helius Dashboard 生成一个密钥。该密钥将作为您 LaserStream 的身份验证令牌。
计划要求:LaserStream devnet 在所有 计划 上可用。LaserStream 主网需要商务或专业计划。
4
创建订阅脚本
使用以下内容创建
index.ts:5
替换您的 API 密钥并选择您的区域
在 网络和区域选择示例:
index.ts 中,更新 config 对象:- 您从 Helius Dashboard 获取的实际 API 密钥
- 离您服务器位置最近的 LaserStream 端点
- 用于生产(主网):
- 欧洲:使用
fra(法兰克福)、ams(阿姆斯特丹)或lon(伦敦) - 美国东部:使用
ewr(纽约) - 美国西部:使用
slc(盐湖城)或lax(洛杉矶) - 亚洲:使用
tyo(东京)或sgp(新加坡)
- 欧洲:使用
- 用于开发(Devnet):
- 使用
https://laserstream-devnet-ewr.helius-rpc.com
- 使用
6
运行并查看结果
confirmed 代币交易涉及 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA 时,您会在控制台中看到数据。常见工作流程
我们最常见的工作流程的分步指南。每个指南都使用内置自动重连和历史重放功能的helius-laserstream SDK。
账户订阅
使用过滤器监控特定账户上的余额、数据和所有权变化。
交易监控
流式传输涉及目标账户的交易,根据程序、投票或失败状态进行过滤。
槽和区块监控
跟踪网络共识、区块生成和承诺级别的过渡。
解码交易数据
将二进制
transactionUpdate 负载解析为可读的 Solana 交易。流泵 AMM 数据
实际案例:使用重连安全过滤器监控泵 AMM 交易。
订阅请求
在订阅请求中,您需要包含以下一般参数:历史重放: 您可以选择性地在主
SubscribeRequest 对象中包含一个 fromSlot 字段(u64 数字)以从特定槽位开始重放数据。目前重放限制为最近的 216,000 个槽位(≈24 小时);注意,超过约 20 分钟的重放返回仅最终数据。Slots
Slots
定义槽位更新的过滤器。您使用的键(例如,
mySlotLabel)是此特定过滤器配置的用户定义标签,这允许您在需要时可能定义多个命名配置(尽管通常一个就足够了)。Accounts
Accounts
定义账户数据更新的过滤器。您使用的键(例如,如果所有字段为空,则广播所有账户。否则:跟踪超过约10,000个账户?与其使用显式的公钥列表(每个账户32字节),不如使用压缩的cuckoo filter(每个账户约3-4字节)来在一个单一流中订阅成千上万个账户。在Rust和JavaScript SDK中可用。
tokenAccounts)是此特定过滤器配置的用户定义标签。array
匹配提供的数组中的任何公钥。
array
账户所有者的公钥。匹配提供的数组中的任何公钥。
array
类似于getProgramAccounts中的过滤器。这是一个包含
datasize和/或memcmp过滤器的数组。对于memcmp,比较值直接放在bytes、base58或base64对象上。enum
控制您接收哪些更新。默认情况下(
lock),对于每个事务写锁定的账户都会发送更新——即使事务从未写入账户。将其设置为write以跳过这些无操作更新,并仅在事务实际写入账户时接收通知。请注意,写入相同数据仍然计为写入并会传递。跳过的更新与之前的状态完全重复,因此如果您依赖更新作为账户被事务锁定的信号(例如,活动跟踪),请不要设置此项。这是通过Helius LaserStream SDK提供的Helius扩展——原始Yellowstone客户端不公开此字段。详情请见notifyOn过滤。- 字段操作为逻辑 AND。
- 数组内的值作为逻辑 OR(
filters中除外,那里操作为逻辑 AND)。
Transaction
Transaction
定义交易更新的过滤器。你使用的键(例如,
myTxSubscription)是此特定过滤器配置的用户定义标签。如果所有字段都留空,则广播所有交易。否则:- 字段操作为逻辑 AND。
- 数组中的值被视为逻辑 OR(
accountRequired除外,所有值必须匹配)。
Block
Block
定义块更新的过滤器。您使用的键(例如
myBlockLabel)是此特定过滤器配置的用户定义标签。Blocks Meta
Blocks Meta
其功能类似于 Blocks,但不包括交易、账户和条目。您使用的键(例如
blockmetadata)是此订阅的用户定义标签。目前,块元数据没有可用的过滤器——所有消息默认广播。Entries
Entries
订阅分类账条目。您使用的键(例如
entrySubscribe)是此订阅的用户定义标签。目前,没有可用的条目过滤器;所有条目都被广播。代码示例 (LaserStream SDK)
- Slot Updates
- Account Updates
- Transaction Updates
- Blocks
- Block Metadata
- 条目
SDK 选项
我们为多种编程语言提供官方 SDK:- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
故障排除 / 常见问题
问:我的 LaserStream 连接出现延迟或性能缓慢。这可能是什么原因导致的?
问:我的 LaserStream 连接出现延迟或性能缓慢。这可能是什么原因导致的?
答: LaserStream 连接性能问题通常由以下几种原因引起:输出将返回您的服务器与Laserstream服务器之间的最大网络容量。最低限度,您需要10MB/s来订阅所有交易数据,80MB/s来订阅所有帐户数据。我们建议至少有2倍所需容量以获得最佳性能。
- JavaScript 客户端缓慢:JavaScript 客户端在处理过多消息或占用过多带宽时可能会滞后。考虑更精确地过滤您的订阅以减少消息量,切换到 LaserStream JavaScript SDK,或尝试使用其他语言。
- 本地带宽限制:大量订阅会使带宽限制的客户端不堪重负。监控网络使用情况,考虑升级连接或减少订阅范围。
-
地理距离:较长的网络路径会增加延迟和数据包丢失。使用 离您服务器最近的端点。对于高延迟连接,增大网络读取缓冲区大小(可提高带宽5倍以上):
要在重启后保持此设置,请添加到
/etc/sysctl.conf:将 HTTP/2 流和连接窗口大小增加到 64MB,以防止流控瓶颈。两者均需增加,仅增加流窗口会让连接级窗口成为限制因素: - 客户端处理瓶颈:确保消息处理逻辑经过优化,不会长时间阻塞主线程。
Q: 我收到连接错误。我应该检查什么?
Q: 我收到连接错误。我应该检查什么?
A: 确保您的API密钥和端点是正确的,并且您的网络允许到指定端点的出站gRPC连接。查看Helius状态页面以了解任何正在进行的事件。
Q: 为什么我的过滤器无法按预期工作?
Q: 为什么我的过滤器无法按预期工作?
A: 仔细检查过滤器部分中描述的逻辑运算符(AND/OR)。确保公钥正确。查看请求中指定的提交级别。
Q: 我可以在一个请求中订阅多种类型的数据(例如,帐户和交易)吗?
Q: 我可以在一个请求中订阅多种类型的数据(例如,帐户和交易)吗?
A: 可以,您可以在同一个
SubscribeRequest对象下定义多个键的过滤器配置(例如,accounts, transactions)。Q: LaserStream支持消费者组吗?
Q: LaserStream支持消费者组吗?
A: 我们不实现消费者组。相反,LaserStream提供了团队所需的相同结果:恢复、重播和无协调层的多节点可靠性(以及随之而来的延迟/开销)。我们认为大多数工作负载不需要消费者组,它们增加了延迟和操作开销。例如,单个LaserStream gRPC连接可以发送高达10倍Solana的交易+帐户数据,而大多数客户端订阅的是一个小的、过滤后的片段。使用消费者组在这种情况下会消耗性能余量,并引入另一个故障点。
问:为什么我的事务日志消息被截断?
问:为什么我的事务日志消息被截断?
答: LaserStream 默认将事务日志消息截断至 10 KB,以提高速度和性能。如果您需要完整的日志,请连接到专用的未截断端点 — 请参阅 Log Truncation 以获取列表。
问:为什么我只收到 Pong 响应,而没有账户或插槽数据?
问:为什么我只收到 Pong 响应,而没有账户或插槽数据?
答: 在您的初始
ping 请求中包含一个字段会导致 LaserStream 静默忽略所有订阅过滤器 — 只返回一个 Pong,且没有账户、事务或插槽数据。要解决此问题,请从初始订阅请求中移除 ping,而是在建立订阅后,通过流的接收端单独发送 ping。这会在不中断您的过滤器的情况下保持连接。