Τα tokens είναι ψηφιακά περιουσιακά στοιχεία που αντιπροσωπεύουν την κυριότητα σε διάφορες κατηγορίες περιουσιακών στοιχείων. Η tokenization επιτρέπει την ψηφιοποίηση των δικαιωμάτων ιδιοκτησίας. Τα tokens στο Solana αναφέρονται ως SPL (Solana Program Library) Tokens.
Αυτή η ενότητα καλύπτει τις βασικές έννοιες του τρόπου με τον οποίο αντιπροσωπεύονται τα tokens στο Solana. Ανατρέξτε στην ενότητα SPL Token Basics για παραδείγματα κώδικα.
Βασικά σημεία
-
Τα Token Programs περιέχουν όλη τη λογική εντολών για την αλληλεπίδραση με tokens στο δίκτυο (τόσο ανταλλάξιμα όσο και μη ανταλλάξιμα).
-
Ένα Mint Account αντιπροσωπεύει ένα συγκεκριμένο token και αποθηκεύει καθολικά μεταδεδομένα σχετικά με το token, όπως η συνολική προσφορά και η αρχή έκδοσης (διεύθυνση εξουσιοδοτημένη να δημιουργεί νέες μονάδες ενός token).
-
Ένα Token Account παρακολουθεί την ατομική κυριότητα των tokens για ένα συγκεκριμένο mint account για έναν συγκεκριμένο ιδιοκτήτη.
-
Ένα Associated Token Account είναι ένα Token Account που δημιουργείται με διεύθυνση που προέρχεται από τις διευθύνσεις του ιδιοκτήτη και του mint account.
Token Programs
Το οικοσύστημα του Solana διαθέτει δύο κύρια Token Programs. Ο πηγαίος κώδικας και για τα δύο προγράμματα παρακάτω.
Token Program (Original)
- Βασική λειτουργικότητα token (mint, transfer κ.λπ.)
- Αμετάβλητο και ευρέως χρησιμοποιούμενο
Token Extension Program (Token 2022)
- Περιλαμβάνει όλες τις λειτουργίες του αρχικού Token Program
- Προσθέτει λειτουργίες μέσω "επεκτάσεων"
Το Token Program περιέχει όλη τη λογική εντολών για την αλληλεπίδραση με tokens στο δίκτυο (τόσο ανταλλάξιμα όσο και μη ανταλλάξιμα). Όλα τα tokens στο Solana είναι ουσιαστικά data accounts που ανήκουν σε ένα Token Program.
Token Program
Mint Account
Τα tokens στο Solana αναγνωρίζονται μοναδικά από τη διεύθυνση ενός Mint Account που ανήκει στο Token Program. Αυτός ο λογαριασμός λειτουργεί ως καθολικός μετρητής για ένα συγκεκριμένο token και αποθηκεύει δεδομένα όπως:
- Supply: Συνολική προσφορά του token
- Decimals: Δεκαδική ακρίβεια του token
- Mint authority: Ο λογαριασμός που έχει εξουσιοδότηση να δημιουργεί νέες μονάδες του token, αυξάνοντας την προσφορά
- Freeze authority: Ο λογαριασμός που έχει εξουσιοδότηση να παγώνει tokens σε ένα Token Account, εμποδίζοντάς τα να μεταφερθούν ή να καούν
Mint Account
Οι πλήρεις λεπτομέρειες που αποθηκεύονται σε κάθε Mint Account περιλαμβάνουν τα εξής:
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Για αναφορά, εδώ είναι ένας σύνδεσμος Solana Explorer προς το USDC Mint Account.
Token Account
Το Token Program δημιουργεί Token Accounts για να παρακολουθεί την ατομική ιδιοκτησία κάθε μονάδας token. Ένα Token Account αποθηκεύει δεδομένα όπως:
- Mint: Το token του οποίου το Token Account κατέχει μονάδες
- Owner: Ο λογαριασμός που έχει εξουσιοδότηση να μεταφέρει tokens από το Token Account
- Amount: Αριθμός των tokens που το Token Account κατέχει αυτή τη στιγμή
Token Account
Οι πλήρεις λεπτομέρειες που αποθηκεύονται σε κάθε Token Account περιλαμβάνουν τα εξής:
pub struct Account {/// The mint associated with this accountpub mint: Pubkey,/// The owner of this account.pub owner: Pubkey,/// The amount of tokens this account holds.pub amount: u64,/// If `delegate` is `Some` then `delegated_amount` represents/// the amount authorized by the delegatepub delegate: COption<Pubkey>,/// The account's statepub state: AccountState,/// If is_native.is_some, this is a native token, and the value logs the/// rent-exempt reserve. An Account is required to be rent-exempt, so/// the value is used by the Processor to ensure that wrapped SOL/// accounts do not drop below this threshold.pub is_native: COption<u64>,/// The amount delegatedpub delegated_amount: u64,/// Optional authority to close the account.pub close_authority: COption<Pubkey>,}
Ένα πορτοφόλι χρειάζεται ένα token account για κάθε token (mint) που θέλει να κατέχει, με τη διεύθυνση του πορτοφολιού να ορίζεται ως ιδιοκτήτης του token account. Κάθε πορτοφόλι μπορεί να κατέχει πολλαπλά token accounts για το ίδιο token (mint), αλλά ένα token account μπορεί να έχει μόνο έναν ιδιοκτήτη και να κατέχει μονάδες ενός token (mint).
Account Relationship
Σημειώστε ότι τα δεδομένα κάθε Token Account περιλαμβάνουν ένα πεδίο owner που
προσδιορίζει ποιος έχει εξουσία πάνω στο Token Account. Αυτό διαφέρει από τον
ιδιοκτήτη προγράμματος που καθορίζεται στον βασικό τύπο
Account, ο οποίος είναι το Token Program για
όλα τα Token Accounts.
Associated Token Account
Οι Associated Token Accounts απλοποιούν τη διαδικασία εύρεσης της διεύθυνσης ενός token account για ένα συγκεκριμένο mint και ιδιοκτήτη. Σκεφτείτε τον Associated Token Account ως τον "προεπιλεγμένο" token account για ένα συγκεκριμένο mint και ιδιοκτήτη.
Ένας Associated Token Account δημιουργείται με μια διεύθυνση που προέρχεται από τη διεύθυνση του ιδιοκτήτη και τη διεύθυνση του mint account. Είναι σημαντικό να κατανοήσετε ότι ένας Associated Token Account είναι απλώς ένας token account με μια συγκεκριμένη διεύθυνση.
Αυτό εισάγει μια βασική έννοια στην ανάπτυξη Solana: το Program Derived Address (PDA). Ένα PDA παράγει μια διεύθυνση ντετερμινιστικά χρησιμοποιώντας προκαθορισμένες εισόδους, διευκολύνοντας την εύρεση της διεύθυνσης ενός λογαριασμού.
Associated Token Account
Σημειώστε ότι κάθε πορτοφόλι χρειάζεται το δικό του token account για να κατέχει tokens από το ίδιο mint.
Επεκταμένη σχέση λογαριασμών
Παραδείγματα Token CLI
Το spl-token CLI σας βοηθά να πειραματιστείτε με SPL tokens. Τα παρακάτω
παραδείγματα χρησιμοποιούν το τερματικό του
Solana Playground για να εκτελέσουν εντολές CLI
απευθείας στο πρόγραμμα περιήγησης χωρίς τοπική εγκατάσταση.
Η δημιουργία tokens και λογαριασμών απαιτεί SOL για καταθέσεις rent λογαριασμών
και τέλη συναλλαγών. Για χρήστες Solana Playground που το χρησιμοποιούν για
πρώτη φορά, δημιουργήστε ένα πορτοφόλι Playground και εκτελέστε την εντολή
solana airdrop στο τερματικό Playground. Μπορείτε επίσης να λάβετε devnet
SOL από τη δημόσια web faucet.
$solana airdrop 2
Εκτελέστε spl-token --help για να δείτε όλες τις διαθέσιμες εντολές.
$spl-token --help
Για να εγκαταστήσετε το spl-token CLI τοπικά, εκτελέστε:
$cargo install spl-token-cli
Βρείτε περισσότερα παραδείγματα στην
τεκμηρίωση του spl-token.
Οι διευθύνσεις λογαριασμών που εμφανίζονται στην έξοδο του τερματικού σας
διαφέρουν από τα παρακάτω παραδείγματα. Χρησιμοποιήστε τις διευθύνσεις από το
τερματικό Playground σας όταν ακολουθείτε. Για παράδειγμα, η εντολή
create-token εξάγει μια διεύθυνση mint account με το πορτοφόλι Playground
σας ως mint authority.
Δημιουργία νέου token
Για να δημιουργήσετε ένα νέο token (mint account), εκτελέστε:
$spl-token create-token
Η έξοδος μοιάζει με:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Ένας νέος mint account ξεκινά με μηδενική προσφορά. Ελέγξτε την τρέχουσα προσφορά με:
$spl-token supply <TOKEN_ADDRESS>
Η εντολή supply για ένα νέο token επιστρέφει 0:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Η δημιουργία ενός νέου Mint Account απαιτεί μια συναλλαγή με δύο οδηγίες. Ακολουθεί ένα παράδειγμα σε Javascript στο Solana Playground.
-
Το System Program δημιουργεί έναν νέο λογαριασμό με χώρο για τα δεδομένα του Mint Account και μεταφέρει την ιδιοκτησία στο Token Program.
-
Το Token Program αρχικοποιεί τα δεδομένα του νέου λογαριασμού ως Mint Account
Δημιουργία token account
Για να κρατήσετε tokens ενός συγκεκριμένου mint, δημιουργήστε ένα token account:
$spl-token create-account <TOKEN_ADDRESS>
Παράδειγμα εντολής:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Έξοδος:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Η εντολή create-account δημιουργεί ένα associated token account με τη
διεύθυνση του πορτοφολιού σας ως κάτοχο.
Για να δημιουργήσετε ένα token account με διαφορετικό κάτοχο:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Σημείωση: το <TOKEN_ADDRESS> καθορίζει τον mint account για το token account.
Παράδειγμα εντολής:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Έξοδος:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Η δημιουργία ενός Associated Token Account απαιτεί μία εντολή που καλεί το Associated Token Program. Εδώ είναι ένα παράδειγμα Javascript στο Solana Playground.
Το Associated Token Program χρησιμοποιεί Cross Program Invocations για να:
- Καλέσει το System Program για να δημιουργήσει έναν νέο λογαριασμό χρησιμοποιώντας το παρεχόμενο PDA ως διεύθυνση
- Καλέσει το Token Program για να αρχικοποιήσει τα δεδομένα του Token Account
Για να δημιουργήσετε ένα νέο Token Account με ένα νέο keypair αντί για μια διεύθυνση Associated Token Account, στείλτε μια συναλλαγή με δύο εντολές. Εδώ είναι ένα παράδειγμα Javascript στο Solana Playground.
-
Το System Program δημιουργεί έναν νέο λογαριασμό με χώρο για τα δεδομένα του Token Account και μεταφέρει την ιδιοκτησία στο Token Program.
-
Το Token Program αρχικοποιεί τα δεδομένα ως Token Account
Έκδοση tokens
Για να δημιουργήσετε νέες μονάδες ενός token, εκδώστε tokens σε ένα Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Παράδειγμα εντολής:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Έξοδος:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Για να εκδώσετε tokens σε διαφορετικό token account:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Έξοδος:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Η εντολή MintTo στο Token Program δημιουργεί νέα tokens. Η αρχή έκδοσης
πρέπει να υπογράψει τη συναλλαγή. Η εντολή εκδίδει tokens σε ένα Token Account
και αυξάνει τη συνολική προσφορά στο Mint Account. Εδώ είναι ένα παράδειγμα
Javascript στο
Solana Playground.
Μεταφορά tokens
Για να μεταφέρετε tokens μεταξύ token accounts:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Παράδειγμα εντολής:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Έξοδος:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Η εντολή Transfer στο Token Program διαχειρίζεται τις μεταφορές tokens. Ο
κάτοχος του Token Account του αποστολέα πρέπει να υπογράψει τη συναλλαγή. Η
εντολή μετακινεί tokens μεταξύ Token Accounts. Ακολουθεί ένα παράδειγμα σε
Javascript στο
Solana Playground.
Τόσο ο αποστολέας όσο και ο παραλήπτης χρειάζονται token accounts για το συγκεκριμένο token (mint). Ο αποστολέας μπορεί να συμπεριλάβει εντολές για τη δημιουργία του token account του παραλήπτη στην ίδια συναλλαγή.
Δημιουργία Token Metadata
Το Token Extensions Program σας επιτρέπει να αποθηκεύετε metadata (όνομα, σύμβολο, σύνδεσμο εικόνας) απευθείας στο Mint Account.
Για να δημιουργήσετε ένα token με επέκταση metadata:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Έξοδος:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
Για να αρχικοποιήσετε τα metadata:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
Το token URI συνδέεται με off-chain metadata. Δείτε ένα παράδειγμα μορφής JSON εδώ.
Παράδειγμα εντολής:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Δείτε τα metadata στο Solana Explorer.
Μάθετε περισσότερα στον οδηγό Metadata Extension. Για λεπτομέρειες σχετικά με τα Token Extensions, δείτε τον οδηγό Getting Started για τα Token Extensions και την τεκμηρίωση SPL.
Is this page helpful?