使用pyserum实现SOL兑换USDT下单时报Unknown instruction错误
错误原因
- 交易方向逻辑错误:你要将SOL兑换为USDT,属于挂单卖出SOL兑换USDT,代码中设置的
Side.BUY是用USDT买入SOL,和你的需求完全相反,此时要求传入的付款账户有足够USDT余额,而你新创建的USDT账户没有任何余额,触发指令校验失败。 - 付款账户参数错误:
place_order方法的payer参数需要传入你用于支付的代币账户,如果你是卖SOL,需要传入你的SOL持有账户,而非新创建的空USDT账户。 - 价格参数不符合规则:直接传入0.01作为限价价格,一方面远低于SOL的实际市场价格,另一方面pyserum要求价格和数量需要转换为对应市场的最小单位整数,不能直接传入原始小数,参数格式不符合Serum程序要求。
- 跳过前置校验导致问题被掩盖:你开启了
skip_confirmation和skip_preflight参数,跳过了账户创建校验、交易预检查步骤,无法提前发现参数错误、余额不足等问题。 - 可能存在市场地址获取错误:你自定义的
fetch_market_address方法如果返回了错误的市场地址(比如测试网地址、非官方Serum市场地址),也会触发指令不识别错误。
修复方案
- 修正交易方向:将下单侧改为
Side.SELL,对应卖出SOL兑换USDT的需求。 - 修正付款账户参数:如果你是卖出SOL,
payer参数传入你的SOL SPL关联账户地址,确保该账户内有足够的可卖出SOL余额。 - 转换价格和数量格式:调用Market实例的内置方法转换价格和数量为符合市场规则的格式,示例代码如下:
# 假设你要以20 USDT的价格卖出1 SOL adjusted_price = market.price_to_lots(20) adjusted_quantity = market.base_size_to_lots(1) tx_sig = market.place_order( payer=你的SOL关联账户地址, owner=payer, side=Side.SELL, order_type=OrderType.LIMIT, limit_price=adjusted_price, max_quantity=adjusted_quantity, opts = TxOpts(skip_preflight=False) # 关闭跳过预检查 )
- 关闭跳过校验的参数:将创建账户的
skip_confirmation和交易的skip_preflight都改为False,提前暴露前置步骤的错误。 - 验证市场地址正确性:可以先硬编码主网官方SOL/USDT市场地址
9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT进行测试,排除自定义获取地址方法的错误。 - 确保账户有足够手续费:付款的Keypair地址内预留至少0.1 SOL作为交易手续费和账户租金。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

