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
相关产品推荐
相关产品推荐

