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.

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 ProgramToken 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 AccountMint Account

I dettagli completi memorizzati su ogni Mint Account includono quanto segue:

Mint Account State
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 initialized
pub 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 AccountToken Account

I dettagli completi memorizzati su ogni Token Account includono quanto segue:

Token Account State
pub struct Account {
/// The mint associated with this account
pub 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 delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub 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 delegated
pub 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 RelationshipAccount 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 AccountAssociated Token Account

Nota che ogni wallet necessita del proprio token account per detenere token dello stesso mint.

Relazione tra Account EspansaRelazione 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.

Terminal
$
solana airdrop 2

Esegui spl-token --help per vedere tutti i comandi disponibili.

Terminal
$
spl-token --help

Per installare la CLI spl-token localmente, esegui:

Terminal
$
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:

Terminal
$
spl-token create-token

L'output sarà simile a:

Terminal Output
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Address: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Decimals: 9
Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1

Un nuovo mint account inizia con una fornitura pari a zero. Controlla la fornitura attuale con:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

Il comando supply per un nuovo token restituisce 0:

Example
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.

  1. Il System Program crea un nuovo account con spazio per i dati del mint account e trasferisce la proprietà al Token Program.

  2. 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:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Esempio di comando:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Output:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 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:

Terminal
$
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

Nota: <TOKEN_ADDRESS> specifica il mint account per il token account.

Esempio di comando:

Example
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Output:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 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:

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.

  1. Il System Program crea un nuovo account con spazio per i dati del Token Account e trasferisce la proprietà al Token Program.

  2. Il Token Program inizializza i dati come Token Account

Coniare token

Per creare nuove unità di un token, conia token in un Token Account:

Terminal
$
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

Esempio di comando:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Output:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG

Per coniare token in un token account diverso:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Output:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 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:

Terminal
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

Esempio di comando:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Output:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 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:

Example
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata

Output:

Terminal Output
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To 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: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP
Decimals: 9
Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai

Per inizializzare i metadati:

Terminal
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:

Example
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?

Indice

Modifica Pagina