Tokens zijn digitale activa die eigendom vertegenwoordigen over diverse categorieën van activa. Tokenisatie maakt de digitalisering van eigendomsrechten mogelijk. Tokens op Solana worden SPL (Solana Program Library) tokens genoemd.
Deze sectie behandelt de basisconcepten van hoe tokens worden weergegeven op Solana. Raadpleeg de sectie SPL Token Basics voor codevoorbeelden.
Belangrijkste punten
-
Token Programs bevatten alle instructielogica voor interactie met tokens op het netwerk (zowel fungibel als niet-fungibel).
-
Een mint account vertegenwoordigt een specifieke token en slaat globale metadata over de token op, 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 dat is gemaakt met een adres dat is afgeleid van de adressen van de eigenaar en het mint account.
Token Programs
Het Solana-ecosysteem heeft twee belangrijkste Token Programs. Broncode voor beiden programma's hieronder.
Token Program (origineel)
- Basisfunctionaliteit voor tokens (mint, transfer, etc.)
- Onveranderlijk en veelgebruikt
Token Extension Program (Token 2022)
- Bevat alle functies van het originele Token Program
- Voegt functies toe via "extensions"
Token Programs bevatten alle instructielogica voor interactie met tokens op het netwerk (zowel fungibel als niet-fungibel). 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 dat eigendom is 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 zijn de 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 maakt token accounts aan om individueel eigendom van elke tokeneenheid 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 zijn de 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 bewaren, waarbij het walletadres 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 één token (mint) bevatten.
Account Relationship
Merk op dat de data van elk token account een owner veld bevat dat aangeeft
wie 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 invoer, waardoor het gemakkelijk wordt 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 bezitten.
Accounts Relationship Expanded
Token CLI voorbeelden
De spl-token CLI helpt je om te experimenteren met SPL-tokens. De
onderstaande voorbeelden gebruiken de
Solana Playground terminal om CLI-commando's direct in
de browser uit te voeren zonder lokale installatie.
Het aanmaken van tokens en accounts vereist SOL voor rent-deposito's van
accounts en transactiekosten. Voor nieuwe gebruikers van Solana Playground: maak
een Playground-wallet aan en voer het solana airdrop commando uit in de
Playground-terminal. Je kunt ook devnet SOL krijgen van de publieke
web faucet.
$solana airdrop 2
Voer spl-token --help uit om alle beschikbare commando's te zien.
$spl-token --help
Om de spl-token CLI lokaal te installeren, voer je uit:
$cargo install spl-token-cli
Vind meer voorbeelden in de spl-token
documentatie.
De accountadressen die in je terminaluitvoer worden weergegeven, verschillen van
de onderstaande voorbeelden. Gebruik de adressen uit je Playground-terminal
wanneer je meevolgt. Het create-token commando geeft bijvoorbeeld een mint
account adres weer met je Playground-wallet als de mint authority.
Een nieuwe token aanmaken
Om een nieuwe token (mint account) aan te maken, voer je uit:
$spl-token create-token
De uitvoer ziet er als volgt uit:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Een nieuw 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 nieuw 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 specifiek mint account te kunnen houden, 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 het 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 oproept. Hier is een Javascript-voorbeeld op Solana Playground.
Het Associated Token Program gebruikt cross program invocations om:
- Het System Program op te roepen om een nieuw account aan te maken met de opgegeven PDA als adres
- Het Token Program op te roepen om de token account gegevens te initialiseren
Om een nieuw token account aan te maken met een nieuw keypair 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 aan 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 te minten naar een ander token account:
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 supply op het Mint Account. Hier is een
Javascript-voorbeeld op
Solana Playground.
Tokens overmaken
Om tokens over te maken tussen token accounts:
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 in het Token Program verwerkt tokenoverdrachten. 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 het specifieke token (mint). De verzender kan instructies toevoegen om het token account van de ontvanger aan te maken in dezelfde transactie.
Tokenmetadata aanmaken
Het Token Extensions Program stelt je in staat om metadata (naam, symbool, afbeeldingslink) direct op het mint account op te slaan.
Om een token aan te maken met metadata-extensie:
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. Zie een voorbeeld van het 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 Getting Started Guide voor Token Extensions en de SPL-documentatie.
Is this page helpful?