如何使用Python在TON区块链上发送Coins/Jettons(以Notcoin为例)
使用Python实现TON区块链钱包转账(原生币/Jettons)
一、准备工作
首先安装TON官方Python工具库:
pip install pytonlib
确保你已准备好:
- 发送方钱包的私钥(十六进制格式)
- 目标钱包主地址(原生币转账直接使用;Jettons转账需先获取对应Jetton子钱包地址)
- 选择TON主网/测试网(示例默认主网,可切换为
testnet)
二、原生TON币转账
以下是基于WalletV4R2标准钱包的实现代码:
from pytonlib import TonlibClient from pytonlib.contracts.wallet import WalletV4R2 import asyncio async def transfer_ton(): # 初始化TON客户端 client = TonlibClient( config={"network": "mainnet"}, # 切换为"testnet"使用测试网 ls_index=2 ) await client.init() # 钱包核心配置 sender_private_key = "替换为你的发送方私钥(十六进制字符串)" sender_address = "替换为你的发送方钱包地址(如EQ...)" target_address = "替换为目标钱包地址" amount = 0.01 # 转账金额,单位:TON # 加载发送方钱包 wallet = WalletV4R2( client=client, address=sender_address, public_key=bytes.fromhex(sender_private_key)[1:] # 私钥提取公钥 ) # 构建转账消息 transfer_msg = wallet.create_transfer_message( dest_addr=target_address, amount=int(amount * 1e9), # 转换为纳TON(1 TON = 1e9 纳TON) body="", # 可选添加转账备注 seqno=await wallet.get_seqno() # 获取当前钱包交易序列号 ) # 签名并发送交易 signed_msg = wallet.sign_message(transfer_msg, private_key=bytes.fromhex(sender_private_key)) await client.send_message(signed_msg) print("原生TON转账交易已提交") await client.close() if __name__ == "__main__": asyncio.run(transfer_ton())
三、Jettons转账(以Notcoin为例)
Jettons需通过Jetton子钱包合约完成转账,步骤如下:
from pytonlib import TonlibClient from pytonlib.contracts.wallet import WalletV4R2 from pytonlib.contracts.jetton import JettonWallet import asyncio async def transfer_jetton(): # 初始化TON客户端 client = TonlibClient( config={"network": "mainnet"}, ls_index=2 ) await client.init() # 核心配置 sender_private_key = "替换为你的发送方私钥(十六进制字符串)" sender_wallet_addr = "替换为你的发送方主钱包地址" target_main_wallet_addr = "替换为目标用户的主钱包地址" # Notcoin主网合约地址,测试网需替换对应地址 jetton_master_addr = "EQBynBO23ywHy_CgarY9NK9FTz0yDsG82PtcbSTQgGoXwiuA" amount = 100 # 转账Notcoin数量 # 加载发送方主钱包 main_wallet = WalletV4R2( client=client, address=sender_wallet_addr, public_key=bytes.fromhex(sender_private_key)[1:] ) # 获取目标用户的Jetton子钱包地址 target_jetton_wallet_addr = await JettonWallet.get_jetton_wallet_address( client=client, jetton_master_address=jetton_master_addr, owner_address=target_main_wallet_addr ) # 获取发送方的Jetton子钱包实例 sender_jetton_wallet = JettonWallet( client=client, address=await JettonWallet.get_jetton_wallet_address( client=client, jetton_master_address=jetton_master_addr, owner_address=sender_wallet_addr ) ) # 构建Jetton转账消息 jetton_transfer_msg = await sender_jetton_wallet.create_transfer_message( dest_jetton_wallet=target_jetton_wallet_addr, amount=int(amount * 1e9), # Notcoin为9位小数,与TON一致 forward_amount=int(0.001 * 1e9), # 支付给目标的TON手续费(必须>0) forward_payload=b"", seqno=await main_wallet.get_seqno() ) # 签名并发送交易 signed_msg = main_wallet.sign_message(jetton_transfer_msg, private_key=bytes.fromhex(sender_private_key)) await client.send_message(signed_msg) print("Notcoin转账交易已提交") await client.close() if __name__ == "__main__": asyncio.run(transfer_jetton())
关键注意事项
- 所有敏感信息(私钥、地址)务必替换为实际值,禁止硬编码到生产环境代码中
- 转账前确保发送方钱包有足够TON支付手续费(Jettons转账需额外支付少量TON用于合约交互)
- 不同Jettons的小数位数可能不同,需对应调整
amount的转换系数(Notcoin为9位) - 交易序列号
seqno必须与钱包当前状态一致,否则交易会失败,建议实时调用get_seqno()获取
内容的提问来源于stack exchange,提问作者veaceslav.kunitki
相关产品推荐
相关产品推荐

