概述
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 在全球多个区域提供服务。 选择最靠近您的应用程序的终端以获得最佳性能:主网终端
测试网终端
网络与区域选择:
- 对于 生产应用,选择离您的服务器最近的主网终端以获得最佳性能(例如,如果在欧洲部署,使用阿姆斯特丹 (
ams) 或法兰克福 (fra)) - 对于 测试,使用:
https://laserstream-devnet-ewr.helius-rpc.com。
zstd 压缩
所有 LaserStream gRPC 终端支持 zstd 压缩。压缩是可选择的:响应保持未压缩,除非您的客户端声明支持 zstd。
在 Helius LaserStream TypeScript SDK 中启用 zstd:
zstd 减少网络带宽,但会增加压缩工作。在启用它用于对延迟敏感的流之前,请通过您的订阅工作负载基准测试。
日志截断
默认情况下,LaserStream 会将事务日志消息截断为 10 KB 以提高速度和性能。如果您需要完整日志,可以使用专用的未截断终端——参见 日志截断。快速入门
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 对象:- 您从 Helius 仪表板 获取的真实 API 密钥
- 离您的服务器位置最近的 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 交易。
订阅请求
在订阅请求中,您需要包括以下通用参数:历史回放: 您可以可选地在主
SubscribeRequest 对象中包含一个 fromSlot 字段(一个 u64 数字)以从特定槽位开始回放数据。目前回放仅限于最近 216,000 个槽位(约 24 小时);请注意,超过约 20 分钟的回放仅返回已完成的数据。enum
指定确认级别,可以是 processed、confirmed 或 finalized。
array
一个由对象
{ offset: uint64, length: uint64 } 组成的数组,使你能够仅接收账户中所需的数据切片。boolean
某些云服务提供商(如 Cloudflare)可能会在一段时间无活动后关闭空闲流。为防止这种情况并保持连接活跃,而无需重新发送过滤器,请将此项设置为 true。服务器将每 15 秒回复一条 Pong 消息。
槽位
槽位
账户
账户
为账户数据更新定义过滤器。您使用的键(例如,如果所有字段为空,则会广播所有账户。否则:跟踪超过约 10,000 个账户?使用压缩的 cuckoo filter(每个账户约 3–4 字节)代替显式 pubkey 列表(每个账户 32 字节),可以在单一流中订阅数十万个账户。可在 Rust 和 JavaScript SDK 中使用。
tokenAccounts)是此特定过滤器配置的用户定义标签。array
匹配提供数组中的任何公钥。
array
账户所有者的公钥。匹配提供数组中的任何公钥。
array
类似于 getProgramAccounts 中的过滤器。这是一个包含
datasize 和/或 memcmp 过滤器的数组。对于 memcmp,比较值在 bytes、base58 或 base64 直接在 memcmp 对象上。enum
已弃用
已弃用 — 从 Agave 4.2 起无操作。 设置
notifyOn 没有效果。该字段将在后续版本中移除。- 字段以逻辑 AND 运算。
- 数组内的值作为逻辑 OR(
filters中除外,作为逻辑 AND)。
交易
交易
为交易更新定义过滤器。您使用的键(例如,如果所有字段均留空,则会广播所有交易。否则:
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除外,必须全部匹配)。
区块
区块
区块元数据
区块元数据
功能类似于区块,但不包含事务、账户和条目。您使用的键(例如,
blockmetadata)是此订阅的用户定义标签。目前,区块元数据没有可用的过滤器——所有消息默认都会广播。条目
条目
订阅分类账条目。您使用的键(例如,
entrySubscribe)是此订阅的用户定义标签。目前,没有可用于条目的过滤器;所有条目都会被广播。代码示例(LaserStream SDK)
- 槽位更新
- 账户更新
- 交易更新
- 区块
- 区块元数据
- 条目
SDK 选项
我们为多种编程语言提供官方 SDK:- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
疑难解答/常见问题
Q: 我的 LaserStream 连接出现延迟或性能缓慢。可能是什么原因?
Q: 我的 LaserStream 连接出现延迟或性能缓慢。可能是什么原因?
A: 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 连接可以发射高达 Solana 交易数据 + 账户数据的 10 倍,大多数客户端订阅一个小型、过滤的片段。在这种情况下,使用消费者组会消耗性能余量并增加一个故障点。
Q: 为什么我的交易日志信息被截断了?
Q: 为什么我的交易日志信息被截断了?
A: LaserStream 默认将交易日志信息截断为 10 KB,以提高速度和性能。如果您需要完整日志,请连接到专用未截断终端——参见 日志截断 了解列表。
Q: 为什么我只收到 Pong 响应,而没有账户或槽位数据?
Q: 为什么我只收到 Pong 响应,而没有账户或槽位数据?
A: 在您的初始
SubscribeRequest 中包含 ping 字段会导致 LaserStream 静默忽略所有订阅过滤器——只有一个 Pong 返回,没有账户、交易或槽位数据。要解决此问题,请从初始订阅请求中删除 ping,然后在建立订阅后通过流的 sink 分别发送 ping。这可以保持连接活跃而不会干扰您的过滤器。