Типи облікових записів

Підсумок

Програмні облікові записи містять виконуваний sBPF-код. Облікові записи даних зберігають стан, що належить програмам. Системні облікові записи належать System Program. Sysvars надають стан кластера, доступний за попередньо визначеними адресами.

Поле executable визначає категорію облікового запису:

Це розділення коду від змінюваного стану означає, що програма розгортається один раз і може керувати будь-якою кількістю облікових записів даних.

Програмні облікові записи

Програмний обліковий запис зберігає виконуваний код. Кожен програмний обліковий запис належить програмі-завантажувачу. Коли програма розгортається, середовище виконання створює програмний обліковий запис для зберігання її байт-коду.

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

Облікові записи даних програми

Програми, розгорнуті за допомогою loader-v3 (див. Програми-завантажувачі), не зберігають виконуваний байт-код у власному полі data. Натомість їхнє поле data вказує на окремий обліковий запис даних програми, що містить код програми. (Див. діаграму нижче.)

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

Під час розгортання або оновлення програми буферні облікові записи використовуються для тимчасового етапного завантаження.

Наступний приклад отримує обліковий запис Token Program. Поле executable дорівнює true, що підтверджує, що це програмний обліковий запис.

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.

Акаунти даних

Акаунти даних не містять виконуваного коду. Вони зберігають стан, визначений програмою.

Акаунт стану програми

Програми зберігають свій стан в акаунтах даних. Створення акаунта стану програми включає два кроки:

  1. Викликати системну програму, щоб створити акаунт. Системна програма передає право власності вказаній програмі.
  2. Програма-власник ініціалізує поле data акаунта відповідно до своїх інструкцій.

Діаграма акаунта даних, що належить program accountДіаграма акаунта даних, що належить program account

Наступний приклад створює та отримує mint account токена, що належить програмі 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.

Системні акаунти

Акаунти, які залишаються у власності системної програми після створення, називаються системними акаунтами. Надсилання SOL на нову адресу вперше створює новий акаунт за цією адресою, що належить системній програмі.

Усі акаунти гаманців є системними акаунтами. Платник комісії в транзакції має бути системним акаунтом, оскільки лише акаунти, що належать системній програмі, можуть сплачувати комісії за транзакції.

Гаманець, що належить системній програмі, містить 1 000 000 lamportsГаманець, що належить системній програмі, містить 1 000 000 lamports

Наступний приклад генерує нову keypair, поповнює її SOL і отримує акаунт. Поле owner має значення 11111111111111111111111111111111 (системна програма).

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.

Облікові записи Sysvar

Облікові записи Sysvar є спеціальними обліковими записами за заздалегідь визначеними адресами, які надають доступ лише для читання до даних стану кластера. Вони динамічно оновлюються кожен slot.

SysvarАдресаПризначення
ClockSysvarC1ock11111111111111111111111111111111Поточний slot, epoch та мітка часу Unix
EpochScheduleSysvarEpochSchedu1e111111111111111111111111Константи планування epoch, встановлені в genesis
EpochRewardsSysvarEpochRewards1111111111111111111111111Статус та прогрес розподілу винагород epoch
RentSysvarRent111111111111111111111111111111111Ставка rent та поріг звільнення
SlotHashesSysvarS1otHashes111111111111111111111111111Найновіші хеші батьківських банків slot'а
StakeHistorySysvarStakeHistory1111111111111111111111111Активації та деактивації стейкінгу за epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111Останній slot перезапуску кластера
InstructionsSysvar1nstructions1111111111111111111111111Серіалізовані інструкції поточної транзакції
SlotHistorySysvarS1otHistory11111111111111111111111111Запис про те, які slot'и були створені протягом останнього epoch

Наступний приклад отримує та десеріалізує обліковий запис 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?

Зміст

Редагувати сторінку

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку