Tokens sur Solana

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 fondamentaux de la représentation des tokens sur Solana. Consultez la section Principes de base des tokens SPL pour des exemples de code.

Points clés

  • Les Programmes de tokens contiennent toute la logique d'instruction pour interagir avec les tokens sur le réseau (fongibles et non fongibles).

  • Un Compte Mint représente un token spécifique et stocke les métadonnées globales du token comme l'offre totale et l'autorité de mint (adresse autorisée à créer de nouvelles unités d'un token).

  • Un Compte Token suit la propriété individuelle des tokens pour un compte mint spécifique et pour un propriétaire spécifique.

  • Un Compte Token Associé est un Compte Token créé avec une adresse dérivée des adresses du propriétaire et du compte mint.

Programmes de tokens

L'écosystème Solana possède deux Programmes de Tokens principaux. Code source pour les deux programmes ci-dessous.

Les Programmes de Tokens 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 détenus par un Programme de Token.

Programme TokenProgramme Token

Compte Mint

Les tokens sur Solana sont identifiés de manière unique par l'adresse d'un Compte Mint détenu par le Programme Token. Ce compte agit comme un compteur global pour un token spécifique et stocke des données telles que:

  • Approvisionnement : Approvisionnement total du jeton
  • Décimales : Précision décimale du jeton
  • Autorité de frappe : Le compte autorisé à créer de nouvelles unités du jeton, augmentant ainsi l'approvisionnement
  • Autorité de gel : Le compte autorisé à geler des jetons dans un Compte de Jeton, les empêchant d'être transférés ou détruits

Compte de FrappeCompte de Frappe

Les détails complets stockés sur chaque Compte de Frappe comprennent les éléments suivants :

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

Pour référence, voici un lien Solana Explorer vers le Compte de Frappe USDC.

Compte de Jeton

Le Programme de Jeton crée des Comptes de Jeton pour suivre la propriété individuelle de chaque unité de jeton. Un Compte de Jeton stocke des données telles que :

  • Frappe : Le jeton que le Compte de Jeton détient en unités
  • Propriétaire : Le compte autorisé à transférer des jetons depuis le Compte de Jeton
  • Montant : Nombre de jetons que le Compte de Jeton détient actuellement

Compte de JetonCompte de Jeton

Les détails complets stockés sur chaque Compte de Jeton comprennent les éléments suivants :

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 portefeuille a besoin d'un compte de jeton pour chaque jeton (frappe) qu'il souhaite détenir, avec l'adresse du portefeuille définie comme propriétaire du compte de jeton. Chaque portefeuille peut posséder plusieurs comptes de jeton pour le même jeton (frappe), mais un compte de jeton ne peut avoir qu'un seul propriétaire et détenir des unités d'un seul jeton (frappe).

Relation de CompteRelation de Compte

Notez que les données de chaque Compte de Jeton incluent un champ owner identifiant qui a autorité sur le Compte de Jeton. Cela diffère du propriétaire du programme spécifié dans le type Compte de base, qui est le Programme de Jeton pour tous les Comptes de Jeton.

Compte de Jeton Associé

Les Comptes de Jeton Associés simplifient le processus de recherche de l'adresse d'un compte de jeton pour une frappe et un propriétaire spécifiques. Considérez le Compte de Jeton Associé comme le compte de jeton "par défaut" pour une frappe et un propriétaire spécifiques.

Un Compte de Token Associé est créé avec une adresse dérivée de l'adresse du propriétaire et de l'adresse du compte de mint. Il est important de comprendre qu'un Compte de Token Associé n'est qu'un compte de token avec une adresse spécifique.

Cela introduit un concept clé dans le développement Solana : Programme Derived Address (PDA). Un PDA dérive une adresse de manière déterministe en utilisant des entrées prédéfinies, facilitant ainsi la recherche de l'adresse d'un compte.

Compte de Token AssociéCompte de Token Associé

Notez que chaque portefeuille nécessite son propre compte de token pour détenir des tokens provenant du même mint.

Relation des Comptes ÉtendueRelation des Comptes Étendue

Exemples CLI de 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 des 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 loyer de compte et les frais de transaction. Pour les utilisateurs de Solana Playground débutants, créez un portefeuille Playground et exécutez la commande solana airdrop dans le terminal Playground. Vous pouvez également obtenir du SOL devnet à partir du faucet web public.

Terminal
$
solana airdrop 2

Exécutez spl-token --help pour voir toutes les commandes disponibles.

Terminal
$
spl-token --help

Pour installer la CLI spl-token localement, exécutez :

Terminal
$
cargo install spl-token-cli

Trouvez plus d'exemples dans la documentation spl-token.

Les adresses de compte affichées dans votre terminal diffèrent des exemples ci-dessous. Utilisez les adresses de votre terminal Playground lorsque vous suivez. Par exemple, la commande create-token génère une adresse de compte mint avec votre portefeuille Playground comme autorité de mint.

Créer un Nouveau Token

Pour créer un nouveau token (compte mint), exécutez :

Terminal
$
spl-token create-token

La sortie ressemble à :

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

Un nouveau compte de frappe commence avec une offre nulle. Vérifiez l'offre actuelle avec :

Terminal
$
spl-token supply <TOKEN_ADDRESS>

La commande supply pour un nouveau jeton renvoie 0 :

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

La création d'un nouveau compte de frappe nécessite une transaction avec deux instructions. Voici un exemple en Javascript sur Solana Playground.

  1. Le programme système crée un nouveau compte avec l'espace pour les données du compte de frappe et transfère la propriété au programme de jetons.

  2. Le programme de jetons initialise les données du nouveau compte en tant que compte de frappe

Créer un compte de jetons

Pour détenir des jetons d'une frappe spécifique, créez un compte de jetons :

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Exemple de commande :

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Sortie :

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

La commande create-account crée un compte de jetons associé avec l'adresse de votre portefeuille comme propriétaire.

Pour créer un compte de jetons avec un propriétaire différent :

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

Remarque : <TOKEN_ADDRESS> spécifie le compte de frappe pour le compte de jetons.

Exemple de commande :

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

Sortie :

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

La création d'un compte de jetons associé nécessite une instruction qui invoque le Programme de jetons associés. Voici un exemple en Javascript sur Solana Playground.

Le programme de jetons associés utilise des invocations inter-programmes pour :

Pour créer un nouveau Compte de Jetons avec une nouvelle paire de clés au lieu d'une adresse de Compte de Jetons Associé, envoyez une transaction avec deux instructions. Voici un exemple en Javascript sur Solana Playground.

  1. Le Programme Système crée un nouveau compte avec l'espace nécessaire pour les données du Compte de Jetons et transfère la propriété au Programme de Jetons.

  2. Le Programme de Jetons initialise les données en tant que Compte de Jetons

Émettre des jetons

Pour créer de nouvelles unités d'un jeton, émettez des jetons vers un Compte de Jetons :

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

Exemple de commande :

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Sortie :

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

Pour émettre des jetons vers un compte de jetons différent :

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Sortie :

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

L'instruction MintTo sur le Programme de Jetons crée de nouveaux jetons. L'autorité d'émission doit signer la transaction. L'instruction émet des jetons vers un Compte de Jetons et augmente l'approvisionnement total sur le Compte d'Émission. Voici un exemple en Javascript sur Solana Playground.

Transférer des jetons

Pour transférer des jetons entre comptes de jetons :

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

Exemple de commande :

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Sortie :

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

L'instruction Transfer sur le Programme de Jetons gère les transferts de jetons. Le propriétaire du Compte de Jetons de l'expéditeur doit signer la transaction. L'instruction déplace les jetons entre les Comptes de Jetons. Voici un exemple en Javascript sur Solana Playground.

L'expéditeur et le destinataire ont tous deux besoin de comptes de jetons pour le jeton spécifique (émission). L'expéditeur peut inclure des instructions pour créer le compte de jetons du destinataire dans la même transaction.

Créer des métadonnées de jetons

Le Programme d'Extensions de Tokens vous permet de stocker des métadonnées (nom, symbole, lien d'image) directement sur le Compte Mint.

Pour créer un token avec extension de métadonnées :

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

Sortie :

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

Pour initialiser les métadonnées :

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

L'URI du token renvoie vers des métadonnées hors chaîne. Voir un exemple de format JSON ici.

Exemple de commande :

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

Visualisez les métadonnées sur Solana Explorer.

Apprenez-en plus dans le Guide d'Extension de Métadonnées. Pour plus de détails sur les Extensions de Tokens, consultez le Guide Premiers Pas avec les Extensions de Tokens et la documentation SPL.

Is this page helpful?

Table des matières

Modifier la page