You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:05:01