Solana JSON RPC API各类交易规范及构造方法查询
自行构造Solana交易的核心规范参考
不用web3js、直接拼二进制交易调用sendTransaction接口是完全可行的,所有链上操作的指令格式都是固定公开的,不需要依赖特定语言的SDK,你提到的几类操作的具体规则如下:
通用交易结构(所有操作通用)
不管是哪种交易,整体二进制序列化顺序是固定的,乱序会导致解析失败:
- 开头1字节是无符号整数,记录这笔交易带了多少个签名
- 紧接着是签名列表,每个签名固定64字节,顺序和后面消息里的签名者账号一一对应
- 后面是消息主体,结构固定:
- 1字节版本号:新手直接用legacy版本填
0即可,v0版本额外支持地址查找表,等基础逻辑跑通再研究 - 32字节最近区块哈希:通过
getLatestBlockhashRPC拉取,用来做交易防重放,超过有效期的区块哈希对应的交易会被直接拒绝 - 账号地址列表:每个地址固定32字节,必须按「需签名+可写」→「需签名+只读」→「无需签名+可写」→「无需签名+只读」的优先级排序,第一个需签名的可写账号默认支付交易手续费
- 指令数组:每个指令拆成三部分:1字节的程序ID索引(标记这个指令调用哪个链上程序,值是对应程序地址在前面账号列表里的位置)、账号索引数组(每个元素1字节,按程序要求的顺序列指令涉及的账号在总账号列表里的位置)、指令参数字节流(按对应指令的格式序列化)
- 1字节版本号:新手直接用legacy版本填
常用操作的具体指令规则
1. 原生SOL转账(系统程序实现)
- 调用的固定程序ID:
11111111111111111111111111111111(系统程序,所有链上原生操作都走这个程序) - 涉及账号必须按以下顺序传入,且两个账号都要标记为可写:
- SOL转出方地址:必须是签名者
- SOL转入方地址
- 参数序列化规则:
- 前4字节固定为小端序u32值
2,也就是字节流0x02,0x00,0x00,0x00,对应系统程序的Transfer指令 - 后面跟8字节小端序u64值:转账的lamport数量,注意1 SOL = 10^9 lamport,别算错单位
- 前4字节固定为小端序u32值
2. SPL代币转账(SPL Token程序实现)
- 调用的固定程序ID:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - 普通Transfer指令涉及账号按以下顺序传入:
- 转出方的SPL代币账户地址:可写
- 转入方的SPL代币账户地址:可写
- 转出代币账户的权属人地址:必须是签名者
- 参数序列化规则:
- 第1字节固定为
0x03,对应Transfer指令标识 - 后面跟8字节小端序u64值:转账的代币数量,要按对应代币的精度换算,比如9精度代币转1枚就要填10^9
- 第1字节固定为
生产环境建议用TransferChecked指令(标识
0x0c),比普通Transfer多了代币铸造地址、代币精度两个校验位,不会因为关联错代币账户导致转错资产,安全性高很多。如果是委托代转的场景,第三个签名者位置换成被授权的委托地址即可。
3. SPL代币授权(Approve)
- 同样调用上面的SPL Token程序
- 涉及账号按以下顺序传入:
- 要开授权的源代币账户地址:可写
- 被授权的委托方地址
- 源代币账户的权属人地址:必须是签名者
- 参数序列化规则:
- 第1字节固定为
0x04,对应Approve指令标识 - 后面跟8字节小端序u64值:给委托方开放的最大可动用代币额度
- 第1字节固定为
同样推荐用带精度校验的ApproveChecked指令(标识
0x0d),额外传入代币铸造地址和精度参数,避免参数错误。
4. SPL代币撤销授权(Revoke)
- 同样调用SPL Token程序
- 涉及账号只有两个,按顺序传:
- 要撤销授权的源代币账户地址:可写
- 源代币账户的权属人地址:必须是签名者
- 参数序列化规则:只有1字节固定指令标识
0x05,不需要传额外参数。
构造注意事项
- 所有多字节数值一律用小端序序列化,别用大端序,不然链上程序解析直接报错
- 签名逻辑是先把消息体完整序列化,再用每个签名者的私钥对消息体的二进制内容做ed25519签名,把签名填到开头的签名数组位置,最后把整个交易二进制做base664编码,就能直接传给
sendTransaction接口 - 所有指令的账号顺序、参数偏移、字节长度必须严格匹配规则,链上程序是按位置解析的,顺序错一个就会报指令格式错误
- 调试阶段全部在devnet测试网验证,跑通所有逻辑再切主网,避免不必要的资产损失
内容的提问来源于stack exchange,提问作者Configentia
相关产品推荐
相关产品推荐

