Solana 交易解码器

粘贴钱包要求你签署的 base64 或 RPC 返回的字符串。解码器列出签名者、账户和指令,标注常见程序,并汇总 SOL 和代币转账。

已签名或未签名均可。解码在你的浏览器中进行;不会向任何地方发送数据,因此即将签名的未签名交易也可以安全粘贴。
示例:

由浏览器中的 JavaScript 解码。地址不会被上传或存储。

什么是序列化的 Solana 交易?

序列化的 Solana 交易是一个紧凑的字节数组:以计数为前缀的 64 字节 ed25519 签名列表,后跟消息;消息包含头部(签名者和只读账户的数量)、以 32 字节密钥表示的账户地址、最近的 blockhash 和指令,每条指令通过索引引用其程序和账户。钱包和 RPC 节点以 base64 或 base58 交换它;第一个签名兼作交易 ID。

解读结果

Legacy 与版本化(v0)消息

属性Legacyv0(版本化)
消息前缀无;直接以头部开始头部前有 0x80 版本字节
账户全部内联列出,不超过 1232 字节限制内联账户加上地址查找表中的索引
可离线解析可以,所有账户都在消息中查找表条目需要链上数据
典型来源简单钱包、较旧的 SDKDEX 聚合器及任何涉及大量账户的程序

实例演示

一条 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。

相关工具:Solana 地址验证器、lamports 换算器、devnet 批量转账。

常见问题

支持哪些格式?

getTransaction 以 base64 编码返回的、钱包 signTransaction 返回的或 Transaction.serialize() 生成的 base64;sendTransaction 使用的 base58;原始十六进制。也接受裸消息(不含签名数组),即部分钱包在签名前显示的内容。

什么是 v0 交易?

版本化交易(v0)可以引用存储在地址查找表中的账户,以便在 1232 字节限制内容纳更多账户。解码器显示查找表地址和索引,但其背后的实际账户在链上,无法离线解析;它们显示为“lookup-table account #n”。

交易签名和哈希是一回事吗?

在 Solana 上,第一个签名就充当交易 ID。当签名槽位非零时会显示;未签名交易还没有 ID。

哪些指令会被解码?

System Program 的转账和账户创建,SPL Token 和 Token-2022 的转账、授权、铸造、销毁和关闭(checked 变体会按小数位显示金额),关联代币账户创建,Compute Budget 的限制和价格,以及 Memo 文本。其他已知程序(Jupiter、Raydium、Orca、Metaplex)按名称显示,并附原始账户和数据。

1232 字节限制是什么?

Solana 交易必须装进一个网络数据包:1280 字节的 IPv6 MTU 减去头部后,序列化交易剩 1232 字节。每个账户占 32 字节,每个签名占 64 字节,这就是大型交易使用查找表的原因。

为什么 SPL Transfer 的金额是原始单位?

普通的 Transfer 指令不携带小数位,只有 TransferChecked 才有。知道 mint 的小数位后,请用小数位换算器换算原始单位。