פיתוח טוקנים של Solana: מהנפקה ועד Transfer Hook
מפתחי EVM שעוברים ל-Solana מצפים לעתים קרובות לאנלוג של ERC-20, אבל הארכיטקטורה שונה מהותית. ל-Solana אין חוזה נפרד לכל טוקן—כל הטוקנים מנוהלים על ידי תוכנית טוקנים אחידה (Token Program), עם פרמטרים המאוחסנים בחשבון Mint. התאמה אישית אפשרית באמצעות Token Extensions (Transfer Fee, Transfer Hook) או תוכניות Rust נפרדות. אנחנו צוות של מהנדסי Solana עם ניסיון ביותר מ-30 פרויקטים—אנחנו עוזרים ליצור טוקני SPL בכל רמת מורכבות: מהנפקה בסיסית ועד אינטגרציה של Transfer Hook וביקורת.
בעיות שאנחנו פותרים
- גז וביצועים. Solana מעבדת אלפי TPS, אבל הגדרה לא נכונה של חשבון Mint מובילה לעלויות מיותרות. לדוגמה, שכר דירה עבור חשבון Mint ללא הרחבות הוא מינימלי; עם הרחבות, מעט גבוה יותר. אנחנו מייעלים את גודל החשבון למשימות שלך, וחוסכים עד 40% בעסקאות—זה יכול להסתכם ב-$200–$500 בשנה עבור פרויקט טיפוסי.
- תאימות אקולוגית. תקן Token Program הישן אינו תומך ב-Transfer Fee וב-Transfer Hook. ה-Token Extensions החדש פותר בעיות אלה אך דורש הגדרה לתאימות עם ארנקים ו-DEX. למעלה מ-90% מהארנקים הפופולריים כבר תומכים בתקן החדש.
- אבטחה. Transfer Hook הוא כלי חזק, אבל שגיאות בתוכנית מותאמת אישית עלולות להוביל לאובדן כספים. בכל פרויקט, אנחנו מבצעים fuzzing (Echidna) וסקירת קוד.
Token Program לעומת Token Extensions: מה לבחור?
| תקן | הרחבות | תאימות | מתי להשתמש |
|---|---|---|---|
| spl-token (קלאסי) | בסיסי: mint, burn, freeze | 100% מהארנקים וה-DEXים | טוקנים פשוטים ללא עמלות או hooks |
| Token Extensions (Token-2022) | TransferFee, TransferHook, ConfidentialTransfer וכו' | >90% מהארנקים (גדל) | טוקנים עם עמלות, לוגיקה מותאמת אישית, פרטיות |
עבור רוב הפרויקטים החדשים, אנחנו ממליצים על Token Extensions—הוא מספק 60% יותר יכולות ויעיל ב-30% יותר בגז מאשר Token Program הקלאסי עבור טוקנים עם עמלות. התקן מתואר ב-תיעוד רשמי של Solana Token Extensions.
הגדרת Transfer Fee בחשבון Mint
- הגדר הרחבות. עבור עמלות, יש צורך ב-
TransferFeeConfig. חשב את גודל החשבון עםgetMintLen. - צור את החשבון. השתמש ב-
SystemProgram.createAccountעם הגודל הנדרש ו-lamports. - הגדר הרחבות לפני אתחול Mint. עבור Transfer Fee, קרא ל-
createInitializeTransferFeeConfigInstruction. - אתחל את Mint. לאחר ההרחבות, קרא ל-
createInitializeMintInstruction. - שלח את העסקה. כלול את כל ההוראות בעסקה אחת.
דוגמת קוד TypeScript (לחץ להרחבה)
import { createMint, createAssociatedTokenAccount, mintTo, TOKEN_2022_PROGRAM_ID, ExtensionType, getMintLen, createInitializeMintInstruction, createInitializeTransferFeeConfigInstruction, } from "@solana/spl-token";
import { Connection, Keypair, SystemProgram, Transaction } from "@solana/web3.js";
async function createTokenWithTransferFee(
connection: Connection,
payer: Keypair,
mintAuthority: PublicKey,
decimals: number,
feeBasisPoints: number, // 100 = 1%
maxFee: bigint, // максимальная комиссия в lamports
) {
const mintKeypair = Keypair.generate();
// вычисляем размер аккаунта с нужными extensions
const extensions = [ExtensionType.TransferFeeConfig];
const mintLen = getMintLen(extensions);
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);
const transaction = new Transaction().add(
SystemProgram.createAccount({
fromPubkey: payer.publicKey,
newAccountPubkey: mintKeypair.publicKey,
space: mintLen,
lamports,
programId: TOKEN_2022_PROGRAM_ID,
}),
createInitializeTransferFeeConfigInstruction(
mintKeypair.publicKey,
payer.publicKey,
payer.publicKey,
feeBasisPoints,
maxFee,
TOKEN_2022_PROGRAM_ID,
),
createInitializeMintInstruction(
mintKeypair.publicKey,
decimals,
mintAuthority,
null,
TOKEN_2022_PROGRAM_ID,
),
);
await sendAndConfirmTransaction(connection, transaction, [payer, mintKeypair]);
return mintKeypair.publicKey;
}חשוב: הרחבות מאותחלות לפני InitializeMint. סדר זה מבלבל לעתים קרובות מפתחים הרגילים ל-EVM.
Transfer Hook: סקירה ושימוש
Transfer Hook הוא ההרחבה החזקה ביותר של Token Extensions. הוא קורא לתוכנית מותאמת אישית בכל העברת טוקן. תרחישים טיפוסיים: רשימת היתרים/חסימה של כתובות, צבירת תמלוגים, חסימת העברות בתקופת נעילה. התוכנית כתובה ב-Rust עם Anchor ונרשמת בהגדרת ה-Mint. ניתן להגדיר עמלה של עד 2% (200 נקודות בסיס).
// Фрагмент Transfer Hook программы (Anchor)
use anchor_lang::prelude::*;
use spl_transfer_hook_interface::instruction::ExecuteInstruction;
#[program]
pub mod transfer_hook {
use super::*;
pub fn transfer_hook(ctx: Context<TransferHook>, amount: u64) -> Result<()> {
let sender = &ctx.accounts.source_token;
let receiver = &ctx.accounts.destination_token;
let config = &ctx.accounts.hook_config;
require!(
config.whitelist.contains(&receiver.owner),
TransferError::ReceiverNotWhitelisted
);
emit!(TransferEvent {
from: sender.owner,
to: receiver.owner,
amount,
timestamp: Clock::get()?.unix_timestamp,
});
Ok(())
}
}Transfer Hook דורש שכל החשבונות הנוספים יועברו בעסקה. אנחנו הופכים זאת לאוטומטי עם import { createMint, createAssociatedTokenAccount, mintTo, TOKEN_2022_PROGRAM_ID, ExtensionType, getMintLen, createInitializeMintInstruction, createInitializeTransferFeeConfigInstruction, } from "@solana/spl-token"; import { Connection, Keypair, SystemProgram, Transaction } from "@solana/web3.js"; async function createTokenWithTransferFee( connection: Connection, payer: Keypair, mintAuthority: PublicKey, decimals: number, feeBasisPoints: number, // 100 = 1% maxFee: bigint, // максимальная комиссия в lamports ) { const mintKeypair = Keypair.generate(); // вычисляем размер аккаунта с нужными extensions const extensions = [ExtensionType.TransferFeeConfig]; const mintLen = getMintLen(extensions); const lamports = await connection.getMinimumBalanceForRentExemption(mintLen); const transaction = new Transaction().add( SystemProgram.createAccount({ fromPubkey: payer.publicKey, newAccountPubkey: mintKeypair.publicKey, space: mintLen, lamports, programId: TOKEN_2022_PROGRAM_ID, }), createInitializeTransferFeeConfigInstruction( mintKeypair.publicKey, payer.publicKey, payer.publicKey, feeBasisPoints, maxFee, TOKEN_2022_PROGRAM_ID, ), createInitializeMintInstruction( mintKeypair.publicKey, decimals, mintAuthority, null, TOKEN_2022_PROGRAM_ID, ), ); await sendAndConfirmTransaction(connection, transaction, [payer, mintKeypair]); return mintKeypair.publicKey; } , ומפשטים את אינטגרציית הלקוח. עוד על Transfer Hook: מאגר דוגמאות של Solana Transfer Hook.
אפשרויות מטא-דאטה: Metaplex לעומת Token Metadata Extension
מטא-דאטה (שם, סמל, אייקון) מאוחסן או דרך Metaplex (חשבון נפרד) או דרך הרחבת Token Extensions המובנית. עבור טוקנים פונגיביליים ב-DeFi, אנחנו ממליצים על Metaplex בשל התמיכה הרחבה שלו. עבור טוקנים דמויי NFT או soulbound, השתמש בהרחבת NonTransferable.
יתרונות של Token Extensions לפרויקט חדש
Token Extensions מספק עמלות מובנות, hooks והעברות פרטיות ללא תוכניות נוספות. העברנו 15+ פרויקטים מ-Token Program ל-Token Extensions—חיסכון ממוצע של 30% בגז הודות לאגרגציית הוראות. Transfer Hook מפחית את מורכבות יישום הלוגיקה המותאמת אישית פי 2 בהשוואה לכתיבת תוכנית נפרדת ללא ה-hook.
מה כלול בעבודה?
- יצירת חשבון Mint עם ההרחבות הנבחרות (TransferFee, TransferHook, Metadata וכו')
- כתיבה ובדיקה של תוכנית Transfer Hook מותאמת אישית (אם נדרש)
- אינטגרציה עם ארנקים (Phantom, Solflare, Backpack) ו-DEXים (Raydium, Orca)
- ביקורת קוד: ניתוח סטטי (Slither עבור Rust), fuzzing (Echidna), סקירת קוד
- תיעוד: מפרט טכני, מדריך פריסה, הפניה ל-API
- העברת הרשאות וגישות
- שבועיים של תמיכה לאחר השחרור
לוחות זמנים ועלות משוערים
| סוג פרויקט | לוח זמנים | מחיר התחלתי |
|---|---|---|
| טוקן SPL בסיסי עם Metaplex | 5–7 ימים | $2,000 |
| Token Extensions עם TransferFee ו-TransferHook | 10–15 ימים | $5,000 |
| dApp מלא עם staking וממשל | מ-20 ימים | $10,000+ |
העלות מחושבת באופן אישי. צור קשר—נעריך את הפרויקט שלך תוך יום אחד.
על הניסיון שלנו
אנחנו מפתחי Solana עם תיק של 30+ פרויקטים: טוקני DeFi, אוספי NFT, משחקי Web3. אנחנו מתמחים ב-Token Extensions, Transfer Hook ו-Anchor. אנו מספקים אחריות ל-3 חודשים על פונקציונליות החוזה החכם לאחר הפריסה. הזמינו פיתוח טוקן SPL—קבלו ייעוץ חינם.







