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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:45:13