Les tokens sont des actifs numériques qui représentent la propriété de diverses catégories d'actifs. La tokenisation permet la numérisation des droits de propriété. Les tokens sur Solana sont appelés tokens SPL (Solana Program Library).
Cette section couvre les concepts de base de la représentation des tokens sur Solana. Consultez la section Bases des tokens SPL pour des exemples de code.
Points clés
-
Les Token Programs contiennent toute la logique d'instruction pour interagir avec les tokens sur le réseau (fongibles et non fongibles).
-
Un mint account représente un token spécifique et stocke les métadonnées globales du token telles que l'offre totale et l'autorité de frappe (adresse autorisée à créer de nouvelles unités d'un token).
-
Un token account suit la propriété individuelle des tokens pour un mint account spécifique et un propriétaire spécifique.
-
Un associated token account est un token account créé avec une adresse dérivée des adresses du propriétaire et du mint account.
Token Programs
L'écosystème Solana dispose de deux Token Programs principaux. Code source des deux programmes ci-dessous.
Token Program (original)
- Fonctionnalités de base des tokens (frappe, transfert, etc.)
- Immuable et largement utilisé
Token Extension Program (Token 2022)
- Inclut toutes les fonctionnalités du Token Program original
- Ajoute des fonctionnalités via des « extensions »
Les Token Programs contiennent toute la logique d'instruction pour interagir avec les tokens sur le réseau (fongibles et non fongibles). Tous les tokens sur Solana sont effectivement des comptes de données appartenant à un Token Program.
Token Program
Mint account
Les tokens sur Solana sont identifiés de manière unique par l'adresse d'un mint account appartenant au Token Program. Ce compte agit comme un compteur global pour un token spécifique et stocke des données telles que :
- Supply : offre totale du token
- Decimals : précision décimale du token
- Mint authority : le compte autorisé à créer de nouvelles unités du token, augmentant ainsi l'offre
- Freeze authority : le compte autorisé à geler les tokens dans un token account, les empêchant d'être transférés ou brûlés
Mint Account
Les détails complets stockés sur chaque mint account incluent les éléments suivants :
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>,}
Pour référence, voici un lien Solana Explorer vers le mint account USDC.
Token Account
Le Token Program crée des token accounts pour suivre la propriété individuelle de chaque unité de token. Un token account stocke des données telles que :
- Mint : le token dont le token account détient des unités
- Owner : le compte autorisé à transférer des tokens depuis le token account
- Amount : nombre de tokens que le token account détient actuellement
Token Account
Les détails complets stockés sur chaque token account incluent les éléments suivants :
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 portefeuille a besoin d'un token account pour chaque token (mint) qu'il souhaite détenir, avec l'adresse du portefeuille définie comme propriétaire du token account. Chaque portefeuille peut posséder plusieurs token accounts pour le même token (mint), mais un token account ne peut avoir qu'un seul propriétaire et détenir des unités d'un seul token (mint).
Relation des comptes
Notez que les données de chaque token account incluent un champ owner
identifiant qui a l'autorité sur le token account. Cela diffère du propriétaire
de programme spécifié dans le type de base
Account, qui est le Token Program pour tous
les token accounts.
Associated Token Account
Les Associated Token Accounts simplifient le processus de recherche de l'adresse d'un token account pour un mint et un propriétaire spécifiques. Considérez l'Associated Token Account comme le token account « par défaut » pour un mint et un propriétaire spécifiques.
Un Associated Token Account est créé avec une adresse dérivée de l'adresse du propriétaire et de l'adresse du mint account. Il est important de comprendre qu'un Associated Token Account est simplement un token account avec une adresse spécifique.
Cela introduit un concept clé du développement Solana : Program Derived Address (PDA). Un PDA dérive une adresse de manière déterministe en utilisant des entrées prédéfinies, ce qui facilite la recherche de l'adresse d'un compte.
Associated Token Account
Notez que chaque portefeuille a besoin de son propre token account pour détenir des tokens provenant du même mint.
Relations des Comptes Étendue
Exemples avec la CLI Token
La CLI spl-token vous aide à expérimenter avec les tokens SPL. Les
exemples ci-dessous utilisent le terminal
Solana Playground pour exécuter les commandes CLI
directement dans le navigateur sans installation locale.
La création de tokens et de comptes nécessite du SOL pour les dépôts de rent des
comptes et les frais de transaction. Pour les nouveaux utilisateurs de Solana
Playground, créez un portefeuille Playground et exécutez la commande
solana airdrop dans le terminal Playground. Vous pouvez également obtenir
du SOL devnet depuis le faucet web public.
$solana airdrop 2
Exécutez spl-token --help pour voir toutes les commandes disponibles.
$spl-token --help
Pour installer la CLI spl-token localement, exécutez :
$cargo install spl-token-cli
Retrouvez plus d'exemples dans la
documentation de spl-token.
Les adresses de compte affichées dans la sortie de votre terminal diffèrent des
exemples ci-dessous. Utilisez les adresses de votre terminal Playground lorsque
vous suivez les instructions. Par exemple, la commande create-token génère
une adresse de mint account avec votre portefeuille Playground comme autorité du
mint.
Créer un nouveau jeton
Pour créer un nouveau jeton (mint account), exécutez :
$spl-token create-token
Le résultat ressemble à :
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Un nouveau mint account commence avec une offre nulle. Vérifiez l'offre actuelle avec :
$spl-token supply <TOKEN_ADDRESS>
La commande supply pour un nouveau jeton renvoie 0 :
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
La création d'un nouveau mint account nécessite une transaction avec deux instructions. Voici un exemple en Javascript sur Solana Playground.
-
Le System Program crée un nouveau compte avec l'espace pour les données du mint account et transfère la propriété au Token Program.
-
Le Token Program initialise les données du nouveau compte comme un mint account
Créer un token account
Pour détenir des jetons d'un mint spécifique, créez un token account :
$spl-token create-account <TOKEN_ADDRESS>
Exemple de commande :
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Sortie :
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
La commande create-account crée un associated token account avec l'adresse
de votre portefeuille comme propriétaire.
Pour créer un token account avec un propriétaire différent :
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Remarque : <TOKEN_ADDRESS> spécifie le mint account pour le token account.
Exemple de commande :
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Sortie :
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
La création d'un associated token account nécessite une instruction qui invoque le Associated Token Program. Voici un exemple Javascript sur Solana Playground.
L'Associated Token Program utilise des invocations inter-programmes pour :
- Invoquer le System Program afin de créer un nouveau compte en utilisant le PDA fourni comme adresse
- Invoquer le Token Program pour initialiser les données du token account
Pour créer un nouveau token account avec une nouvelle keypair au lieu d'une adresse d'associated token account, envoyez une transaction avec deux instructions. Voici un exemple Javascript sur Solana Playground.
-
Le System Program crée un nouveau compte avec l'espace nécessaire pour les données du token account et transfère la propriété au Token Program.
-
Le Token Program initialise les données en tant que token account
Créer des tokens
Pour créer de nouvelles unités d'un token, créez des tokens vers un token account :
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Exemple de commande :
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Sortie :
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Pour créer des tokens vers un autre token account :
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Sortie :
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
L'instruction MintTo du Token Program crée de nouveaux tokens. L'autorité
de création doit signer la transaction. L'instruction crée des tokens vers un
token account et augmente l'offre totale sur le compte mint. Voici un exemple
Javascript sur
Solana Playground.
Transférer des tokens
Pour transférer des tokens entre token accounts :
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Exemple de commande :
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Sortie :
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
L'instruction Transfer du Token Program gère les transferts de jetons. Le
propriétaire du token account de l'expéditeur doit signer la transaction.
L'instruction déplace les jetons entre les token accounts. Voici un exemple
Javascript sur
Solana Playground.
L'expéditeur et le destinataire ont tous deux besoin de token accounts pour le jeton spécifique (mint). L'expéditeur peut inclure des instructions pour créer le token account du destinataire dans la même transaction.
Créer des métadonnées de jeton
Le Token Extensions Program vous permet de stocker des métadonnées (nom, symbole, lien d'image) directement sur le mint account.
Pour créer un jeton avec l'extension de métadonnées :
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Sortie :
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
Pour initialiser les métadonnées :
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
L'URI du jeton renvoie vers des métadonnées hors chaîne. Consultez un exemple de format JSON ici.
Exemple de commande :
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Consultez les métadonnées sur Solana Explorer.
Pour en savoir plus, consultez le guide de l'extension Metadata. Pour plus de détails sur les Token Extensions, consultez le guide de démarrage des Token Extensions et la documentation SPL.
Is this page helpful?