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.
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 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, 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);
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:
- Invoca il System Program per creare l'account. Il System Program trasferisce la proprietà al programma specificato.
- Il programma proprietario inizializza il campo
datadell'account secondo le sue istruzioni.
Diagram 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 { 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 mintconst mint = await generateKeyPairSigner();// Get default mint account size (in bytes), no extensions enabledconst space = BigInt(getMintSize());// Get minimum balance for rent exemptionconst 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);
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 lamports
L'esempio seguente genera una nuova keypair, la finanzia con SOL e recupera
l'account. Il campo owner è 11111111111111111111111111111111 (il
System Program).
import { generateKeyPairSigner, lamports } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";const client = await createLocalClient();// Generate a new keypairconst keypair = await generateKeyPairSigner();console.log(`Public Key: ${keypair.address}`);// Funding an address with SOL automatically creates an accountconst signature = await client.airdrop(keypair.address,lamports(1_000_000_000n));const accountInfo = await client.rpc.getAccountInfo(keypair.address).send();console.log(accountInfo);
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.
| Sysvar | Indirizzo | Scopo |
|---|---|---|
| Clock | SysvarC1ock11111111111111111111111111111111 | Slot corrente, epoch e timestamp Unix |
| EpochSchedule | SysvarEpochSchedu1e111111111111111111111111 | Costanti di pianificazione epoch impostate in genesis |
| EpochRewards | SysvarEpochRewards1111111111111111111111111 | Stato e progresso della distribuzione delle ricompense epoch |
| Rent | SysvarRent111111111111111111111111111111111 | Tariffa di rent e soglia di esenzione |
| SlotHashes | SysvarS1otHashes111111111111111111111111111 | Hash più recenti delle bank parent dello slot |
| StakeHistory | SysvarStakeHistory1111111111111111111111111 | Attivazioni e disattivazioni di stake per epoch |
| LastRestartSlot | SysvarLastRestartS1ot1111111111111111111111 | Ultimo slot di riavvio del cluster |
| Instructions | Sysvar1nstructions1111111111111111111111111 | Istruzioni serializzate della transazione corrente |
| SlotHistory | SysvarS1otHistory11111111111111111111111111 | Registro degli slot prodotti durante l'ultima epoch |
L'esempio seguente recupera e deserializza l'account 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 dataconst clock = await fetchSysvarClock(client.rpc);console.log(clock);
Is this page helpful?