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 Program (Origineel)
- Basale tokenfunctionaliteit (mint, transfer, etc.)
- Onveranderlijk en wijdverspreid gebruikt
Token Extension Program (Token 2022)
- Bevat alle originele Token Program functies
- Voegt functies toe via "extensions"
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 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 Account
De volledige details die op elk Mint Account worden opgeslagen, omvatten het volgende:
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>,}
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 Account
De volledige details die op elk Token Account worden opgeslagen, omvatten het volgende:
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>,}
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 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 Account
Merk op dat elke wallet zijn eigen token account nodig heeft om tokens van dezelfde mint te bewaren.
Accounts 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.
$solana airdrop 2
Voer spl-token --help
uit om alle beschikbare opdrachten te zien.
$spl-token --help
Om de spl-token
CLI lokaal te installeren, voer uit:
$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:
$spl-token create-token
De uitvoer ziet er als volgt uit:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Een nieuwe mint account begint met een voorraad van nul. Controleer de huidige voorraad met:
$spl-token supply <TOKEN_ADDRESS>
Het supply
commando voor een nieuwe token geeft 0
terug:
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.
-
Het System Program maakt een nieuw account aan met ruimte voor de mint account data en draagt het eigendom over aan het Token Program.
-
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:
$spl-token create-account <TOKEN_ADDRESS>
Voorbeeld commando:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Uitvoer:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 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:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Opmerking: <TOKEN_ADDRESS>
specificeert de mint account voor het token
account.
Voorbeeld commando:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Uitvoer:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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:
- Het System Program aan te roepen om een nieuw account aan te maken met de opgegeven PDA als adres
- Het Token Program aan te roepen om de token account data te initialiseren
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.
-
Het System Program maakt een nieuw account aan met ruimte voor de Token Account gegevens en draagt het eigendom over aan het Token Program.
-
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:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Voorbeeldopdracht:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Uitvoer:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Om tokens naar een ander token account te minten:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Uitvoer:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Voorbeeldopdracht:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Uitvoer:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Uitvoer:
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
Om de metadata te initialiseren:
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:
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?