Tipi di account

Riepilogo

I program account contengono codice eseguibile sBPF. I data account memorizzano lo stato, di proprietà dei programmi. I system account sono di proprietà del System Program. I sysvar forniscono lo stato a livello di cluster accessibile a indirizzi predefiniti.

Il campo executable determina la categoria di un account:

  • Program account: executable = true. Contiene codice eseguibile.
  • Data account: executable = false. Memorizza lo stato o i dati utente.

Questa separazione del codice dallo stato mutabile significa che un programma viene distribuito una volta e può gestire un numero qualsiasi di data account.

Program account

Un program account memorizza codice eseguibile. Ogni program account è di proprietà di un loader program. Quando un programma viene distribuito, il runtime crea un program account per contenere il suo bytecode.

Diagram of a program account, its 4 components and its loader program.Diagram of a program account, its 4 components and its loader program.

Program data account

I programmi distribuiti utilizzando loader-v3 (vedi Loader program) non memorizzano il bytecode eseguibile nel proprio campo data. Invece, il loro data punta a un program data account separato che contiene il codice del programma. (Vedi il diagramma qui sotto.)

A program account with data. The data points to a separate program data accountA program account with data. The data points to a separate program data account

Durante la distribuzione o gli aggiornamenti del programma, i buffer account vengono utilizzati per preparare temporaneamente il caricamento.

L'esempio seguente recupera il Token Program account. Il campo executable è true, confermando che si tratta di un program account.

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

Data account

I data account non contengono codice eseguibile. Memorizzano lo stato definito dal programma.

Program state account

I programmi memorizzano il loro stato nei data account. La creazione di un program state account prevede due passaggi:

  1. Invoca il System Program per creare l'account. Il System Program trasferisce la proprietà al programma specificato.
  2. Il programma proprietario inizializza il campo data dell'account secondo le sue istruzioni.

Diagram of a data account owned by a program accountDiagram of a data account owned by a program account

L'esempio seguente crea e recupera un mint account Token di proprietà del programma Token 2022.

import {
airdropFactory,
appendTransactionMessageInstructions,
createSolanaRpc,
createSolanaRpcSubscriptions,
createTransactionMessage,
generateKeyPairSigner,
getSignatureFromTransaction,
lamports,
pipe,
sendAndConfirmTransactionFactory,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners
} from "@solana/kit";
import { getCreateAccountInstruction } from "@solana-program/system";
import {
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS,
fetchMint
} from "@solana-program/token-2022";
// Create Connection, local validator in this example
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
// Generate keypairs for fee payer
const feePayer = await generateKeyPairSigner();
// Fund fee payer
await airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: feePayer.address,
lamports: lamports(1_000_000_000n),
commitment: "confirmed"
});
// 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 rpc.getMinimumBalanceForRentExemption(space).send();
// Instruction to create new account for mint (token 2022 program)
// Invokes the system program
const createAccountInstruction = getCreateAccountInstruction({
payer: feePayer,
newAccount: mint,
lamports: rent,
space,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
});
// Instruction to initialize mint account data
// Invokes the token 2022 program
const initializeMintInstruction = getInitializeMintInstruction({
mint: mint.address,
decimals: 9,
mintAuthority: feePayer.address
});
const instructions = [createAccountInstruction, initializeMintInstruction];
// Get latest blockhash to include in transaction
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
// Create transaction message
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }), // Create transaction message
(tx) => setTransactionMessageFeePayerSigner(feePayer, tx), // Set fee payer
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), // Set transaction blockhash
(tx) => appendTransactionMessageInstructions(instructions, tx) // Append instructions
);
// Sign transaction message with required signers (fee payer and mint keypair)
const signedTransaction =
await signTransactionMessageWithSigners(transactionMessage);
// Send and confirm transaction
await sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(
signedTransaction,
{ commitment: "confirmed" }
);
// Get transaction signature
const transactionSignature = getSignatureFromTransaction(signedTransaction);
console.log("Mint Address:", mint.address);
console.log("Transaction Signature:", transactionSignature);
const accountInfo = await rpc.getAccountInfo(mint.address).send();
console.log(accountInfo);
const mintAccount = await fetchMint(rpc, mint.address);
console.log(mintAccount);
Console
Click to execute the code.

System account

Gli account che rimangono di proprietà del System Program dopo la creazione sono chiamati system account. L'invio di SOL a un nuovo indirizzo per la prima volta crea un nuovo account a quell'indirizzo di proprietà del System Program.

Tutti i wallet account sono system account. Il fee payer di una transazione deve essere un system account, perché solo gli account di proprietà del System Program possono pagare le commissioni di transazione.

A wallet owned by the System Program containing 1,000,000 lamportsA wallet owned by the System Program containing 1,000,000 lamports

L'esempio seguente genera una nuova keypair, la finanzia con SOL e recupera l'account. Il campo owner è 11111111111111111111111111111111 (il System Program).

import {
airdropFactory,
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports
} from "@solana/kit";
// Create a connection to Solana cluster
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
// 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 airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: keypair.address,
lamports: lamports(1_000_000_000n),
commitment: "confirmed"
});
const accountInfo = await rpc.getAccountInfo(keypair.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Account sysvar

Gli account sysvar sono account speciali a indirizzi predefiniti che forniscono accesso in sola lettura ai dati di stato del cluster. Si aggiornano dinamicamente ad ogni slot.

SysvarIndirizzoScopo
ClockSysvarC1ock11111111111111111111111111111111Slot corrente, epoch e timestamp Unix
EpochScheduleSysvarEpochSchedu1e111111111111111111111111Costanti di pianificazione epoch impostate in genesis
EpochRewardsSysvarEpochRewards1111111111111111111111111Stato e progresso della distribuzione delle ricompense epoch
RentSysvarRent111111111111111111111111111111111Tariffa di rent e soglia di esenzione
SlotHashesSysvarS1otHashes111111111111111111111111111Hash più recenti delle bank parent dello slot
StakeHistorySysvarStakeHistory1111111111111111111111111Attivazioni e disattivazioni di stake per epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111Ultimo slot di riavvio del cluster
InstructionsSysvar1nstructions1111111111111111111111111Istruzioni serializzate della transazione corrente
SlotHistorySysvarS1otHistory11111111111111111111111111Registro degli slot prodotti durante l'ultima epoch

L'esempio seguente recupera e deserializza l'account Sysvar Clock.

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

Is this page helpful?

Indice dei contenuti

Modifica pagina

Gestito da

© 2026 Solana Foundation.
Tutti i diritti riservati.
Resta connesso