使用Python调用Jupiter Swap发送交易后部分交易在Solscan显示无数据
问题分析与解决方案
你遇到的情况是交易被节点接收并返回签名,但实际未被打包进区块链,属于交易未确认的问题,而非交易执行失败。以下是针对性的解决步骤:
1. 关闭skipPreflight校验
skipPreflight: True会跳过交易发送前的模拟校验,这意味着即使交易存在签名无效、计算单元不足、余额不够等隐性问题,节点也会先接收并返回签名,但后续会直接丢弃该交易,导致浏览器查不到数据。
修改你的请求参数,移除或设置skipPreflight: False:
data = { "jsonrpc": "2.0", "id": 1, "method": "sendTransaction", "params": [ encoded_tx, { "skipPreflight": False, # 关闭跳过预校验 "preflightCommitment": "confirmed", "encoding": "base64" } ] }
2. 添加交易确认轮询逻辑
发送交易后,不要仅依赖返回的签名,必须主动查询交易状态,直到确认其被链上确认。示例代码如下:
import time def wait_for_tx_confirmation(rpc_url, signature, timeout=30): start_time = time.time() headers = {"Content-Type": "application/json"} while time.time() - start_time < timeout: data = { "jsonrpc": "2.0", "id": 1, "method": "getTransaction", "params": [ signature, {"commitment": "finalized", "encoding": "jsonParsed"} ] } response = requests.post(rpc_url, headers=headers, json=data) result = response.json() if "result" in result and result["result"] is not None: return True time.sleep(1) return False # 发送交易后调用 tx_result = tx_response.json() if "result" in tx_result: signature = tx_result["result"] is_confirmed = wait_for_tx_confirmation(rpc_url, signature) if not is_confirmed: print("交易未被确认,可能已丢失")
3. 正确设置优先级费用(从Jupiter源头处理)
你直接修改生成后的交易可能无法生效,因为Jupiter返回的swapTransaction已经是完整的交易结构。正确的做法是在调用Jupiter报价API时,就传入优先级费用参数,让Jupiter生成包含优先费的交易:
# 示例:请求Jupiter报价时添加优先级费用参数 jupiter_quote_params = { "inputMint": "xxx", "outputMint": "xxx", "amount": "xxx", "prioritizationFeeLamports": 1000000 # 直接在这里设置 } # 发送请求获取报价和swapTransaction
4. 更换可靠的RPC节点
公共RPC节点通常存在负载高、交易丢弃率高的问题,建议使用付费的Solana RPC节点,这类节点稳定性更强,能提升交易的打包成功率。
内容的提问来源于stack exchange,提问作者Lucas Abraham
相关产品推荐
相关产品推荐

