什么是序列化的 Solana 交易?
序列化的 Solana 交易是一个紧凑的字节数组:以计数为前缀的 64 字节 ed25519 签名列表,后跟消息;消息包含头部(签名者和只读账户的数量)、以 32 字节密钥表示的账户地址、最近的 blockhash 和指令,每条指令通过索引引用其程序和账户。钱包和 RPC 节点以 base64 或 base58 交换它;第一个签名兼作交易 ID。
解读结果
- 账户按消息顺序列出:先是签名者,然后是可写账户,最后是只读账户。手续费支付方是账户 0。
- 指令显示程序、解码后的名称和字段,并在“账户与数据”下显示精确的账户列表和数据字节。
- 顶部的转账汇总了资金流向:通过 System Program 的 SOL 转账和通过 Transfer / TransferChecked 的代币转账。
Legacy 与版本化(v0)消息
| 属性 | Legacy | v0(版本化) |
|---|---|---|
| 消息前缀 | 无;直接以头部开始 | 头部前有 0x80 版本字节 |
| 账户 | 全部内联列出,不超过 1232 字节限制 | 内联账户加上地址查找表中的索引 |
| 可离线解析 | 可以,所有账户都在消息中 | 查找表条目需要链上数据 |
| 典型来源 | 简单钱包、较旧的 SDK | DEX 聚合器及任何涉及大量账户的程序 |
实例演示
一条 SOL 转账消息有 3 个账户:发送方(签名者、可写)、接收方(可写)和 System Program 11111111111111111111111111111111。它唯一的指令指向账户索引 2,数据为 02000000(指令 2 = Transfer,小端 u32),后跟小端 u64 的金额,因此 00e1f50500000000 即 100,000,000 lamports = 0.1 SOL。USDC 转账则指向 Token 程序,使用携带金额和 decimals = 6 的 TransferChecked 指令。
核对钱包弹窗
当 dApp 请求签名时,钱包通常会显示模拟结果。如果你想看到真实情况,请从 dApp 记录序列化消息(大多数库提供 transaction.serialize({ requireAllSignatures: false }))并粘贴到这里:你会看到每条指令,包括 Compute Budget 设置以及模拟摘要可能隐藏的 SetAuthority 或 Approve。