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é.
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 accountconst 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));
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.
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.
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);
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.
{"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.
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é.
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);
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.
{"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.
{"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.
{"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.
{"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.
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");
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 getMint() désérialise le champ data d'un mint account dans
le type de compte Mint.
{"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).
Is this page helpful?