Lecture depuis le réseau

Lisez des données du réseau Solana en récupérant différents comptes. Cette section vous aidera à comprendre la structure des comptes Solana. Chaque compte Solana possède une adresse unique qui est utilisée pour localiser ses données correspondantes sur la chaîne. Les comptes contiennent soit des données d'état ou un programme exécutable.

Récupérer un compte de portefeuille

Un portefeuille est un compte détenu par le System Program. Les portefeuilles sont principalement utilisés pour détenir des SOL et signer des transactions. Lorsque des SOL sont envoyés à une nouvelle adresse pour la première fois, un compte système est automatiquement créé.

L'exemple ci-dessous génère une nouvelle keypair, demande des SOL pour financer la nouvelle adresse de clé publique, et récupère les données du compte pour le portefeuille nouvellement financé.

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.

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

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).

Le champ executable indique si le champ data du compte contient du code de programme exécutable. Pour les comptes de portefeuille, ce champ est false.

Le champ lamports contient le solde en SOL du compte, en 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 de rent obsolète. (Ce champ est inclus pour la rétrocompatibilité.)

Le champ space indique le nombre d'octets contenus 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.

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

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).

Le champ executable indique si le champ data du compte contient du code de programme exécutable. Pour les comptes de portefeuille, ce champ est false.

Le champ lamports contient le solde en SOL du compte, en 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 de rent obsolète. (Ce champ est inclus pour la rétrocompatibilité.)

Le champ space indique le nombre d'octets contenus 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

L'exemple ci-dessous récupère le Token Program pour démontrer la différence entre les comptes de portefeuille et les program accounts. Le program account stocke le bytecode compilé du code source du Token Program. Vous pouvez consulter ce program account 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 program account exécutable. Les programmes ont les mêmes champs sous-jacents que tous les comptes, mais avec des différences clés.

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

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

Le champ data stocke le code exécutable du programme.

Chaque program account appartient à son programme chargeur. Dans cet exemple, le owner est le programme BPFLoader2.

Le Token Program est un program account exécutable. Les programmes ont les mêmes champs sous-jacents que tous les comptes, mais avec des différences clés.

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

Le champ data stocke le code exécutable du programme.

Chaque program account appartient à son programme chargeur. Dans cet exemple, 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

Un mint account est un compte appartenant au Token Program qui stocke les métadonnées globales pour un jeton spécifique. Cela inclut l'offre totale, le nombre de décimales et les comptes qui sont 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.

L'exemple ci-dessous récupère le mint account de l'USD Coin pour démontrer comment l'état d'un programme est stocké dans un compte séparé.

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.

Les mint accounts stockent l'état, pas de code exécutable. Ils appartiennent au Token Program, qui inclut des instructions définissant comment créer et mettre à jour les mint accounts.

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

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

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

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

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

Pour lire un Mint account, vous devez désérialiser le champ data dans le type de données Mint, ce qui est montré dans l'exemple suivant.

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

Le mint account appartient au Token Program. Cela signifie que son champ data ne peut être modifié que par les instructions du Token Program.

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

Les mint accounts stockent l'état, pas de code exécutable. Ils appartiennent au Token Program, qui inclut des instructions définissant comment créer et mettre à jour les mint accounts.

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

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

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

Pour lire un Mint account, vous devez désérialiser le champ data dans le type de données Mint, ce qui est montré dans l'exemple suivant.

Le mint account appartient au Token Program. Cela signifie que son champ data ne peut être modifié que par les instructions du 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 mint account

Avant que les octets bruts dans le champ data d'un compte puissent être interprétés de manière significative, ils doivent être désérialisés. Le type de données approprié est 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, la bibliothèque @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 défini par le Token Program.

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 mint account dans le type de compte Mint.

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 mint account sur le Solana Explorer.

Le champ address contient l'adresse du mint account.

Le champ mintAuthority indique le seul compte qui peut créer de nouvelles unités du token.

Le champ supply indique le nombre total de tokens qui ont été créés. Cette valeur est mesurée dans la plus petite unité du token. 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 mint account a été initialisé. Ce champ est une vérification de sécurité utilisée dans le Token Program.

Le champ freezeAuthority indique le compte ayant l'autorité de geler les token accounts. Un token account gelé ne peut pas transférer ou brûler le token qu'il contient.

Le champ tlvData contient des données supplémentaires pour les Token Extensions et nécessite une désérialisation supplémentaire. Ce champ n'est pertinent que pour les comptes créés par le Programme Token Extension (Token2022).

La fonction getMint() désérialise le champ data d'un mint account dans le type de compte Mint.

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 mint account sur le Solana Explorer.

Le champ address contient l'adresse du mint account.

Le champ mintAuthority indique le seul compte qui peut créer de nouvelles unités du token.

Le champ supply indique le nombre total de tokens qui ont été créés. Cette valeur est mesurée dans la plus petite unité du token. 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 mint account a été initialisé. Ce champ est une vérification de sécurité utilisée dans le Token Program.

Le champ freezeAuthority indique le compte ayant l'autorité de geler les token accounts. Un token account gelé ne peut pas transférer ou brûler le token qu'il contient.

Le champ tlvData contient des données supplémentaires pour les Token Extensions et nécessite une désérialisation supplémentaire. Ce champ n'est pertinent que pour les comptes créés par le Programme Token Extension (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

Géré par

© 2025 Fondation Solana.
Tous droits réservés.
Restez connecté