הבנת הארכיטקטורה של Jetton Token ב-TON
עם ניסיון של למעלה מ-5 שנים בבלוקצ'יין TON ויותר מ-20 פרויקטים שהושקו, אנו מספקים פיתוח מקצועי של טוקני TON. כאשר מעבירים פרויקט מ-Ethereum ל-TON, רבים נתקלים בבעיה: טוקנים ב-TON לא עובדים, למרות שקוד ה-Solidity נראה ללא דופי. הבעיה אינה בשפה—ההבדל הוא ביסוד. TON משתמש ב-sharding, והטוקנים כאן בנויים אחרת: לא חוזה אחד עם מיפוי של יתרות, אלא מערכת של שני חוזים. טוקן Jetton הוא תקן TEP-74, המיועד לסקלביליות. במשך למעלה מ-5 שנות עבודה, השקנו יותר מ-20 פרויקטים כאלה ואנו מכירים את כל המלכודות. אנו נעריך את הפרויקט שלכם בחינם—פשוט כתבו לנו.
לדוגמה, פריסה בסיסית של טוקן Jetton עולה $2,000 וחוסכת עד 30% בעמלות גז בהשוואה לחוזים לא אופטימליים. Jetton הוא פי 10 יותר סקלבילי מ-ERC-20, מה שהופך אותו לאידיאלי עבור יישומים עם תפוקה גבוהה.
איך עובד טוקן Jetton מבחינה מכנית?
Jetton הוא תקן TEP-74, אנלוגי ל-ERC-20 אך עם ארכיטקטורה שונה מהותית—טוב פי 10 לסקלביליות בסביבות sharded. ב-TON, כל מחזיק טוקן מקבל חוזה ארנק משלו (Jetton Wallet), בעוד שהלוגיקה המשותפת (minting, מטא-דאטה) מאוחסנת בחוזה מרכזי (Jetton Master). זה מבטיח עסקאות מקומיות בתוך shards—העברה בין שני ארנקים אינה דורשת אינטראקציה בין-shards, מה שנותן שיפור ביצועים פי 10 בהשוואה ל-ERC-20 בעומס גבוה. כל פעולת העברה דורשת שליחת TON עבור גז: העלות האופיינית היא 0.05–0.1 TON, ולנמענים חדשים עד 0.15 TON כולל עמלות אחסון. הודות לאופטימיזציית גז, אנו משיגים חיסכון של עד 30% בהשוואה לחוזים לא אופטימליים.
ארכיטקטורה: Jetton Master ו-Jetton Wallet
Jetton Master — חוזה אחד לכל טוקן. הוא מאחסן מטא-דאטה (שם, סמל, decimals, totalSupply), לוגיקת minting, ורשימה של ארנקים רשומים. הוא אינו מאחסן יתרות—הוא לא יודע אותן.
Jetton Wallet — חוזה נפרד לכל כתובת. הוא נפרס אוטומטית כאשר טוקנים נשלחים לראשונה לכתובת. הוא מאחסן את היתרה של המשתמש ומעבד העברות.
תהליך עבודה:
Alice → (transfer) → Alice's Jetton Wallet
Alice's Jetton Wallet → (internal message) → Bob's Jetton Wallet
Bob's Jetton Wallet: принимает токены, увеличивает баланс דוגמת חוזה ב-Tact
Tact היא שפה ברמה גבוהה עבור TON, המועדפת על פני FunC. להלן דוגמה מלאה ליישום של Jetton Master ו-Jetton Wallet בחוזה אחד:
import "@stdlib/jetton";
message(0x178d4519) TokenTransferInternal {
queryId: Int as uint64;
amount: Int as coins;
from: Address;
responseAddress: Address?;
forwardTonAmount: Int as coins;
forwardPayload: Slice as remaining;
}
contract JettonMaster with Jetton {
totalSupply: Int as coins = 0;
owner: Address;
jettonContent: Cell;
mintable: Bool;
init(owner: Address, content: Cell) {
self.owner = owner;
self.jettonContent = content;
self.mintable = true;
}
receive(msg: JettonMint) {
require(sender() == self.owner, "Only owner can mint");
require(self.mintable, "Minting disabled");
self.totalSupply += msg.amount;
let initData: StateInit = self.getJettonWalletInit(msg.receiver);
let walletAddress: Address = contractAddress(initData);
send(SendParameters{
to: walletAddress,
body: TokenTransferInternal{
queryId: msg.queryId,
amount: msg.amount,
from: myAddress(),
responseAddress: msg.responseAddress,
forwardTonAmount: msg.forwardTonAmount,
forwardPayload: emptySlice(),
}.toCell(),
value: msg.tonAmount,
mode: SendIgnoreErrors,
code: initData.code,
data: initData.data,
});
}
fun getJettonWalletInit(owner: Address): StateInit {
return initOf JettonWallet(owner, myAddress());
}
}
contract JettonWallet with JettonWallet {
balance: Int as coins = 0;
owner: Address;
jettonMaster: Address;
init(owner: Address, jettonMaster: Address) {
self.owner = owner;
self.jettonMaster = jettonMaster;
}
receive(msg: TokenTransfer) {
require(sender() == self.owner, "Not owner");
require(msg.amount > 0, "Zero amount");
require(self.balance >= msg.amount, "Insufficient balance");
self.balance -= msg.amount;
let receiverWalletInit: StateInit = initOf JettonWallet(msg.destination, self.jettonMaster);
let receiverWallet: Address = contractAddress(receiverWalletInit);
send(SendParameters{
to: receiverWallet,
value: msg.forwardTonAmount + context().readForwardFee() * 2,
mode: SendIgnoreErrors,
body: TokenTransferInternal{
queryId: msg.queryId,
amount: msg.amount,
from: self.owner,
responseAddress: msg.responseAddress,
forwardTonAmount: msg.forwardTonAmount,
forwardPayload: msg.forwardPayload,
}.toCell(),
code: receiverWalletInit.code,
data: receiverWalletInit.data,
});
}
} השוואה: Jetton מול ERC-20
| פרמטר | Jetton (TON) | ERC-20 (Ethereum) |
|---|---|---|
| ארכיטקטורה | שתי שכבות: Master + Wallet | חוזה יחיד עם מיפוי |
| סקלביליות | Sharding, אופקית (טוב פי 10) | חוט יחיד, מגבלת גז |
| עלות העברה | 0.05–0.1 TON (~$0.05) | ~$1-5 בעומס |
| אבטחה | מנגנון Bounce | הגנת Reentrancy |
| אופטימיזציית גז | Bounce מובנה | דורש טיפול מפורש |
שלבי פיתוח טוקן Jetton
| שלב | משך | תיאור |
|---|---|---|
| ניתוח ועיצוב | יום אחד | הגדרת פרמטרי טוקן, ארכיטקטורה |
| כתיבת חוזים ב-Tact | 2-4 ימים | Master, Wallet, בדיקות |
| ביקורת ואופטימיזציית גז | 1-2 ימים | Slither, Mythril, אימות פורמלי לחוזי TON |
| פריסה ואימות | 0.5 יום | Testnet → Mainnet, אימות ב-explorer; כולל פריסת טוקן מלאה |
| תמיכה | 30 ימים | תיקוני באגים, שדרוגים |
פריסת טוקן Jetton
- הגדרת פרמטרי טוקן (שם, סמל, decimals, totalSupply, mintable).
- כתיבת חוזי Master ו-Wallet ב-Tact (או התאמת התבנית שלנו).
- בדיקה על ה-TON testnet באמצעות Tenderly או מקומית דרך TON Sandbox.
- ביצוע ביקורת אבטחה (אנו משתמשים ב-Slither ו-Mythril; אימות פורמלי אפשרי גם כן).
- פריסה ל-mainnet ואימות החוזה ב-explorer.
אופטימיזציית גז ואבטחה
הפחתת עלויות עסקאות
ב-TON, כל פעולה דורשת שליחת TON עבור גז. בעת העברה, יש לשלוח מספיק כדי לכסות: גז הארנק של השולח, גז הארנק של הנמען (כולל פריסה אם חדש), ו-forwardAmount אופציונלי עבור הודעה. עלות אופיינית: 0.05–0.1 TON לפעולה. לנמענים חדשים, עד 0.15 TON כולל עמלות אחסון. הודות לאופטימיזציית גז, אנו משיגים חיסכון של עד 30% בהשוואה לחוזים לא אופטימליים. אנו שמים דגש על אבטחת חוזים עם ביקורות קבועות ואימות פורמלי.
סיכונים בטיפול ב-Bounce
טיפול ב-Bounce הוא חובה. אם עסקה נכשלת (לדוגמה, גז לא מספיק), TON מחזיר את ההודעה לשולח. Jetton Wallet חייב לעבד את ההודעה המוחזרת ולשחזר את היתרה:
bounced(msg: bounced<TokenTransferInternal>) { self.balance += msg.amount; } ללא מטפל זה, היתרה של השולח אובדת לנצח. זו אחת הטעויות הנפוצות ביותר בסביבת ייצור.
מה כלול בחבילת הפיתוח
- עיצוב ארכיטקטורה ומפרט טכני
- קוד חוזה מלא ב-Tact עם בדיקות יחידה
- אופטימיזציית גז (במטרה להפחית עלויות ב-30%)
- אינטגרציה עם TON Connect 2.0 לתאימות ארנקים
- פריסה על testnet ו-mainnet
- תיעוד פריסה והדרכה לצוות
- 30 ימים של תיקוני באגים ותמיכה בחינם
עלות פיתוח אופיינית נעה בין $2,000 ל-$5,000, תלוי במורכבות.
הבטחות ותמיכה
אנו מספקים הבטחה כתובה לאבטחה: אם החוזה נפרץ עקב שגיאת קוד, אנו נתקן אותו בחינם תוך 30 ימים. הפיתוח כולל: תיעוד ארכיטקטוני, קוד חוזה מלא עם בדיקות, אינטגרציה עם TON Connect 2.0, והוראות פריסה. תארו את הפרויקט שלכם—אנו נעריך זמנים ועלויות. הזמינו פיתוח טוקן Jetton מאנשי מקצוע.







