使用Helius免费RPC查询Solana已确认交易提示“未找到”的问题
解决方案:Solana RPC查询交易返回“not found”但签名状态正常
1. 修正交易版本参数设置
Helius RPC对版本化交易的处理对MaxSupportedTransactionVersion参数敏感,若指定的版本与实际交易版本不匹配,会直接导致查询失败。
修改GetTransactionOpts,将版本参数设为nil,让RPC自动适配支持的交易版本:
out, err := solanaClient.GetTransaction( context.Background(), sig, &solanaRPC.GetTransactionOpts{ MaxSupportedTransactionVersion: nil, // 移除指定版本,交由RPC自动处理 Encoding: solana.EncodingBase64, }, )
如果确认目标交易是版本1的版本化交易,也可以明确指定版本号:
transactionVersion := uint64(1) out, err := solanaClient.GetTransaction( context.Background(), sig, &solanaRPC.GetTransactionOpts{ MaxSupportedTransactionVersion: &transactionVersion, Encoding: solana.EncodingBase64, }, )
2. 更换RPC端点测试
Helius免费节点存在数据同步延迟、部分交易未被索引的情况,换用其他公共RPC端点验证查询是否有效:
// 示例:切换到Solana官方主网公共端点 solanaClient, err := solana.NewClient("https://api.mainnet-beta.solana.com") if err != nil { panic(err) } // 重新执行交易查询 out, err := solanaClient.GetTransaction( context.Background(), sig, &solanaRPC.GetTransactionOpts{ MaxSupportedTransactionVersion: nil, Encoding: solana.EncodingBase64, }, )
3. 调整Commitment与Encoding参数
添加Commitment参数确保查询已最终确认的区块数据,同时尝试切换编码格式:
out, err := solanaClient.GetTransaction( context.Background(), sig, &solanaRPC.GetTransactionOpts{ MaxSupportedTransactionVersion: nil, Encoding: solana.EncodingJsonParsed, // 改用JSON解析格式 Commitment: solana.CommitmentFinalized, // 查询最终确认的区块 }, )
4. 验证签名准确性
确保查询的交易签名无编码或复制错误,重新解析签名后再执行查询:
// 重新解析签名,避免原始sig存在格式问题 validSig := solana.MustSignatureFromBase58(sig.String()) out, err := solanaClient.GetTransaction( context.Background(), validSig, &solanaRPC.GetTransactionOpts{ MaxSupportedTransactionVersion: nil, Encoding: solana.EncodingBase64, }, )
5. 检查Helius免费节点限制
Helius免费层对交易数据的保留时长、索引范围有明确限制,若目标交易是较旧的历史数据,免费节点可能无法提供查询。可尝试升级到Helius付费层,或更换支持全历史数据的RPC服务。
内容的提问来源于stack exchange,提问作者niu
相关产品推荐
相关产品推荐

