Lecture depuis le réseau

Cette section explore comment lire des données du réseau Solana en récupérant différents comptes pour comprendre la structure d'un compte Solana.

Sur Solana, toutes les données existent dans des "accounts" (comptes). Vous pouvez considérer les données sur Solana comme une base de données publique avec une seule table "Accounts", où chaque entrée est un compte avec le même type de base Account type.

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

ComptesComptes

Les comptes sur Solana peuvent stocker des "états" ou des programmes "exécutables". Chaque compte possède une "adresse" (clé publique) qui sert d'identifiant unique utilisé pour localiser ses données correspondantes sur la chaîne.

Les comptes Solana contiennent soit :

  • État : Données destinées à être lues et persistantes. Par exemple, des informations sur les jetons, les données utilisateur, ou d'autres données définies dans un programme.
  • Programmes exécutables : Comptes contenant le code réel des programmes Solana. Ces comptes stockent des instructions que les utilisateurs peuvent invoquer.

Cette séparation entre le code du programme et l'état du programme est une caractéristique clé du modèle de compte de Solana. Pour plus de détails, consultez la page Modèle de compte Solana.

Récupérer un compte de portefeuille

Cet exemple démontre comment :

  1. Générer une nouvelle keypair (paire de clés publique/privée).
  2. Demander un airdrop de SOL pour financer la nouvelle adresse.
  3. Récupérer les données du compte pour l'adresse financée.

Sur Solana, financer une nouvelle adresse avec du SOL crée automatiquement un compte détenu par le System Program. Tous les comptes de "portefeuille" sont simplement des comptes détenus par le System Program qui contiennent du SOL et peuvent signer des transactions.

Fetch Account
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`Public Key: ${keypair.publicKey}`);
const connection = new Connection("http://localhost:8899", "confirmed");
// Funding an address with SOL automatically creates an account
const signature = await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
Console
Click to execute the code.

Un "portefeuille" sur Solana est un compte détenu par le Programme Système, qui est l'un des programmes intégrés de Solana. Les comptes de portefeuille sont principalement utilisés pour détenir des SOL (suivis dans le champ lamports) et pour signer des transactions.

Lorsque vous récupérez un compte de portefeuille, la réponse inclut les champs présentés dans l'exemple de sortie.

Le champ data contient les données du compte stockées sous forme d'octets.

Pour les comptes de portefeuille, ce champ est vide (0 octet). D'autres comptes utilisent ce champ pour stocker soit l'état du programme, soit du code de programme exécutable.

Le champ executable indique si le champ data du compte contient du code de programme exécutable.

Pour les portefeuilles et les comptes qui stockent l'état du programme, ce champ est false.

Le champ lamports contient le solde en SOL du compte, exprimé en lamports.

Les lamports sont la plus petite unité de SOL. 1 SOL = 1 000 000 000 lamports.

Le champ owner indique le programme qui possède le compte.

Pour les portefeuilles, le propriétaire est toujours le System Program, avec l'adresse 11111111111111111111111111111111.

Le champ rentEpoch est un champ hérité d'un mécanisme obsolète où les comptes étaient facturés du "rent" (en lamports) pour maintenir leurs données sur le réseau.

Ce champ n'est actuellement pas utilisé, mais est inclus pour la rétrocompatibilité.

Le champ space indique le nombre d'octets dans le champ data. Ce n'est pas un champ dans le type Account lui-même, mais il est inclus dans la réponse.

Dans cet exemple, le champ space est à 0 car le champ data contient 0 octets de données.

Un "portefeuille" sur Solana est un compte détenu par le Programme Système, qui est l'un des programmes intégrés de Solana. Les comptes de portefeuille sont principalement utilisés pour détenir des SOL (suivis dans le champ lamports) et pour signer des transactions.

Lorsque vous récupérez un compte de portefeuille, la réponse inclut les champs présentés dans l'exemple de sortie.

Le champ data contient les données du compte stockées sous forme d'octets.

Pour les comptes de portefeuille, ce champ est vide (0 octet). D'autres comptes utilisent ce champ pour stocker soit l'état du programme, soit du code de programme exécutable.

Le champ executable indique si le champ data du compte contient du code de programme exécutable.

Pour les portefeuilles et les comptes qui stockent l'état du programme, ce champ est false.

Le champ lamports contient le solde en SOL du compte, exprimé en lamports.

Les lamports sont la plus petite unité de SOL. 1 SOL = 1 000 000 000 lamports.

Le champ owner indique le programme qui possède le compte.

Pour les portefeuilles, le propriétaire est toujours le System Program, avec l'adresse 11111111111111111111111111111111.

Le champ rentEpoch est un champ hérité d'un mécanisme obsolète où les comptes étaient facturés du "rent" (en lamports) pour maintenir leurs données sur le réseau.

Ce champ n'est actuellement pas utilisé, mais est inclus pour la rétrocompatibilité.

Le champ space indique le nombre d'octets dans le champ data. Ce n'est pas un champ dans le type Account lui-même, mais il est inclus dans la réponse.

Dans cet exemple, le champ space est à 0 car le champ data contient 0 octets de données.

Example Output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Récupérer le Token Program

Cet exemple récupère le Token Program pour démontrer la différence entre les comptes de portefeuille et les comptes de programme.

Le compte de programme stocke le bytecode compilé pour le code source du Token Program. Vous pouvez consulter ce compte de programme sur Solana Explorer.

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

Le Token Program est un compte de programme exécutable sur Solana. Comme les comptes de portefeuille, les programmes ont la même structure de données sous-jacente Account, mais avec des différences clés dans leurs champs.

Le champ executable est défini sur true, indiquant que le champ data de ce compte contient du code de programme exécutable.

Pour les comptes de programme, le champ data stocke le code exécutable du programme. En revanche, les comptes de portefeuille ont un champ de données vide.

Lorsque vous déployez un programme Solana, le code exécutable du programme est stocké dans le champ data d'un compte.

Les comptes de programme exécutables ont également un programme désigné comme owner du compte.

Tous les comptes de programme appartiennent à un programme Loader, qui est une catégorie de programmes intégrés qui possèdent des comptes de programme exécutables sur Solana.

Pour le Token Program, le owner est le programme BPFLoader2.

Le Token Program est un compte de programme exécutable sur Solana. Comme les comptes de portefeuille, les programmes ont la même structure de données sous-jacente Account, mais avec des différences clés dans leurs champs.

Le champ executable est défini sur true, indiquant que le champ data de ce compte contient du code de programme exécutable.

Pour les comptes de programme, le champ data stocke le code exécutable du programme. En revanche, les comptes de portefeuille ont un champ de données vide.

Lorsque vous déployez un programme Solana, le code exécutable du programme est stocké dans le champ data d'un compte.

Les comptes de programme exécutables ont également un programme désigné comme owner du compte.

Tous les comptes de programme appartiennent à un programme Loader, qui est une catégorie de programmes intégrés qui possèdent des comptes de programme exécutables sur Solana.

Pour le Token Program, le owner est le programme BPFLoader2.

Token Program Account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

Récupérer un mint account

Cet exemple récupère le mint account de l'USD Coin (USDC) pour montrer comment les programmes sur Solana stockent leur état dans des comptes séparés.

Un Mint account est un compte appartenant au Token Program. Il stocke les métadonnées globales pour un jeton spécifique, y compris l'offre totale, le nombre de décimales et les comptes autorisés à créer ou geler des jetons. L'adresse du mint account identifie de manière unique un jeton sur le réseau Solana.

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

Le point clé à noter dans cet exemple est que le compte Mint stocke l'état, et non du code exécutable.

Les comptes Mint appartiennent au Token Program, qui inclut des instructions définissant comment créer et mettre à jour les comptes Mint.

Le champ executable est false car le champ data du mint account stocke l'état, et non du code exécutable.

Le Token Program définit le type de données Mint, qui est stocké dans le champ data du mint account.

Le champ data contient l'état sérialisé du compte Mint, comme l'autorité de mint, l'offre totale, le nombre de décimales.

Pour lire un compte Mint, vous devez désérialiser le champ data dans le type de données Mint. Ceci est abordé dans l'étape suivante.

Le Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) possède le mint account.

Cela signifie que le champ data du mint account ne peut être modifié que par les instructions définies dans le Token Program.

Le point clé à noter dans cet exemple est que le compte Mint stocke l'état, et non du code exécutable.

Les comptes Mint appartiennent au Token Program, qui inclut des instructions définissant comment créer et mettre à jour les comptes Mint.

Le champ executable est false car le champ data du mint account stocke l'état, et non du code exécutable.

Le Token Program définit le type de données Mint, qui est stocké dans le champ data du mint account.

Le champ data contient l'état sérialisé du compte Mint, comme l'autorité de mint, l'offre totale, le nombre de décimales.

Pour lire un compte Mint, vous devez désérialiser le champ data dans le type de données Mint. Ceci est abordé dans l'étape suivante.

Le Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) possède le mint account.

Cela signifie que le champ data du mint account ne peut être modifié que par les instructions définies dans le Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Désérialiser un compte Mint

Le champ data d'un compte Solana contient des octets bruts. Pour interpréter ces données de manière significative, vous devez les désérialiser dans le type de données approprié défini par le programme qui possède le compte.

La plupart des programmes Solana fournissent des bibliothèques client avec des fonctions auxiliaires qui abstraient le processus de désérialisation. Ces fonctions convertissent les octets bruts du compte en types de données structurées, facilitant ainsi le travail avec les données du compte.

Par exemple, @solana/spl-token inclut la fonction getMint() pour aider à désérialiser le champ data d'un mint account dans le type de données Mint.

Deserialize Mint Account Data
import { PublicKey, Connection } from "@solana/web3.js";
import { getMint } from "@solana/spl-token";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mintData = await getMint(connection, address, "confirmed");
Console
Click to execute the code.
Mint Account Type
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>,
}

La fonction getMint() désérialise le champ data d'un compte mint en type de données Mint défini par le Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Vous pouvez consulter les données entièrement désérialisées du compte Mint sur l'explorateur Solana.

Le champ address contient l'adresse du compte Mint.

L'adresse du compte mint est utilisée pour identifier le jeton sur le réseau Solana.

Le champ mintAuthority indique l'autorité autorisée à créer de nouveaux jetons.

C'est le seul compte qui peut créer de nouvelles unités du jeton.

Le champ supply indique le nombre total de jetons qui ont été créés.

Cette valeur est exprimée dans la plus petite unité du jeton. Pour obtenir l'offre totale en unités standard, ajustez la valeur du champ supply par le decimals.

Le champ decimals indique le nombre de décimales pour le token.

Le champ isInitialized indique si le compte Mint a été initialisé. Ce champ est une vérification de sécurité utilisée dans le Token Program.

Le champ freezeAuthority indique l'autorité autorisée à geler les token accounts.

Un token account qui est gelé ne peut pas transférer ou brûler le token dans le compte.

Le champ tlvData contient des données supplémentaires pour les Token Extensions (nécessite une désérialisation supplémentaire).

Ce champ n'est pertinent que pour les comptes créés par le Token Extension Program (Token2022).

La fonction getMint() désérialise le champ data d'un compte mint en type de données Mint défini par le Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Vous pouvez consulter les données entièrement désérialisées du compte Mint sur l'explorateur Solana.

Le champ address contient l'adresse du compte Mint.

L'adresse du compte mint est utilisée pour identifier le jeton sur le réseau Solana.

Le champ mintAuthority indique l'autorité autorisée à créer de nouveaux jetons.

C'est le seul compte qui peut créer de nouvelles unités du jeton.

Le champ supply indique le nombre total de jetons qui ont été créés.

Cette valeur est exprimée dans la plus petite unité du jeton. Pour obtenir l'offre totale en unités standard, ajustez la valeur du champ supply par le decimals.

Le champ decimals indique le nombre de décimales pour le token.

Le champ isInitialized indique si le compte Mint a été initialisé. Ce champ est une vérification de sécurité utilisée dans le Token Program.

Le champ freezeAuthority indique l'autorité autorisée à geler les token accounts.

Un token account qui est gelé ne peut pas transférer ou brûler le token dans le compte.

Le champ tlvData contient des données supplémentaires pour les Token Extensions (nécessite une désérialisation supplémentaire).

Ce champ n'est pertinent que pour les comptes créés par le Token Extension Program (Token2022).

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Table des matières

Modifier la page