Lisez des données depuis le réseau Solana en récupérant différents comptes. Ce guide explique la structure des comptes Solana. Chaque compte Solana possède une adresse unique utilisée pour localiser les données onchain du compte. Les comptes Solana contiennent soit des données d'état, soit un programme exécutable.
Récupérer un compte de portefeuille
Un compte de portefeuille est un compte appartenant au System Program. Les comptes de portefeuille sont principalement utilisés pour détenir des SOL et signer des transactions. Lorsque des SOL sont envoyés pour la première fois à une nouvelle adresse, un compte système est automatiquement créé.
L'exemple ci-dessous crée un client Kit, génère un nouveau signataire, demande des SOL pour alimenter la nouvelle adresse, et récupère les données du compte depuis l'API RPC du client.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop());const signer = await generateKeyPairSigner();console.log(`Address: ${signer.address}`);// Funding an address with SOL automatically creates an accountawait client.airdrop(signer.address, lamports(1_000_000_000n));const accountInfo = await client.rpc.getAccountInfo(signer.address).send();console.log(accountInfo);
Lorsque vous récupérez un compte de portefeuille avec getAccountInfo(), Kit
renvoie la réponse RPC affichée dans l'exemple de sortie à droite.
La réponse comporte deux champs de premier niveau : context décrit le moment
où la lecture a eu lieu, et value contient les champs du compte renvoyés par
la méthode RPC.
Le champ context indique le slot utilisé pour lire le compte ainsi que la
version de l'API RPC qui a servi la réponse. Une lecture ultérieure peut
renvoyer un slot ou une version d'API différent.
Le champ value contient l'état du compte renvoyé par la méthode RPC. Les
étapes suivantes détaillent les champs contenus dans value dans l'ordre où ils
apparaissent.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Le champ lamports contient le solde SOL du compte, mesuré en
lamports, la plus petite unité de SOL.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Le champ data contient les données du compte stockées sous forme d'octets. Le
RPC retourne les données du compte sous forme de tuple : la chaîne de données
encodée, suivie de l'encodage. Pour les comptes portefeuille, la chaîne de
données encodée est vide car le compte stocke 0 octet de données.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Le champ owner indique le programme propriétaire du compte. Pour les
portefeuilles, le propriétaire est toujours le System Program, avec l'adresse
11111111111111111111111111111111.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Le champ executable indique si l'adresse du compte est appelable. true
signifie que l'adresse représente un programme pouvant traiter des instructions.
false signifie que le compte stocke un état, tel qu'un solde de portefeuille
ou des données de compte, et n'est pas appelé en tant que programme. Les comptes
portefeuille utilisent false.
Le champ rentEpoch est un champ hérité d'un mécanisme de rent obsolète. Ce
champ est toujours retourné pour des raisons de compatibilité ascendante.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Le champ space indique le nombre d'octets contenus dans le champ data. Le
champ space est retourné avec la réponse de récupération du compte, mais il ne
fait pas partie du type de données du compte.
Pour l'exemple du compte portefeuille, le champ space est 0 car le champ
data contient 0 octet de données.
{context: {slot: 420602714n,apiVersion: "3.1.6"},value: {lamports: 1000000000n,data: ["", "base64"],owner: "11111111111111111111111111111111",executable: false,rentEpoch: 0n,space: 0n}}
Récupérer le Token Program
L'exemple ci-dessous récupère le Token Program pour illustrer la différence entre les comptes de portefeuille et les comptes de programme. Le Token Program définit des instructions pour travailler avec des tokens, comme la création et le transfert de tokens. Les programmes sont invoqués pour traiter les instructions. L'état du programme, tel que les données de tokens et les soldes, est stocké dans des comptes séparés appartenant au programme.
L'adresse du Token Program est le program account onchain. Pour simplifier, vous pouvez considérer l'adresse du programme comme le programme lui-même, car c'est cette adresse qui est utilisée pour l'invoquer. Pour les programmes évolutifs, le program account stocke des métadonnées et pointe vers un programdata account distinct qui contient le code exécutable déployé. Vous pouvez consulter le code source du Token Program source code ainsi que le program account sur le Solana Explorer.
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const tokenProgramAddress = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await client.rpc.getAccountInfo(tokenProgramAddress, {encoding: "base64"}).send();console.log(accountInfo);const parsedAccount = await fetchJsonParsedAccount(client.rpc,tokenProgramAddress);console.log(parsedAccount);
Le Token Program est un program account exécutable. Les programmes partagent les mêmes champs de base que tous les comptes, mais présentent des différences clés.
L'exemple du Token Program utilise l'encodage base64 pour retourner les
données brutes du program account.
Les étapes suivantes parcourent les champs contenus dans value dans l'ordre où
ils apparaissent.
Le champ data stocke l'état du program account du BPF Upgradeable Loader. Le
premier élément du tuple contient les données complètes du compte encodées en
base64. Le second élément du tuple identifie l'encodage. Ici, les 36 octets
comprennent les métadonnées et l'adresse du programdata account.
Pour les programmes évolutifs, l'état du program account pointe vers le programdata account distinct qui contient le code exécutable du programme.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Le champ executable est défini sur true, ce qui indique que l'adresse du
compte peut être invoquée en tant que programme.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Le champ lamports contient le solde en SOL détenu par le program account. Les
program accounts doivent disposer de suffisamment de lamports pour rester
exempts de rent.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Chaque program account est détenu par un
programme chargeur.
Pour le Token Program account, le owner est le BPF Upgradeable Loader.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Le champ rentEpoch est un champ hérité d'un mécanisme de rent obsolète. Ce
champ est toujours retourné pour des raisons de compatibilité ascendante.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
Le champ space indique la taille totale des données du program account en
octets. La valeur space est seulement de 36 octets, car le program account
stocke les métadonnées du chargeur et l'adresse du programdata account, et non
le programme compilé complet.
{context: {apiVersion: "3.1.14",slot: 420601581n},value: {data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],executable: true,lamports: 2191440n,owner: "BPFLoaderUpgradeab1e11111111111111111111111",rentEpoch: 18446744073709551615n,space: 36n}}
La réponse précédente a retourné le champ data du program account sous forme
de tuple base64. La réponse désérialisée décode ces octets en champs nommés sur
l'objet data. Le champ programData contient l'adresse du programdata account
qui stocke le code du programme exécutable.
{executable: true,lamports: 43712780n,programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",space: 36n,address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",data: {programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }},exists: true}
Récupérer un mint account
Un mint account est un compte appartenant au Token Program qui stocke les métadonnées globales d'un token spécifique. Le mint account stocke l'offre totale du token, le nombre de décimales, l'autorité de frappe et l'autorité de gel. L'adresse du mint account identifie de manière unique un token sur le réseau Solana.
L'exemple ci-dessous récupère le mint account USD Coin pour illustrer comment l'état d'un programme est stocké dans un compte séparé. Les soldes exacts et les valeurs d'offre peuvent varier selon le slot lu par votre nœud RPC.
import { address, createClient } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await client.rpc.getAccountInfo(mintAddress, {encoding: "base64"}).send();console.log(accountInfo);
Les mint accounts stockent l'état, et non du code exécutable. Les mint accounts appartiennent au Token Program, qui contient les instructions définissant comment créer et mettre à jour les mint accounts.
Les étapes suivantes décrivent les champs de value dans l'ordre où ils
apparaissent.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Le champ data contient l'état sérialisé du compte Mint. Le premier élément
du tuple contient les 82 octets complets des données du compte encodées en
base64. Le second élément du tuple identifie l'encodage.
Pour lire depuis un mint account, vous devez désérialiser le champ data dans
le type de données Mint, comme illustré dans
l'exemple suivant.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Le champ executable indique si le compte peut être invoqué en tant que
programme. Les mint accounts stockent l'état, donc le champ executable vaut
false.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Le champ lamports contient le solde en SOL détenu par le mint account. La
valeur en lamports correspond au solde d'exemption de loyer du mint account, et
non à l'offre de tokens.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Le mint account est détenu par le
Token Program. Le champ data du
mint account ne peut être modifié que par les instructions du Token Program.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Le champ rentEpoch est un champ hérité d'un mécanisme de rent obsolète. Ce
champ est toujours retourné pour des raisons de compatibilité ascendante.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Le champ space indique que le mint account contient 82 octets de données.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Désérialiser un mint account
Les données du compte sont stockées dans le champ data sous un format
sérialisé. Pour lire ces données sous forme de champs tels que supply ou
decimals, désérialisez le champ data dans le type de compte défini par le
programme propriétaire. La plupart des programmes Solana fournissent des
bibliothèques client avec des fonctions utilitaires pour cette étape. Ces
utilitaires retournent des données de compte structurées, rendant le résultat
plus facile à manipuler.
Par exemple, la bibliothèque @solana-program/token inclut la fonction
fetchMint() pour récupérer un mint account et désérialiser
le champ data du mint account dans le type de données
Mint
défini par le Token Program.
import { address, createClient } from "@solana/kit";import { solanaRpc } from "@solana/kit-plugin-rpc";import { generatedPayer } from "@solana/kit-plugin-signer";import { fetchMint } from "@solana-program/token";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "https://api.mainnet.solana.com"}));const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mint = await fetchMint(client.rpc, mintAddress);console.log(mint);
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>,}
La fonction fetchMint() récupère un mint account et désérialise le champ
data du mint account dans le type de compte Mint.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Vous pouvez consulter les données entièrement désérialisées du mint account sur le Solana Explorer.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ address contient l'adresse du mint account.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ data contient l'état désérialisé du compte Mint. Les champs
imbriqués dans data proviennent du type de compte Mint du Token Program.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ data.mintAuthority indique le seul compte autorisé à créer de
nouvelles unités du token.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ supply indique le nombre total de tokens qui ont été émis. La valeur
de l'offre est exprimé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.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ decimals indique le nombre de décimales du token.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ isInitialized indique si le mint account a été initialisé. Le champ
isInitialized est une vérification de sécurité utilisée dans le Token Program.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ data.freezeAuthority indique le compte ayant l'autorité pour geler
les token accounts. Un token account
est un compte distinct qui stocke des unités d'un token pour un propriétaire.
Lorsqu'il est gelé, un token account ne peut pas transférer ni brûler son solde
de tokens.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ executable est false. Le mint account USDC stocke l'état du token,
donc le mint account USDC ne peut pas être invoqué en tant que programme.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ lamports contient le solde en SOL détenu par le mint account. La
valeur en lamports correspond au solde exempt de loyer du mint account, et non à
l'offre de tokens.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ programAddress indique le programme qui possède le mint account. Pour
l'USDC, le programme propriétaire est le Token Program. Seul le programme qui
possède un compte peut modifier son champ data via les instructions déployées
du programme.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Le champ space indique la taille des données originales du mint account en
octets. Le compte Mint de base du Token Program occupe 82 octets.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Sortie sérialisée vs désérialisée
Les deux exemples lisent le même mint account USDC. La première réponse laisse
le champ data sérialisé. Pour lire le contenu du mint account, décodez ces
données selon le type de compte défini par le programme propriétaire. Pour un
mint account, le Token Program définit le type Mint illustré à droite.
Avant le décodage, le champ data contient les
données de compte sérialisées.
{context: {slot: 325000000n,apiVersion: "3.1.14"},value: {data: ["AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==","base64"],executable: false,lamports: 407438077149n,owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",rentEpoch: 18446744073709551615n,space: 82n}}
Après le décodage des données en tant que Mint, le champ
data contient les champs de compte nommés.
{address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",data: {mintAuthority: {__option: "Some",value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"},supply: 8985397351591790n,decimals: 6,isInitialized: true,freezeAuthority: {__option: "Some",value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"}},executable: false,lamports: 407438077149n,programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",space: 82n}
Is this page helpful?