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

TonTools模块返回的交易地址与实际不符问题求助

TonTools模块返回的交易地址与实际不符问题求助

问题描述

我编写了以下Python脚本,用于获取TON钱包的最新交易详情,但发现返回结果中的from和to地址与TonViewer上显示的实际交易地址完全不一致,已经通过浏览器TonViewer确认过交易数据,想知道原因和解决办法。

我的代码

from TonTools import TonCenterClient
import asyncio

async def get_wallet_transactions(client: TonCenterClient, address: str, limit=1):
    try:
        transactions = await client.get_transactions(address=address, limit=limit) 
        return transactions
    except Exception as e:
        print(f"Error fetching transactions: {e}")
        return []

async def main():
    try:
        client = TonCenterClient() 
        wallet_address = "UQCCDxNsruUYtSHBWL1P10hsheRNEFkohytYbsmsM9sM53Cb"

        transactions = await get_wallet_transactions(client, wallet_address)

        for transaction in transactions:
            print(transaction)
    except ModuleNotFoundError as e:
        print("Error")
        
asyncio.run(main())

运行结果

Transaction({"type": "out", "utime": 1733854739, "status": true, "hash": "BbF8dumQxYJkyCY/VUQVhkBYHr9yKG9/EKGRkN0luWE=", "value": 0.165780593, "from": "EQCCDxNsruUYtSHBWL1P10hsheRNEFkohytYbsmsM9sM5y1e", "to": "EQBBf4HnTz5lx5xz4yUzCExjWlVKKxL7uXIZIiyu2aLvUuhn", "comment": ""})

问题原因与解决方案

这个问题本质上是TON地址的格式差异,不是数据错误,下面详细说明:

核心原因

TON地址存在两种常用格式,二者指向同一个钱包/合约,只是前缀和校验位不同:

  • Non-bounceable格式(UQ开头):你传入查询的地址就是这种格式,转账到该地址不会被退回,适合已确认存在的钱包/合约。
  • Bounceable格式(EQ开头):TonTools默认返回的是这种格式,若接收方不存在,转账会被退回,是TON生态中更通用的地址格式。

你在TonViewer上看到的是Non-bounceable格式,而TonTools返回的是Bounceable格式,二者完全等价,只是展示形式不同。

解决办法

你可以通过TonTools自带的Address工具类进行格式转换,让返回的地址与TonViewer显示一致:

方法1:将返回的EQ地址转换为UQ地址

修改你的交易遍历代码,把每个地址转成Non-bounceable格式:

from TonTools import Address  # 新增导入

# ... 保留原有代码 ...

for transaction in transactions:
    # 转换from地址
    from_addr = Address(transaction.from_)
    transaction.from_ = from_addr.to_string(is_bounceable=False)
    # 转换to地址
    to_addr = Address(transaction.to)
    transaction.to = to_addr.to_string(is_bounceable=False)
    print(transaction)
方法2:查询前将UQ地址转换为EQ地址

先把你要查询的UQ地址转成Bounceable格式再传入接口,这样返回的from地址会和你传入的格式匹配:

# 在main函数中修改钱包地址部分
wallet_address = "UQCCDxNsruUYtSHBWL1P10hsheRNEFkohytYbsmsM9sM53Cb"
# 转换为Bounceable格式
addr = Address(wallet_address)
bounceable_addr = addr.to_string(is_bounceable=True)
# 使用转换后的地址查询
transactions = await get_wallet_transactions(client, bounceable_addr)

验证方式

你可以直接把TonTools返回的EQ开头地址复制到TonViewer中搜索,会发现它指向的就是你实际的钱包,这也能证明两种格式是等价的。


备注:内容来源于stack exchange,提问作者Sanmay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:13:05