Types de comptes

Résumé

Les comptes de programme contiennent du code sBPF exécutable. Les comptes de données stockent l'état, détenus par les programmes. Les comptes système sont détenus par le System Program. Les sysvars fournissent un état à l'échelle du cluster accessible à des adresses prédéfinies.

Le champ executable détermine la catégorie d'un compte :

Cette séparation du code et de l'état mutable signifie qu'un programme est déployé une seule fois et peut gérer un nombre illimité de comptes de données.

Comptes de programme

Un compte de programme stocke du code exécutable. Chaque compte de programme est détenu par un programme chargeur. Lorsqu'un programme est déployé, le runtime crée un compte de programme pour contenir son bytecode.

Diagramme d'un compte de programme, ses 4 composants et son programme chargeur.Diagramme d'un compte de programme, ses 4 composants et son programme chargeur.

Comptes de données de programme

Les programmes déployés avec loader-v3 (voir Programmes chargeurs) ne stockent pas le bytecode exécutable dans leur propre champ data. Au lieu de cela, leur data pointe vers un compte de données de programme séparé qui contient le code du programme. (Voir le diagramme ci-dessous.)

Un compte de programme avec des données. Les données pointent vers un compte de données de programme séparéUn compte de programme avec des données. Les données pointent vers un compte de données de programme séparé

Pendant le déploiement ou les mises à niveau du programme, des comptes tampons sont utilisés pour préparer temporairement le téléchargement.

L'exemple suivant récupère le compte du Token Program. Le champ executable est true, confirmant qu'il s'agit d'un compte de programme.

import { Address, generateKeyPairSigner } from "@solana/kit";
import { createClient } from "@solana/kit-client-rpc";
const feePayer = await generateKeyPairSigner();
const client = createClient({
url: "https://api.mainnet.solana.com",
payer: feePayer
});
const programId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address;
const accountInfo = await client.rpc
.getAccountInfo(programId, { encoding: "base64" })
.send();
console.log(accountInfo);
Console
Click to execute the code.

Comptes de données

Les comptes de données ne contiennent pas de code exécutable. Ils stockent l'état défini par le programme.

Compte d'état de programme

Les programmes stockent leur état dans des comptes de données. La création d'un compte d'état de programme implique deux étapes :

  1. Invoquer le System Program pour créer le compte. Le System Program transfère la propriété au programme spécifié.
  2. Le programme propriétaire initialise le champ data du compte selon ses instructions.

Diagramme d'un compte de données détenu par un program accountDiagramme d'un compte de données détenu par un program account

L'exemple suivant crée et récupère un mint account de jeton détenu par le programme Token 2022.

import { generateKeyPairSigner } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
import { systemProgram } from "@solana-program/system";
import {
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS,
fetchMint
} from "@solana-program/token-2022";
const client = await createLocalClient().use(systemProgram());
// Generate keypair to use as address of mint
const mint = await generateKeyPairSigner();
// Get default mint account size (in bytes), no extensions enabled
const space = BigInt(getMintSize());
// Get minimum balance for rent exemption
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
const transactionSignature = await client.sendTransaction([
client.system.instructions.createAccount({
newAccount: mint,
lamports: rent,
space,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
}),
getInitializeMintInstruction({
mint: mint.address,
decimals: 9,
mintAuthority: client.payer.address
})
]);
console.log("Mint Address:", mint.address);
console.log("Transaction Signature:", transactionSignature.context.signature);
const accountInfo = await client.rpc.getAccountInfo(mint.address).send();
console.log(accountInfo);
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log(mintAccount);
Console
Click to execute the code.

Comptes système

Les comptes qui restent détenus par le System Program après leur création sont appelés comptes système. L'envoi de SOL vers une nouvelle adresse pour la première fois crée un nouveau compte à cette adresse détenu par le System Program.

Tous les comptes de portefeuille sont des comptes système. Le payeur de frais d'une transaction doit être un compte système, car seuls les comptes détenus par le System Program peuvent payer les frais de transaction.

Un portefeuille détenu par le System Program contenant 1 000 000 lamportsUn portefeuille détenu par le System Program contenant 1 000 000 lamports

L'exemple suivant génère une nouvelle keypair, la finance avec des SOL et récupère le compte. Le champ owner est 11111111111111111111111111111111 (le System Program).

import { generateKeyPairSigner, lamports } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
const client = await createLocalClient();
// Generate a new keypair
const keypair = await generateKeyPairSigner();
console.log(`Public Key: ${keypair.address}`);
// Funding an address with SOL automatically creates an account
const signature = await client.airdrop(
keypair.address,
lamports(1_000_000_000n)
);
const accountInfo = await client.rpc.getAccountInfo(keypair.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Comptes sysvar

Les comptes sysvar sont des comptes spéciaux à des adresses prédéfinies qui fournissent un accès en lecture seule aux données d'état du cluster. Ils se mettent à jour dynamiquement à chaque slot.

SysvarAdresseObjectif
ClockSysvarC1ock11111111111111111111111111111111Slot actuel, epoch et horodatage Unix
EpochScheduleSysvarEpochSchedu1e111111111111111111111111Constantes de planification d'epoch définies dans la genèse
EpochRewardsSysvarEpochRewards1111111111111111111111111Statut et progression de la distribution des récompenses d'epoch
RentSysvarRent111111111111111111111111111111111Taux de rent et seuil d'exonération
SlotHashesSysvarS1otHashes111111111111111111111111111Hachages les plus récents des banques parentes du slot
StakeHistorySysvarStakeHistory1111111111111111111111111Activations et désactivations de stake par epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111Dernier slot de redémarrage du cluster
InstructionsSysvar1nstructions1111111111111111111111111Instructions sérialisées de la transaction en cours
SlotHistorySysvarS1otHistory11111111111111111111111111Enregistrement des slots produits au cours du dernier epoch

L'exemple suivant récupère et désérialise le compte Sysvar Clock.

import { generateKeyPairSigner } from "@solana/kit";
import { createClient } from "@solana/kit-client-rpc";
import { fetchSysvarClock, SYSVAR_CLOCK_ADDRESS } from "@solana/sysvars";
const feePayer = await generateKeyPairSigner();
const client = createClient({
url: "https://api.mainnet.solana.com",
payer: feePayer
});
const accountInfo = await client.rpc
.getAccountInfo(SYSVAR_CLOCK_ADDRESS, { encoding: "base64" })
.send();
console.log(accountInfo);
// Automatically fetch and deserialize the account data
const clock = await fetchSysvarClock(client.rpc);
console.log(clock);
Console
Click to execute the code.

Is this page helpful?

Table des matières

Modifier la page

Géré par

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