Εγκατάσταση
Βεβαιωθείτε ότι έχετε όλες τις απαραίτητες εξαρτήσεις:
cargo add --dev litesvm litesvm-token solana-sdk spl-token spl-associated-token-account
Βασικά στοιχεία SPL Token
Στο Solana, η δημιουργία ενός token account είναι μια διαδικασία δύο βημάτων.
Δημιουργία Mint Account
- Δεν έχει υπόλοιπο token
- Αποθηκεύει όλες τις καθολικές πληροφορίες του token, όπως η συνολική προσφορά, τα δεκαδικά ψηφία, η εξουσιοδότηση, κ.λπ.
- Υπάρχει ένα mint account ανά token
- Ο ιδιοκτήτης είναι το Token Program (TokenKeg ή Token 2022)
Δημιουργία Token Account
- Αποθηκεύει το υπόλοιπο για ένα συγκεκριμένο SPL token
- Διατηρεί αναφορά στο mint account για να ορίζει ποιο SPL token βρίσκεται σε αυτό τον λογαριασμό
- Μπορούν να υπάρχουν πολλά token accounts για ένα mint account
- Ο ιδιοκτήτης είναι αυτός που έχει τον έλεγχο των tokens εντός αυτού του λογαριασμού
Τύποι Token Accounts
Κανονικό Token Account
Ένα token account αποθηκεύει το υπόλοιπό σας για ένα συγκεκριμένο SPL token:
// Can create token accounts at ANY addresslet token_account = Keypair::new(); // Random addresslet create_ix = system_instruction::create_account(&payer.pubkey(),&token_account.pubkey(), // Any address you wantrent,165, // Token account size&spl_token::id(),);let init_ix = spl_token::instruction::initialize_account(&spl_token::id(),&token_account.pubkey(),&mint,&owner.pubkey(),)?;
✓ Πλεονεκτήματα
- •Δυνατότητα δημιουργίας πολλαπλών λογαριασμών για το ίδιο mint/owner
- •Ευέλικτο - μπορεί να χρησιμοποιηθεί οποιαδήποτε διεύθυνση
✗ Μειονεκτήματα
- •Μη ντετερμινιστικό - απαιτείται χειροκίνητη παρακολούθηση διευθύνσεων
- •Ο παραλήπτης πρέπει να σας υποδείξει ποιο λογαριασμό να χρησιμοποιήσετε για την αποστολή
- •Δημιουργεί σύγχυση με πολλαπλούς λογαριασμούς
Πότε να χρησιμοποιηθεί: Προσωρινοί/λογαριασμοί escrow, λογαριασμοί ιδιοκτησίας προγράμματος με προσαρμοσμένη λογική, όταν χρειάζεστε πολλαπλούς λογαριασμούς για το ίδιο token, προηγμένες στρατηγικές DeFi.
Associated Token Account (ATA)
Ένα ATA είναι ένα token account σε μια ντετερμινιστική διεύθυνση PDA:
// ATA address is ALWAYS the same for owner + mintlet ata = get_associated_token_address(&owner.pubkey(), &mint);// Address derived from: [owner_pubkey, token_program_id, mint]
Πώς υπολογίζεται η διεύθυνση ATA:
// ATA is a PDA owned by the Associated Token Programlet (ata, bump) = Pubkey::find_program_address(&[owner.as_ref(),spl_token::id().as_ref(),mint.as_ref(),],&spl_associated_token_account::id(), // ATA program);
✓ Πλεονεκτήματα
- •Ένας κανονικός λογαριασμός ανά ζεύγος κατόχου/mint
- •Ντετερμινιστικό - ο καθένας μπορεί να υπολογίσει τη διεύθυνση
- •Απλοποιεί τις πληρωμές - αρκεί η διεύθυνση πορτοφολιού + mint
- •Τυπική σύμβαση σε όλες τις εφαρμογές Solana
✗ Μειονεκτήματα
- •Μπορεί να υπάρχει μόνο ΕΝΑ ATA ανά ζεύγος κατόχου/mint (εκ σχεδιασμού)
Συνιστάται για τις περισσότερες περιπτώσεις: Εφαρμογές πορτοφολιού, πρωτόκολλα DeFi, διακράτηση NFT, συστήματα πληρωμών και οποιεσδήποτε μεταφορές token που αφορούν τον χρήστη.
Γρήγορο Παράδειγμα
Ακολουθεί ένα πλήρες παράδειγμα δημιουργίας token mint και έκδοσης token:
use litesvm::LiteSVM;use litesvm_token::{get_spl_account,spl_token::{native_mint::DECIMALS, state::Account as TokenAccount},CreateAccount, CreateMint, MintTo, Transfer,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_create_and_mint_tokens() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create a new SPL token mint with the payer as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&payer.pubkey()).decimals(DECIMALS).send().unwrap();// Create a token account for the payerlet token_account = CreateAccount::new(&mut svm, &payer, &mint).owner(&payer.pubkey()).send().unwrap();// Mint tokens into the payer's token accountMintTo::new(&mut svm, &payer, &mint, &token_account, 1000).owner(&payer).send().unwrap();// Verify balancelet token_account: TokenAccount = get_spl_account(&svm, &token_account).unwrap();let account_balance = token_account.amount;assert_eq!(account_balance, 1000)}
Βασικές Έννοιες
Δεκαδικά Ψηφία Token
Τα περισσότερα token χρησιμοποιούν δεκαδικά ψηφία για την αναπαράσταση κλασματικών ποσών:
// SOL has 9 decimalslet one_sol = 10_u64.pow(9); // 1_000_000_000 lamports// USDC has 6 decimalslet one_usdc = 10_u64.pow(6); // 1_000_000 micro-USDC// Always account for decimals in calculationslet amount_tokens = 100;let amount_raw = amount_tokens * 10_u64.pow(decimals as u32);
Σχέσεις Λογαριασμών
Η κατανόηση των σχέσεων μεταξύ των λογαριασμών είναι κρίσιμη:
- Λογαριασμός Mint: Ορίζει το token (προσφορά, δεκαδικά ψηφία, αρχές)
- token account: Διατηρεί token για έναν συγκεκριμένο κάτοχο
- associated token account: Ντετερμινιστικός token account για ένα ζεύγος κατόχου+mint
- Αρχή Mint: Μπορεί να δημιουργεί νέα token
- Αρχή Παγώματος: Μπορεί να παγώνει token accounts (προαιρετικό)
Αντιμετώπιση Προβλημάτων
Συνηθισμένα Σφάλματα
| Σφάλμα | Αιτία | Λύση |
|---|---|---|
AccountNotFound | Προσπάθεια χρήσης λογαριασμού που δεν υπάρχει | Βεβαιωθείτε ότι ο λογαριασμός έχει δημιουργηθεί πριν τη χρήση |
AccountAlreadyInitialized | Προσπάθεια αρχικοποίησης ενός ήδη αρχικοποιημένου λογαριασμού | Ελέγξτε αν ο λογαριασμός υπάρχει πριν τη δημιουργία |
InsufficientFunds | Ανεπαρκή lamport για rent ή token για μεταφορά | Βεβαιωθείτε για επαρκή χρηματοδότηση/έκδοση |
OwnerMismatch | Ο λογαριασμός ανήκει σε λανθασμένο πρόγραμμα | Επαληθεύστε το σωστό αναγνωριστικό προγράμματος κατά τη δημιουργία |
Is this page helpful?