Skip to main content
弃用通知。 预处理交易通过 gRPC 将被弃用。切换到 preprocessedSubscribe WebSocket 方法 —— 提供相同的预执行交易数据,延迟更低。
预处理交易是通过 gRPC 接收 Solana 交易的最快方式。Helius 直接在碎片到达验证者时解码,并将结果交易发送给您,使您能够比任何后执行订阅更早地获取交易数据 —— 平均processed 承诺级别提前大约 8 毫秒 本指南解释何时使用预处理交易、可用数据以及如何使用 LaserStream SDK 订阅它们(该 SDK 也在相同的 gRPC 连接上传递预处理交易)。

预处理交易在生命周期中的位置

在 Solana 的架构中,交易流经几个阶段,最后才能被完全处理:
  1. 接收碎片 → 验证者接收交易碎片(数据片段)。← Helius 的 原始碎片 (UDP) 在此处传递。
  2. 解码碎片 → 碎片被解码为原始交易。← 预处理交易在此可用。
  3. 执行交易 → 交易由运行时执行。
  4. 生成元数据 → 计算预/后余额、日志和错误信息。
  5. 承诺 → 交易达到处理/确认/完成状态。← LaserStream gRPCLaserStream WebSocket 在此处传递。
后执行订阅在第 5 阶段提供数据 —— 完全执行和生成元数据之后。预处理订阅在第 2 阶段提供 —— 解码碎片后立即完成,执行尚未完成。 权衡: 您能够提前几毫秒获得交易数据,但没有执行元数据,如余额变化、日志或错误信息。
这仅是交易流。 在运行时执行交易(第 4 阶段)之前,账户和程序状态更新不存在。如果您需要实时账户或程序更新 —— 代币余额、曲线状态、程序账户,任何不是原始交易的东西 —— 请使用 **LaserStream gRPCprocessed 承诺级别进行,该方法是接收账户/程序更改的最快途径。
需要更快的交易信号?尝试 预确认 来流传调度交易,及 原始碎片 (UDP) 以获取未处理的交易数据。

尽力而为的传递保证

预处理交易传递是尽力而为的,不是保证的。我们的目标是 99.99% 的传递率,但可能在以下情况下丢失一些交易:
  • 基础设施更新和重新部署
  • 网络问题或验证者连接问题
  • 解码或处理碎片的极端情况
对于需要保证传递的关键应用程序,请使用标准的 交易订阅

可用数据

预处理交易包括完整的交易消息,但缺少执行元数据:

可用数据

  • 交易签名 - 唯一的交易标识符
  • 账户密钥 - 交易引用的所有账户
  • 指令 - 完整的指令数据和程序调用
  • 最近区块哈希 - 交易到期参考
  • 签名 - 所有交易签名
  • 是否为投票交易 - 判断是否为投票交易
  • 插槽编号 - 包含此交易的插槽

缺失数据

  • 交易元数据 - 代币余额变化、预/后余额、交易状态
  • 交易错误 - 无法确定交易是否失败
  • 内部指令 - 不包含跨程序调用 (CPI)
  • 日志消息 - 程序日志在执行期间生成
  • 消耗的计算单元 - 执行指标不可用
可以将预处理交易视为收到“提议”而没有“结果”。您会看到用户尝试做什么,但看不到实际发生了什么。

SDK 支持和版本要求

所有 LaserStream SDK 都支持预处理交易订阅:

JavaScript/TypeScript

版本 0.2.8 或更高

Rust

版本 0.1.5 或更高

Go

版本 0.1.0 或更高

实现示例

JavaScript/TypeScript

JavaScript SDK 提供了专用的 subscribePreprocessed 函数,具备自动重新连接功能:
完整示例: preprocessed-transaction-sub.ts

Rust

Rust SDK 提供本机性能:
完整示例: preprocessed_transaction_sub.rs

Go

Go SDK 提供惯用的 Go 接口:
完整示例: preprocessed-transaction-sub.go

订阅结构和过滤

请求结构

预处理订阅请求遵循与标准订阅类似的结构,但具有一组集中的过滤器:

响应结构

更新会附带完整的交易消息和基本元数据:
transaction.transaction 字段包含完整的 Solana 交易结构,包括:
  • 消息 - 账户密钥、指令、最近区块哈希
  • 签名 - 所有交易签名
  • 地址表查找 - 针对版本化交易
这与标准订阅中的交易结构相同,但没有包含执行结果的 meta 字段。