processed 承诺级别提前大约 8 毫秒。
本指南解释何时使用预处理交易、可用数据以及如何使用 LaserStream SDK 订阅它们(该 SDK 也在相同的 gRPC 连接上传递预处理交易)。
预处理交易在生命周期中的位置
在 Solana 的架构中,交易流经几个阶段,最后才能被完全处理:- 接收碎片 → 验证者接收交易碎片(数据片段)。← Helius 的 原始碎片 (UDP) 在此处传递。
- 解码碎片 → 碎片被解码为原始交易。← 预处理交易在此可用。
- 执行交易 → 交易由运行时执行。
- 生成元数据 → 计算预/后余额、日志和错误信息。
- 承诺 → 交易达到处理/确认/完成状态。← LaserStream gRPC 和 LaserStream WebSocket 在此处传递。
尽力而为的传递保证
预处理交易传递是尽力而为的,不是保证的。我们的目标是 99.99% 的传递率,但可能在以下情况下丢失一些交易:- 基础设施更新和重新部署
- 网络问题或验证者连接问题
- 解码或处理碎片的极端情况
可用数据
预处理交易包括完整的交易消息,但缺少执行元数据:可用数据
- ✅ 交易签名 - 唯一的交易标识符
- ✅ 账户密钥 - 交易引用的所有账户
- ✅ 指令 - 完整的指令数据和程序调用
- ✅ 最近区块哈希 - 交易到期参考
- ✅ 签名 - 所有交易签名
- ✅ 是否为投票交易 - 判断是否为投票交易
- ✅ 插槽编号 - 包含此交易的插槽
缺失数据
- ❌ 交易元数据 - 代币余额变化、预/后余额、交易状态
- ❌ 交易错误 - 无法确定交易是否失败
- ❌ 内部指令 - 不包含跨程序调用 (CPI)
- ❌ 日志消息 - 程序日志在执行期间生成
- ❌ 消耗的计算单元 - 执行指标不可用
SDK 支持和版本要求
所有 LaserStream SDK 都支持预处理交易订阅:JavaScript/TypeScript
版本 0.2.8 或更高
Rust
版本 0.1.5 或更高
Go
版本 0.1.0 或更高
实现示例
JavaScript/TypeScript
JavaScript SDK 提供了专用的subscribePreprocessed 函数,具备自动重新连接功能:
Rust
Rust SDK 提供本机性能:Go
Go SDK 提供惯用的 Go 接口:订阅结构和过滤
请求结构
预处理订阅请求遵循与标准订阅类似的结构,但具有一组集中的过滤器:响应结构
更新会附带完整的交易消息和基本元数据:transaction.transaction 字段包含完整的 Solana 交易结构,包括:
- 消息 - 账户密钥、指令、最近区块哈希
- 签名 - 所有交易签名
- 地址表查找 - 针对版本化交易
meta 字段。