Tokens op Solana

Tokens zijn digitale activa die eigendom over diverse categorieën van activa vertegenwoordigen. Tokenisatie maakt de digitalisering van eigendomsrechten mogelijk. Tokens op Solana worden aangeduid als SPL (Solana Program Library) Tokens.

Dit gedeelte behandelt de basisbegrippen van hoe tokens worden weergegeven op Solana. Raadpleeg het gedeelte SPL Token Basics voor codevoorbeelden.

Belangrijke punten

  • Token Programs bevatten alle instructielogica voor het interacteren met tokens op het netwerk (zowel fungibele als niet-fungibele).

  • Een Mint Account vertegenwoordigt een specifieke token en slaat globale metadata op over de token, zoals de totale voorraad en mint authority (adres dat geautoriseerd is om nieuwe eenheden van een token te creëren).

  • Een Token Account houdt individueel eigendom van tokens bij voor een specifiek mint account voor een specifieke eigenaar.

  • Een Associated Token Account is een Token Account gemaakt met een adres afgeleid van de eigenaar en mint account adressen.

Token Programs

Het Solana-ecosysteem heeft twee belangrijke Token Programs. Broncode voor beide programma's hieronder.

Token Programs bevat alle instructielogica voor het interacteren met tokens op het netwerk (zowel fungibele als niet-fungibele). Alle tokens op Solana zijn in feite data accounts die eigendom zijn van een Token Program.

Token ProgramToken Program

Mint Account

Tokens op Solana worden uniek geïdentificeerd door het adres van een Mint Account in eigendom van het Token Program. Dit account fungeert als een globale teller voor een specifieke token en slaat gegevens op zoals:

  • Supply: Totale voorraad van de token
  • Decimals: Decimale precisie van de token
  • Mint authority: Het account dat geautoriseerd is om nieuwe eenheden van de token te creëren, waardoor de voorraad toeneemt
  • Freeze authority: Het account dat geautoriseerd is om tokens in een Token Account te bevriezen, waardoor ze niet kunnen worden overgedragen of verbrand

Mint AccountMint Account

De volledige details die op elk Mint Account worden opgeslagen, omvatten het volgende:

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>,
}

Ter referentie, hier is een Solana Explorer link naar het USDC Mint Account.

Token Account

Het Token Program creëert Token Accounts om individueel eigendom van elke token-eenheid bij te houden. Een Token Account slaat gegevens op zoals:

  • Mint: De token waarvan het Token Account eenheden bevat
  • Owner: Het account dat geautoriseerd is om tokens over te dragen vanuit het Token Account
  • Amount: Aantal tokens dat het Token Account momenteel bevat

Token AccountToken Account

De volledige details die op elk Token Account worden opgeslagen, omvatten het volgende:

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>,
}

Een wallet heeft een token account nodig voor elke token (mint) die het wil bezitten, waarbij het wallet-adres is ingesteld als de eigenaar van het token account. Elke wallet kan meerdere token accounts bezitten voor dezelfde token (mint), maar een token account kan slechts één eigenaar hebben en eenheden van slechts één token (mint) bevatten.

Account RelationshipAccount Relationship

Merk op dat de gegevens van elk Token Account een owner veld bevatten dat aangeeft wie de autoriteit heeft over het Token Account. Dit verschilt van de programma-eigenaar die is gespecificeerd in het basis Account type, wat het Token Program is voor alle Token Accounts.

Associated Token Account

Associated Token Accounts vereenvoudigen het proces van het vinden van het adres van een token account voor een specifieke mint en eigenaar. Beschouw het Associated Token Account als het "standaard" token account voor een specifieke mint en eigenaar.

Een Associated Token Account wordt aangemaakt met een adres dat is afgeleid van het adres van de eigenaar en het adres van het mint account. Het is belangrijk om te begrijpen dat een Associated Token Account gewoon een token account is met een specifiek adres.

Dit introduceert een belangrijk concept in Solana-ontwikkeling: Program Derived Address (PDA). Een PDA leidt deterministisch een adres af met behulp van vooraf gedefinieerde inputs, waardoor het gemakkelijk is om het adres van een account te vinden.

Associated Token AccountAssociated Token Account

Merk op dat elke wallet zijn eigen token account nodig heeft om tokens van dezelfde mint te bewaren.

Accounts Relationship ExpandedAccounts Relationship Expanded

Token CLI voorbeelden

De spl-token CLI helpt je bij het experimenteren met SPL tokens. De onderstaande voorbeelden gebruiken de Solana Playground terminal om CLI-opdrachten rechtstreeks in de browser uit te voeren zonder lokale installatie.

Voor het aanmaken van tokens en accounts is SOL nodig voor account rent deposits en transactiekosten. Voor nieuwe Solana Playground-gebruikers: maak een Playground-wallet aan en voer de opdracht solana airdrop uit in de Playground-terminal. Je kunt ook devnet SOL krijgen via de openbare web faucet.

Terminal
$
solana airdrop 2

Voer spl-token --help uit om alle beschikbare opdrachten te zien.

Terminal
$
spl-token --help

Om de spl-token CLI lokaal te installeren, voer uit:

Terminal
$
cargo install spl-token-cli

Meer voorbeelden vind je in de spl-token documentatie.

De accountadressen die in je terminaluitvoer worden getoond, verschillen van de onderstaande voorbeelden. Gebruik de adressen uit je Playground-terminal wanneer je de stappen volgt. De opdracht create-token geeft bijvoorbeeld een mint account adres weer met jouw Playground-wallet als mint authority.

Een nieuwe token aanmaken

Om een nieuwe token (mint account) aan te maken, voer uit:

Terminal
$
spl-token create-token

De uitvoer ziet er als volgt uit:

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

Een nieuwe mint account begint met een voorraad van nul. Controleer de huidige voorraad met:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

Het supply commando voor een nieuwe token geeft 0 terug:

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Het aanmaken van een nieuwe mint account vereist een transactie met twee instructies. Hier is een Javascript voorbeeld op Solana Playground.

  1. Het System Program maakt een nieuw account aan met ruimte voor de mint account data en draagt het eigendom over aan het Token Program.

  2. Het Token Program initialiseert de data van het nieuwe account als een mint account

Token account aanmaken

Om tokens van een specifieke mint te bewaren, maak je een token account aan:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Voorbeeld commando:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Uitvoer:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

Het create-account commando maakt een associated token account aan met jouw wallet adres als eigenaar.

Om een token account aan te maken met een andere eigenaar:

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

Opmerking: <TOKEN_ADDRESS> specificeert de mint account voor het token account.

Voorbeeld commando:

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

Uitvoer:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

Het aanmaken van een associated token account vereist één instructie die het Associated Token Program aanroept. Hier is een Javascript voorbeeld op Solana Playground.

Het Associated Token Program gebruikt Cross Program Invocations om:

Om een nieuw Token Account met een nieuwe keypair te maken in plaats van een Associated Token Account adres, verstuur je een transactie met twee instructies. Hier is een Javascript voorbeeld op Solana Playground.

  1. Het System Program maakt een nieuw account aan met ruimte voor de Token Account gegevens en draagt het eigendom over aan het Token Program.

  2. Het Token Program initialiseert de gegevens als een Token Account

Tokens minten

Om nieuwe eenheden van een token te maken, mint je tokens naar een Token Account:

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

Voorbeeldopdracht:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Uitvoer:

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

Om tokens naar een ander token account te minten:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Uitvoer:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7

De MintTo instructie op het Token Program maakt nieuwe tokens aan. De mint authority moet de transactie ondertekenen. De instructie mint tokens naar een Token Account en verhoogt de totale voorraad op het Mint Account. Hier is een Javascript voorbeeld op Solana Playground.

Tokens overdragen

Om tokens tussen token accounts over te dragen:

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

Voorbeeldopdracht:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Uitvoer:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o

De Transfer instructie op het Token Program verwerkt token overdrachten. De eigenaar van het Token Account van de verzender moet de transactie ondertekenen. De instructie verplaatst tokens tussen Token Accounts. Hier is een Javascript voorbeeld op Solana Playground.

Zowel verzender als ontvanger hebben token accounts nodig voor de specifieke token (mint). De verzender kan instructies opnemen om het token account van de ontvanger in dezelfde transactie aan te maken.

Token metadata aanmaken

Met het Token Extensions Program kun je metadata (naam, symbool, afbeeldingslink) direct op de Mint Account opslaan.

Om een token met metadata-extensie te maken:

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

Uitvoer:

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

Om de metadata te initialiseren:

Terminal
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>

De token URI verwijst naar off-chain metadata. Bekijk een voorbeeld JSON-formaat hier.

Voorbeeldopdracht:

Example
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"

Bekijk de metadata op Solana Explorer.

Lees meer in de Metadata Extension Guide. Voor details over Token Extensions, zie de Token Extensions Getting Started Guide en de SPL documentatie.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken