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

使用solana.py遇AttributeError:AsyncClient无decode_transfer属性

解决方法

错误原因很明确:decode_transfer 并不是 AsyncClient 的内置方法,它属于 spl.token.instructions 模块下的工具函数,需要单独导入并调用。

要获取指令中的转账金额,你需要先从交易中提取目标指令的原始数据,再用 decode_transfer 解码,具体步骤如下:

  1. 导入正确的模块
    需要导入 spl.token.instructions 里的 decode_transfer,以及获取交易所需的相关方法:

    from solana.rpc.async_api import AsyncClient
    from spl.token.instructions import decode_transfer
    from solana.rpc.types import TokenAccountOpts
    
  2. 完整示例代码
    下面是获取指定交易中Token转账金额的完整异步代码:

    async def main():
        async with AsyncClient("https://api.mainnet-beta.solana.com") as client:
            # 替换为你要查询的交易签名
            tx_sig = "你的交易签名字符串"
            # 获取交易详情
            tx_response = await client.get_transaction(tx_sig, encoding="jsonParsed")
            tx_data = tx_response.value.transaction.message.instructions
            
            # 遍历指令,找到Token转账指令(这里假设交易中包含transfer指令)
            for instr in tx_data:
                if instr.program_id == "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA":
                    # 解码transfer指令
                    decoded_instr = decode_transfer(instr.data)
                    # 获取转账金额(注意:Token金额是最小单位,需要根据decimals转换为实际金额)
                    amount = decoded_instr.amount
                    print(f"转账金额(最小单位):{amount}")
                    # 如果需要转换为可读金额,需要先获取该Token的decimals
                    # 比如获取接收账户的信息来拿到decimals
                    # acc_info = await client.get_token_account_balance(decoded_instr.destination, opts=TokenAccountOpts(encoding="jsonParsed"))
                    # decimals = acc_info.value.decimals
                    # readable_amount = amount / (10 ** decimals)
                    # print(f"可读转账金额:{readable_amount}")
    
    import asyncio
    asyncio.run(main())
    
  3. 关键说明

    • decode_transfer 接收的是指令的 data 字段,确保你的solana-py版本是最新的,部分旧版本可能需要传入指令data的字节流形式。
    • 转账金额返回的是Token的最小单位(比如SOL的lamports,USDC的最小单位是1/10^6),如果需要转换为用户可读的金额,需要获取对应Token的decimals值进行换算。
    • 要准确识别Transfer指令,需要判断指令的program_id是否为Token程序的主网地址:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA。

内容的提问来源于stack exchange,提问作者wolfaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:27:02