什么是预处理交易?
在Solana的架构中,交易在完全处理前会通过几个阶段:- 碎片接收 → 验证器接收交易碎片(数据片段)
- 碎片解码 → 碎片被解码为原始交易 ← 预处理交易在此处可用
- 交易执行 → 交易由运行时执行
- 元数据生成 → 计算预/后余额、日志和错误信息
- 确认 → 交易达到已处理/已确认/已最终状态
尽力而为的交付保证
重要: 预处理交易交付是尽力而为,不保证。我们的目标是99.99%的交付率,但某些交易可能在以下情况下丢失:
- 基础设施更新和重新部署
- 网络问题或验证器连接问题
- 碎片解码或处理的极端情况
可用的数据有哪些?
预处理事务包括完整的事务消息,但缺乏执行元数据:可用数据
- ✅ Transaction signature - 唯一的事务标识符
- ✅ Account keys - 事务引用的所有账户
- ✅ Instructions - 完整的指令数据和程序调用
- ✅ Recent blockhash - 事务到期引用
- ✅ Signatures - 所有事务签名
- ✅ Is vote transaction - 是否是投票交易
- ✅ Slot number - 该事务所在插槽
缺失数据
- ❌ Transaction metadata - 令牌余额变化、前/后余额、事务状态
- ❌ Transaction errors - 我们无法确定事务是否失败
- ❌ Inner instructions - 不包括跨程序调用(CPI)
- ❌ Log messages - 执行期间生成的程序日志
- ❌ Compute units consumed - 无法获得执行指标
SDK支持和版本要求
所有LaserStream SDK都支持预处理的事务订阅:实现示例
JavaScript/TypeScript
JavaScript SDK 提供了一个专用的subscribePreprocessed函数,带有自动重新连接功能:
Rust
Rust SDK 提供本地性能:Go
Go SDK 提供惯用的 Go 接口:订阅结构和过滤
请求结构
预处理订阅请求遵循与标准订阅类似的结构,但具有集中的过滤集:响应结构
更新附带完整的交易消息和基本元数据:transaction.transaction 字段包含完整的 Solana 交易结构,包括:
- 消息 - 账户密钥、指令、最近的区块哈希
- 签名 - 所有交易签名
- 地址表查询 - 针对版本化交易
meta 字段。