Типы аккаунтов

Кратко

Аккаунты программ содержат исполняемый sBPF-код. Аккаунты данных хранят состояние и принадлежат программам. Системные аккаунты принадлежат System Program. Sysvars предоставляют состояние кластера, доступное по предопределённым адресам.

Поле executable определяет категорию аккаунта:

Такое разделение кода и изменяемого состояния позволяет развернуть программу один раз и управлять любым количеством аккаунтов данных.

Аккаунты программ

Аккаунт программы хранит исполняемый код. Каждый аккаунт программы принадлежит загрузчику программ. Когда программа развёртывается, среда выполнения создаёт аккаунт программы для хранения её байткода.

Диаграмма аккаунта программы, его 4 компонентов и загрузчика.Диаграмма аккаунта программы, его 4 компонентов и загрузчика.

Аккаунты данных программ

Программы, развёрнутые с помощью loader-v3 (см. Загрузчики программ), не хранят исполняемый байткод в собственном поле data. Вместо этого их data указывает на отдельный аккаунт данных программы, который содержит код программы. (См. диаграмму ниже.)

Аккаунт программы с данными. Данные указывают на отдельный аккаунт данных программыАккаунт программы с данными. Данные указывают на отдельный аккаунт данных программы

Во время развёртывания или обновления программы используются буферные аккаунты для временной загрузки данных.

В следующем примере происходит получение аккаунта Token Program. Поле executable имеет значение true, что подтверждает: это аккаунт программы.

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.

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

Аккаунты данных не содержат исполняемого кода. Они хранят состояние, определяемое программой.

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

Программы хранят своё состояние в аккаунтах данных. Создание аккаунта состояния программы включает два шага:

  1. Вызвать System Program, чтобы создать аккаунт. System Program передаёт право собственности указанной программе.
  2. Владеющая программа инициализирует поле аккаунта data согласно своим инструкциям.

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

В следующем примере создаётся и запрашивается mint account токена, принадлежащий программе 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.

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

Аккаунты, которые после создания остаются во владении System Program, называются системными аккаунтами. Отправка SOL на новый адрес впервые создаёт новый аккаунт по этому адресу, принадлежащий System Program.

Все кошельки являются системными аккаунтами. Плательщик комиссии в транзакции должен быть системным аккаунтом, так как только аккаунты, принадлежащие System Program, могут оплачивать комиссии за транзакции.

Кошелёк, принадлежащий System Program, содержащий 1 000 000 лампортовКошелёк, принадлежащий System Program, содержащий 1 000 000 лампортов

В следующем примере создаётся новая keypair, пополняется SOL и запрашивается аккаунт. Поле owner равно 11111111111111111111111111111111 (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.

Системные аккаунты (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

В следующем примере выполняется получение и десериализация системного аккаунта 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?

Содержание

Редактировать страницу

Управляется

© 2026 Solana Foundation.
Все права защищены.
Связаться с нами