什么是preconfSubscribe?
preconfSubscribe 是一个 Helius WebSocket 方法,流式传输 预确认 —— 在交易被收集到条目并分片之前交付的交易。它是 Helius 提供的最低延迟交易信号。一个订阅同时提供 Helius 预确认,立即发出领导者执行交易时并携带其执行状态,以及从运行 Jito 的区块组装市场客户端的验证器发出的 BAM 预确认,在验证器承诺执行交易时发出。访问需要 专业计划或更高 —— 请参阅 定价。
该流不是连续的。覆盖范围随着转发到 Helius 或运行 BAM 的股份份额而扩大,因此可以预期有些槽位没有消息——请妥善处理这些间隙。参见 覆盖范围。
preconfSubscribe 从 wss://beta.helius-rpc.com 提供服务 —— Helius Gatekeeper 端点 —— 而不是 mainnet.helius-rpc.com。使用您的 API 密钥作为查询参数进行认证。
beta 主机名指的是 Gatekeeper 的发布,而不是预确认的成熟度。预确认首先在 Gatekeeper 端点启动;随着 Helius 将流量迁移到 Gatekeeper,它将成为标准端点。订阅
使用preconfSubscribe 方法发送 JSON-RPC 请求。服务器响应订阅 ID,然后为每笔交易流式传输通知。传递可选的 过滤器 作为第一个 params 元素以仅接收匹配的交易;省略 params 以接收来自 Helius 和 BAM 的完整流。
订阅响应
result — 这是你用来取消订阅的订阅ID。在此确认后,通知以二进制帧形式流动(见下文)。
过滤
默认情况下,preconfSubscribe 从两个来源流式传输每笔交易。要缩小流式范围,请传递过滤器对象作为 params 的第一个元素。过滤发生在服务器端,因此您只需支付并接收到您关心的交易。
params)将匹配来自两个来源的每个交易。
过滤规则:
- 所有谓词均以 AND 连接,并按以下顺序求值:
includeSource→failed→regionInclude→signatures→accountExclude→accountRequired→accountInclude→signerExclude→signerInclude→instructions。 - 状态未知的 BAM 预确认会忽略
failed过滤器。状态未知的 Helius 预确认不会与显式的failed过滤器匹配。 includeSource必须是仅包含helius和bam的数组。无效值会返回 JSON-RPC 错误-32602(无效参数)。- 账户是以 base58 编码的公钥。无效值会返回 JSON-RPC 错误
-32602(无效参数)。 - 每个账户或签名者列表最多包含 10,000 个条目。
signatures最多包含 1,000 个条目。
为保持向后兼容,已弃用的
includeBam 过滤器仍然可用。
includeBam: false 等同于 includeSource: ["helius"]。includeBam: true 或
省略此字段会选择两个来源。不要同时发送 includeBam 和
includeSource。签名者和签名过滤
使用signerInclude 匹配由特定账户签名的交易。使用 signerExclude 移除由任意所列账户签名的交易。被引用的账户不算作签名者。
当你已经知道要跟踪哪些交易时,请使用 signatures。该过滤器匹配交易的第一个签名,即 Solana RPC 方法所使用的签名。订阅后无法更改过滤器,因此如需跟踪新签名,请创建新订阅。
指令过滤
使用instructions 按程序和指令数据匹配顶层指令。每个指令过滤器支持以下字段:
每个
memcmp 条目都接受 base58、base64 或 hex 编码。默认为 base58。当一条顶层指令满足任意指令过滤器中的所有条件时,交易即为匹配。
以下请求通过 Anchor 判别符匹配 pump.fun buy 指令:
memcmp 条目。每个 memcmp 值必须解码为 1–128 个字节。memcmp 的结束偏移量和 dataSize 不得超过 4,096 字节。
地址查找表(ALT)解析
账户过滤器匹配的不只是交易的静态账户密钥——Helius 会在服务器端解析 v0 地址查找表,因此accountInclude、accountExclude 和 accountRequired 也会匹配交易通过 ALT 加载的账户。
这意味着你可以筛选交易涉及的任何账户,即使它仅出现在查找表之后,也无需维护 ALT 映射或自行解析表。只需传入账户的公钥,Helius 就会在应用过滤器之前完成解析。
区域过滤
使用regionInclude 可仅接收来自特定区域的交易。传入一个或多个区域代码;当交易的来源区域与其中任意代码匹配时,该交易即可通过。
sgp 和 dal。
有效的区域代码:
设置
regionInclude 后,不带区域信息的交易会被丢弃。无法识别的区域代码会返回 JSON-RPC 错误 -32602(无效参数)。通知有效载荷
通知以二进制 WebSocket 帧(而非 JSON)的形式传送。Helius 和 BAM 预确认采用相同的布局。每个帧都是携带单笔交易的紧凑字节布局:
有效载荷没有来源字段。不要根据
tx_index = 0 推断它来自 BAM,因为其他来源也可能报告 0。
区分两个来源
由于没有来源字段,你无法将任意消息标记为 Helius 或 BAM。status 字节提供了单向分类依据:
status为0或1— 该消息是 Helius 预确认,且交易已执行。BAM 从不报告这些值。status为2— 来源不明确:可能是 BAM 预确认,也可能是无法获取执行状态的 Helius 预确认。
regionInclude 是订阅过滤器而非有效载荷字段,因此无法从每条消息中读取。
如果你需要流中的每条消息都携带同类依据,请设置 includeSource: ["helius"] 或 includeSource: ["bam"]。仅含 Helius 的流包含在领导者执行时发出的预确认。
预确认是一种早期信号,而非保证。交易尚未
上链,仍可能被丢弃——而且 Helius 预确认的
执行状态反映的是领导者的本地结果,在
区块确认前并非最终结果。请通过标准的承诺检查确认交易已落地,
再将其视为最终结果。
解码交易
交易字节会严格按照验证者序列化的结果转发,并使用对应交易版本的标准线路编码。旧版和 v0 交易使用bincode 生成的签名优先布局。交易 v1(SIMD-0385)使用消息优先布局,签名位于末尾,因此 bincode 无法处理 v1 有效载荷。请使用支持所有版本的解码器:
- Rust:
agave-transaction-view可原地解析旧版、v0 和 v1 交易,无需中间副本。这是推荐选项。当前 Solana SDK 使用的兼容 bincode 的序列化器wincode也可以将 v1 解码为VersionedTransaction。 - **JavaScript / TypeScript:**请确保你的库版本支持交易 v1。较旧的
VersionedTransaction.deserialize实现仅支持旧版和 v0。请使用@solana/kit8.0+ 或@solana/web3.jsv3。请参阅交易 v1 支持。
重复通知
Helius 和 BAM 预确认按来源去重,而不会跨来源去重。少量交易会同时通过这两个来源到达 Helius,因此你可能会收到两次相同的签名,并且两个副本可能报告不同的槽位。 在客户端按签名去重,并确保由交易触发的操作具有幂等性,以免第二条通知重复触发同一操作。请通过标准的承诺检查确认执行和落地情况。示例
取消订阅
要停止接收通知,请使用preconfSubscribe 返回的订阅 ID 调用 preconfUnsubscribe。
定价
每个槽位最低 300 积分的规则将于 2026 年 10 月 14 日生效。在此之前,
Preconfirmations 按每条消息 10 积分计费,不设最低消费。
最低收费按订阅计算,因此每个处于打开状态的
preconfSubscribe 订阅在每个覆盖槽位中至少支付 300 积分。请使用 preconfUnsubscribe 关闭不再需要的订阅。
计费按消息计算,而不是按唯一签名计算。同时由 Helius 和 BAM 传送的交易会计费两次。如果只需要 Helius 预确认,请设置 includeSource: ["helius"]。
Preconfirmations 是一款新产品,定价可能会发生变化。
相关内容
Preconfirmations Overview
了解 Preconfirmations 是什么,以及它在验证者流水线中的位置。
transactionSubscribe
使用丰富的过滤功能流式传输已达到 confirmed 承诺级别的交易。
preconfSubscribe API reference
请求参数、过滤器字段和二进制通知布局。