Solana Client.send_transaction()无返回响应,无法获取交易签名
Solana SPL代币转账无法获取交易签名的问题解决
核心问题分析
transfer_spl_token函数未设置返回值,导致调用时signature变量始终为None,即便交易成功发送也拿不到签名send_transaction开启了skip_confirmation=False,会等待交易确认,但日志末尾出现429(请求过多),说明Solana公共RPC节点限流,导致确认流程卡住,函数无法正常返回- 异步函数
confirm_buy中直接调用同步的transfer_spl_token,阻塞事件循环,也会引发响应异常
修复步骤
1. 让函数返回交易签名
修改transfer_spl_token,在发送交易后返回签名:
def transfer_spl_token(deposit_address, user_address, token_amount, privkey, mint_address): # 补全参数定义 # 原初始化、交易构建逻辑保持不变... # 发送交易并返回签名 response = client.send_transaction(transaction, source_keypair, opts=TxOpts(skip_confirmation=False, preflight_commitment="processed")) logger.info(response) return response # 新增返回语句
2. 处理RPC节点限流问题
Solana主网公共节点有请求频率限制,出现429会导致确认失败,可通过两种方式解决:
- 改用付费RPC节点(如QuickNode、Alchemy),提升请求限额
- 跳过即时确认,先获取签名再手动轮询交易状态:
# 修改opts参数,跳过确认直接拿签名 opts = TxOpts(skip_confirmation=True, preflight_commitment="processed") signature = client.send_transaction(transaction, source_keypair, opts=opts) # 手动轮询确认交易 import time while True: try: tx_status = client.get_transaction(signature, commitment="confirmed") if tx_status.value: logger.info(f"交易已确认: {signature}") break except Exception: time.sleep(1) # 间隔1秒重试 return signature
3. 统一异步/同步逻辑
如果项目使用异步环境,建议改用solana-py的异步客户端:
from solana.rpc.async_api import AsyncClient async def transfer_spl_token(deposit_address, user_address, token_amount, privkey, mint_address): async with AsyncClient(endpoint=SOLANA_ENDPOINT, commitment="processed") as client: # 原交易构建逻辑不变... # 异步发送交易 signature = await client.send_transaction(transaction, source_keypair, opts=TxOpts(skip_confirmation=False, preflight_commitment="processed")) logger.info(signature) return signature # 调用时使用await async def confirm_buy(): signature = await transfer_spl_token(deposit_address, user_address, token_amount, privkey, mint_address) logger.info(signature)
额外说明
- 交易签名在发送时就已生成,
send_transaction会自动用传入的keypair完成签名,无需额外手动签名操作 - 日志中已打印出签名
noZ2x.....AHwaX,说明交易已成功发送,只是代码未捕获返回值
内容的提问来源于stack exchange,提问作者user881239
相关产品推荐
相关产品推荐

