Token su Solana
I token sono asset digitali che rappresentano la proprietà di diverse categorie di beni. La tokenizzazione permette la digitalizzazione dei diritti di proprietà. I token su Solana sono chiamati SPL (Solana Program Library) Token.
Questa sezione copre i concetti base di come i token sono rappresentati su Solana. Consulta la sezione Nozioni base sui token SPL per esempi di codice.
Punti chiave
-
I Token Program contengono tutta la logica di istruzione per interagire con i token sulla rete (sia fungibili che non fungibili).
-
Un mint account rappresenta un token specifico e memorizza i metadati globali sul token come la fornitura totale e l'autorità di conio (indirizzo autorizzato a creare nuove unità di un token).
-
Un token account tiene traccia della proprietà individuale dei token per un mint account specifico per un proprietario specifico.
-
Un associated token account è un token account creato con un indirizzo derivato dagli indirizzi del proprietario e del mint account.
Token Programs
L'ecosistema Solana ha due Token Program principali. Il codice sorgente per entrambi i programmi è disponibile qui sotto.
Token Program (Originale)
- Funzionalità token di base (conio, trasferimento, ecc.)
- Immutabile e ampiamente utilizzato
Token Extension Program (Token 2022)
- Include tutte le funzionalità del Token Program originale
- Aggiunge funzionalità tramite "estensioni"
I Token Program contengono tutta la logica di istruzione per interagire con i token sulla rete (sia fungibili che non fungibili). Tutti i token su Solana sono effettivamente account di dati posseduti da un Token Program.
Token Program
Mint Account
I token su Solana sono identificati in modo univoco dall'indirizzo di un Mint Account posseduto dal Token Program. Questo account funge da contatore globale per un token specifico e memorizza dati come:
- Supply: Offerta totale del token
- Decimals: Precisione decimale del token
- Mint authority: L'account autorizzato a creare nuove unità del token, aumentando l'offerta
- Freeze authority: L'account autorizzato a congelare i token in un Token Account, impedendone il trasferimento o la distruzione
Mint Account
I dettagli completi memorizzati su ogni Mint Account includono quanto segue:
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>,}
Come riferimento, ecco un link a Solana Explorer per il USDC Mint Account.
Token Account
Il Token Program crea Token Accounts per tracciare la proprietà individuale di ogni unità di token. Un Token Account memorizza dati come:
- Mint: Il token di cui il Token Account detiene unità
- Owner: L'account autorizzato a trasferire token dal Token Account
- Amount: Numero di token che il Token Account detiene attualmente
Token Account
I dettagli completi memorizzati su ogni Token Account includono quanto segue:
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>,}
Un wallet necessita di un token account per ogni token (mint) che desidera detenere, con l'indirizzo del wallet impostato come proprietario del token account. Ogni wallet può possedere più token account per lo stesso token (mint), ma un token account può avere un solo proprietario e detenere unità di un solo token (mint).
Account Relationship
Nota che i dati di ogni Token Account includono un campo owner
che identifica
chi ha autorità sul Token Account. Questo differisce dal proprietario del
programma specificato nel tipo Account di
base, che è il Token Program per tutti i Token Account.
Associated Token Account
Gli Associated Token Account semplificano il processo di ricerca dell'indirizzo di un token account per uno specifico mint e proprietario. Pensa all'Associated Token Account come al token account "predefinito" per uno specifico mint e proprietario.
Un Associated Token Account viene creato con un indirizzo derivato dall'indirizzo del proprietario e dall'indirizzo del mint account. È importante capire che un Associated Token Account è semplicemente un token account con un indirizzo specifico.
Questo introduce un concetto chiave nello sviluppo su Solana: Program Derived Address (PDA). Un PDA deriva un indirizzo in modo deterministico utilizzando input predefiniti, rendendo facile trovare l'indirizzo di un account.
Associated Token Account
Nota che ogni wallet necessita del proprio token account per detenere token dello stesso mint.
Relazione tra Account Espansa
Esempi di Token CLI
La CLI spl-token
ti aiuta a sperimentare con i token SPL. Gli esempi
seguenti utilizzano il terminale di Solana Playground
per eseguire comandi CLI direttamente nel browser senza installazione locale.
La creazione di token e account richiede SOL per i depositi di rent degli
account e le commissioni di transazione. Per i nuovi utenti di Solana
Playground, crea un wallet Playground e esegui il comando solana airdrop
nel terminale Playground. Puoi anche ottenere SOL devnet dal
web faucet pubblico.
$solana airdrop 2
Esegui spl-token --help
per vedere tutti i comandi disponibili.
$spl-token --help
Per installare la CLI spl-token
localmente, esegui:
$cargo install spl-token-cli
Trova altri esempi nella
documentazione di spl-token
.
Gli indirizzi degli account mostrati nell'output del tuo terminale differiscono
dagli esempi sottostanti. Usa gli indirizzi dal tuo terminale Playground quando
segui il tutorial. Ad esempio, il comando create-token
produce un
indirizzo di mint account con il tuo wallet Playground come mint authority.
Creare un nuovo token
Per creare un nuovo token (mint account), esegui:
$spl-token create-token
L'output sarà simile a:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Un nuovo mint account inizia con una fornitura pari a zero. Controlla la fornitura attuale con:
$spl-token supply <TOKEN_ADDRESS>
Il comando supply
per un nuovo token restituisce 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
La creazione di un nuovo mint account richiede una transazione con due istruzioni. Ecco un esempio in Javascript su Solana Playground.
-
Il System Program crea un nuovo account con spazio per i dati del mint account e trasferisce la proprietà al Token Program.
-
Il Token Program inizializza i dati del nuovo account come mint account
Creare un token account
Per detenere token di uno specifico mint, crea un token account:
$spl-token create-account <TOKEN_ADDRESS>
Esempio di comando:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Output:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Il comando create-account
crea un associated token account con il tuo
indirizzo di wallet come proprietario.
Per creare un token account con un proprietario diverso:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Nota: <TOKEN_ADDRESS>
specifica il mint account per il token account.
Esempio di comando:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Output:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
La creazione di un associated token account richiede un'istruzione che invoca l' Associated Token Program. Ecco un esempio in Javascript su Solana Playground.
L'Associated Token Program utilizza Cross Program Invocations per:
- Invocare il System Program per creare un nuovo account utilizzando il PDA fornito come indirizzo
- Invocare il Token Program per inizializzare i dati del token account
Per creare un nuovo Token Account con un nuovo keypair invece di un indirizzo Associated Token Account, invia una transazione con due istruzioni. Ecco un esempio in Javascript su Solana Playground.
-
Il System Program crea un nuovo account con spazio per i dati del Token Account e trasferisce la proprietà al Token Program.
-
Il Token Program inizializza i dati come Token Account
Coniare token
Per creare nuove unità di un token, conia token in un Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Esempio di comando:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Output:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Per coniare token in un token account diverso:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Output:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
L'istruzione MintTo
sul Token Program crea nuovi token. L'autorità di
conio deve firmare la transazione. L'istruzione conia token in un Token Account
e aumenta la fornitura totale sul Mint Account. Ecco un esempio in Javascript su
Solana Playground.
Trasferire token
Per trasferire token tra token account:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Esempio di comando:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Output:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
L'istruzione Transfer
sul Token Program gestisce i trasferimenti di token.
Il proprietario del Token Account del mittente deve firmare la transazione.
L'istruzione sposta token tra Token Account. Ecco un esempio in Javascript su
Solana Playground.
Sia il mittente che il destinatario necessitano di token account per lo specifico token (mint). Il mittente può includere istruzioni per creare il token account del destinatario nella stessa transazione.
Creare metadati del token
Il Token Extensions Program ti permette di memorizzare metadati (nome, simbolo, link all'immagine) direttamente sul Mint Account.
Per creare un token con l'estensione metadata:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Output:
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
Per inizializzare i metadati:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
L'URI del token rimanda ai metadati off-chain. Vedi un esempio di formato JSON qui.
Esempio di comando:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Visualizza i metadati su Solana Explorer.
Scopri di più nella Guida all'estensione Metadata. Per dettagli sulle Token Extensions, consulta la guida Getting Started delle Token Extensions e la documentazione SPL.
Is this page helpful?