Τεκμηρίωση SolanaLiteSVMRustΕπιπλέον Κιβώτιαlitesvm-token

Γρήγορη Εκκίνηση

Εγκατάσταση

Βεβαιωθείτε ότι έχετε όλες τις απαραίτητες εξαρτήσεις:

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 address
let token_account = Keypair::new(); // Random address
let create_ix = system_instruction::create_account(
&payer.pubkey(),
&token_account.pubkey(), // Any address you want
rent,
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 + mint
let 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 Program
let (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 it
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();
// Create a new SPL token mint with the payer as the mint authority
let mint = CreateMint::new(&mut svm, &payer)
.authority(&payer.pubkey())
.decimals(DECIMALS)
.send()
.unwrap();
// Create a token account for the payer
let token_account = CreateAccount::new(&mut svm, &payer, &mint)
.owner(&payer.pubkey())
.send()
.unwrap();
// Mint tokens into the payer's token account
MintTo::new(&mut svm, &payer, &mint, &token_account, 1000)
.owner(&payer)
.send()
.unwrap();
// Verify balance
let 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 decimals
let one_sol = 10_u64.pow(9); // 1_000_000_000 lamports
// USDC has 6 decimals
let one_usdc = 10_u64.pow(6); // 1_000_000 micro-USDC
// Always account for decimals in calculations
let 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?

© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.