Solana主网RPC返回区块JSON结构疑问及交易信息查询咨询
关于Solana主网RPC区块JSON结构的疑问解答
1. preBalances与postBalances索引0数值差异的原因
preBalances和postBalances数组按交易中涉及账户的顺序排列,索引0对应的是交易的付费账户(payer)。- 该账户需要承担交易手续费,因此
postBalances[0]是扣除手续费后的余额,自然和交易前的preBalances[0]存在差异。 - 其余索引的账户如果是只读账户(如程序账户、未发生余额变动的账户),或是仅参与签名但无余额变化的账户,它们的
preBalances和postBalances数值就会一致,这是正常逻辑,并非未填充。
2. 在指定区块中查询交易发起地址、金额及接收地址的方法
第一步:获取目标区块的解析后数据
调用RPC方法getBlock获取目标区块数据时,需指定参数encoding: "jsonParsed",这样能直接拿到结构化的交易数据,无需手动解析二进制内容。
第二步:解析单条交易的关键信息
针对区块内的每一笔交易,从transaction字段中提取对应信息:
- 发起钱包地址:取
transaction.message.header.payer字段,这就是发起交易并支付手续费的账户地址。 - 交易金额与接收地址:需要遍历
transaction.message.instructions数组中的指令:- 若为系统程序(地址为
11111111111111111111111111111111)的转账指令(InstructionType: Transfer),可从data解析出转账金额,accounts数组的第1位是接收地址(第0位为发起地址)。 - 若为SPL代币等其他程序的交易,需对应程序的指令格式解析:比如SPL代币转账指令中,
accounts数组通常包含代币账户所有者、发送方代币账户、接收方代币账户,金额从data字段提取。
- 若为系统程序(地址为
- 注意:若交易包含多笔指令,需逐个解析每笔指令的金额与对应接收方,汇总后得到完整的资金流向。
内容的提问来源于stack exchange,提问作者Router
相关产品推荐
相关产品推荐

