Jetton 是 The Open Network(TON)区块链上的标准化可替代代币,类似以太坊的 ERC-20。本文手把手拆解 Jetton 架构、主合约、钱包合约、存取款、链上与链下处理、通知与最佳实践,助你在 TON 生态中游刃有余。
1 Jetton 简介与核心概念
1.1 什么是 Jetton
Jetton 是 TON 区块链上的同质化代币协议(TEP-74)。它使用 Master 合约 + 钱包合约双合约架构,支持零手续费接收、拆分转账及批量提币。
关键词:TON Jetton、TON 代币、可替代代币。
1.2 交易确认规则
TON 的交易只需 1 次确认即不可逆。为了流畅的用户体验,应用侧无需再做额外等待。
1.3 常见定义
- Master:存储全局元数据与唯一标识(总供应量、Metadata URI、铸造开关)。
- Wallet:每个 (用户, 代币类型) 对部署的独立钱包合约,负责转账、销毁、接收。
2 Jetton 实践指南
2.1 铸造与部署
| 场景 | 要点 |
|---|---|
| 首次铸造 | 部署 Jetton 主合约(minter),调用 mint 方法。 |
| 追加铸造 | 只有当 mintable=-1 时才可操作。管理员调用中间消息 op=21 即可增发;若需永远锁铸,可将管理员设为 0x0 地址。 |
| 元数据配置 | 根据 TEP-64 在 jetton_content Store 下列字段:name / symbol / decimals / image 。 |
2.2 链下存币与提币
存款两种模式
- 中央钱包 + Memo:
把多个用户转账指向同一地址,Memo 作为用户唯一标识。整合成本低,却易忘填。 - 独立子地址:
为每位用户分配专属子钱包(使用子 ID 创建 v3R2 钱包)。无需 Memo,用户体验好,但需监控大量地址。
提币最佳实践
- 高负载钱包 v3 支持批量。一次交易可携带多条
transfer消息,降低手续费达 90 %。 - Gas 预算公式:
Toncoin > to_nano(TRANSFER_CONSUMPTION) + forward_ton_amount + 尘埃量
一般预留 0.05 TON 以上即可。
小程序:用 pytonlib 查余额
from pytonlib import TonlibClient
client = TonlibClient()
await client.get_jetton_wallet_balance(wallet_address='EQYourJettonWallet...')
3 消息布局与“三跳转账”模型
转账 Jetton 默认触发 3 条内部消息(三跳):
- Message 0 发送方钱包 → 接收方钱包(附带金额、Memo 等)。
- Message 2’ 接收方钱包 → 用户通知(仅 forward_ton_amount>0)。
- Message 2’‘ 接收方钱包 → 发送方返还多余 TON。
想要附带短信?将 forward_payload 前 32 bit 置 0x0,后接 UTF-8 文本即可。推荐设置 1 nanoton 即可发送通知。
普通转账的低级错误:出现 709 或 cskip_no_gas,基本都是转发金额不足以支付费 gas。
4 常见疑问速解(FAQ)
-
Q:如何验证 Jetton 真伪?
A:比对官网公布的 Master 地址与链上合约地址;同时检查symbol、name是否有细微差异。 -
Q:批量提币上限是多少?
A:高负载 v3 钱包单笔最多 254 条消息,实际受 payload 长度限制建议 ≤100 条。 -
Q:Memo 存款模式如何减少漏填?
A:前端强制在转账备注中写入 6–8 位固定随机字符串,匹配失败直接拒绝入账。 -
Q:我想一次性发 1000+ 地址的 Jetton 怎么办?
A:把分片钱包分批触发,可在数分钟内完成上万地址的投放,点击👉立即体验完整流程 -
Q:Jetton 可以升级 Master 吗?
A:可以。只要保留calc_jetton_wallet_address方法签名不变,更新代码即可,但旧的 Mint 权限须谨慎处理。
5 完整操作流程(伪代码)
// 1. 部署 Jetton 主合约
const minter = new JettonMinter(provider, {admin: ADMIN, ...meta});
await minter.deploy();
// 2. 提币时用高负载钱包
const highload = new WalletV3(provider, {publicKey,...});
await highload.sendTransfer({seqno, messages: batch});
// 3. 存款监听
client.getTransactions(POOL_WALLET, {lt, hash})
.filter(tx => tx.in_msg?.opcode === 0x7362d09c)
.map(tx => db.insertDeposit(tx.memo, tx.amount));
6 开发工具箱
- SDK:tonweb(JS)、ton4j(Java)、tonutils-go(Go)。
- API:/jetton/masters、/runGetMethod、/getTransactions。
- 开源示例:bicycle(无 Memo 支付处理器)。
7 防骗要点
- 警惕高仿币:官方 TON 无 Jetton symbol 为
TON的版本。 - 界面标注:将 Jetton 资产标识为 “代币”,以免用户误认为是原生 TON。
- 定期审计:使用 Tonkeeper 的官方 ton-assets 白名单核查代币合法性。
8 结语与下一步
至此,你已掌握 Jetton 的铸/储/提全链路逻辑、通知机制与最佳实践。
你可立刻动手:
用 tonweb 尝试发送带评论的 Jetton,
或查看👉高级 Jetton 生态示例合集开启下一程。