Skip to main content

可用端点

Jetstream 在所有 OrbitFlare 地区均可使用。连接到离您基础设施最近的地区以获得最低延迟。
Jetstream 的 gRPC 连接使用纯 http://(而非 https://)。gRPC 会在 HTTP/2 上协商自己的传输层安全。仅当您的专用节点明确要求时才使用 https://。

身份验证

在 x-token gRPC 元数据头中提供您的 API 密钥,或使用 IP 白名单身份验证。详情请参见身份验证。

Protocol Buffer 规范

本文档概述了 OrbitFlare Jetstream 所使用的 Protocol Buffer(protobuf)规范。完整的规范可在我们的 GitHub 仓库中找到——在那里下载 jetstream_v2.proto 以生成您的客户端,或使用下面转载的定义。protobuf 包名为 jetstream.v2。

服务定义

请求消息

SubscribeTransactions 是一个双向流。客户端发送一系列请求消息——每条恰好携带一个负载——以在数据流打开期间管理其订阅。

SubscribeTransactionsRequest

添加过滤器

过滤器在数据流打开期间动态添加。每个过滤器都携带一个由客户端选择的 filter_id,它会在每笔匹配的交易上以及在验证确认中回显。
过滤器必须指定 account_include / account_exclude / account_required 中的至少一个。空的(匹配一切的)过滤器会被拒绝——参见 FilterResult。

移除过滤器

响应消息

SubscribeTransactionsResponse

数据流上的每条消息都携带一个服务器时间戳和一个单调递增的 sequence 编号(每个流),以便客户端可以检测间隙。恰好设置一个负载。

过滤器验证

在每次 AddFilters / RemoveFilters 之后,服务器为每个过滤器返回一个 FilterResult,确认接受或说明拒绝的原因。

心跳

已过滤交易

每笔匹配的交易都会列出它所匹配的 filter_id 值,随后是交易本身。

共享类型

交易版本(SIMD-0385)

Solana 有三种交易格式:legacy、v0 和 v1(SIMD-0385)。config 字段(23)和 priority_fee_lamports 字段(24)是为交易 v1 添加的,且是增量的——从本定义的旧副本生成的客户端会将它们作为未知字段跳过,并正常解码其他所有字段。
“交易 v1” 不是 “Jetstream v1”。 交易 v1 是一种 Solana 交易格式(SIMD-0385),当前的 Jetstream 协议对其提供完整支持。“Jetstream v1” 指的是另一个独立的、现已弃用的 Jetstream 协议。当前的 Jetstream 就是承载交易 v1 的那个协议。
从两个字段来识别版本。先检查 config,因为 versioned 对 v0 和 v1 都为 true:
按费用排序: 使用 priority_fee_lamports(字段 24),而不是 compute_unit_price(字段 17)。字段 17 是从 SetComputeUnitPrice 指令中读取的每计算单元的微 lamports——v1 交易没有这样的指令,因此字段 17 对每笔 v1 交易都不存在,仅按它排序会把所有 v1 流量排在最后。字段 24 是总 lamports,且对全部三个版本都有填充(这两个字段 23 和 24 都仅在富化下针对派生值发出;config 本身对 v1 始终发送)。

槽位流式传输

SubscribeSlots 是一个槽位生命周期事件的服务器流。它不接受任何参数——打开数据流即可随着槽位推进接收事件。

非流式方法

使用该协议

一个典型的客户端:
  1. 从上面的 jetstream.v2 定义生成客户端代码。
  2. 打开 SubscribeTransactions 双向流并进行身份验证(x-token 头或 IP 白名单)。
  3. 发送一个包含一个或多个 TxFilter 条目的 AddFilters 请求,每个条目都有唯一的 filter_id。
  4. 读取 FilterResult 确认,然后读取 FilteredTransaction 消息流。
  5. 随时添加或移除过滤器,无需重新打开数据流。
  6. 跟踪 sequence 以检测间隙,并将连接关闭视为重连的信号。
  7. 可选地打开 SubscribeSlots(一个独立的数据流)以接收槽位生命周期事件。

代码生成

对于 TypeScript/JavaScript:
对于 Rust:

最佳实践

  1. 过滤
    • 始终设置至少一个账户约束;空过滤器会被拒绝。
    • 为每个过滤器使用稳定且唯一的 filter_id,以便您可以关联匹配结果并在之后移除过滤器。
  2. 富化
    • 除非您需要额外字段,否则将 include_enrichment 关闭——精简输出更小。启用它不会增加延迟;唯一的代价是消息略大一些。
    • 富化是面向整个订阅的:在任一过滤器上启用它会富化该会话接收的每笔交易。
  3. 序列与重连
    • 跟踪 sequence 编号以检测丢失的消息。
    • 实现自动重连;重连时,重新发送您的 AddFilters。
  4. 存活检测
    • 使用 Heartbeat 和 Ping/Pong 来确认数据流健康并测量延迟。

另请参阅

Jetstream 概述

流式传输模型、富化、槽位事件以及入门。

Jetstream v1 参考(已弃用)

已弃用的 v1 Protocol Buffer 规范。

支持

如需有关协议或实现细节的技术问题咨询,请加入我们的 Discord 社区。