Структура аккаунта

Сводка

Аккаунты имеют 5 полей: lamports, data, owner, executable и rent_epoch. Каждый аккаунт идентифицируется уникальным 32-байтовым адресом. Для того чтобы аккаунт оставался в сети, на нем должен храниться минимальный баланс lamport, пропорциональный размеру данных.

Адрес аккаунта

Каждый адрес аккаунта — это 32-байтовое значение, отображаемое в виде строки, закодированной в base58. Адрес может быть одного из двух типов:

  1. Публичный ключ: соответствует Ed25519 keypair (имеет приватный ключ)
  2. Program derived address (PDA): детерминированно вычисляется из ID программы и seed-значений (не имеет приватного ключа)

Аккаунт с публичным ключом, закодированным в base58, в качестве адресаАккаунт с публичным ключом, закодированным в base58, в качестве адреса

Публичный ключ

Keypair состоит из публичного ключа (используется как адрес аккаунта) и приватного ключа (используется для подписи транзакций). В следующем примере создается keypair с помощью Solana SDK.

import { generateKeyPairSigner } from "@solana/kit";
// Kit does not enable extractable private keys
const keypairSigner = await generateKeyPairSigner();
console.log(keypairSigner);
Console
Click to execute the code.

Program derived address

Program derived address (PDA) детерминированно вычисляется из ID программы и одного или нескольких дополнительных seed-значений. У PDA нет соответствующего приватного ключа. В следующем примере показано, как получить PDA с помощью Solana SDK.

import { Address, getProgramDerivedAddress } from "@solana/kit";
const programAddress = "11111111111111111111111111111111" as Address;
const seeds = ["helloWorld"];
const [pda, bump] = await getProgramDerivedAddress({
programAddress,
seeds
});
console.log(`PDA: ${pda}`);
console.log(`Bump: ${bump}`);
Console
Click to execute the code.

Поля аккаунта

Каждый Account имеет максимальный размер MAX_ACCOUNT_DATA_LEN (10 Миб, что эквивалентно MAX_PERMITTED_DATA_LENGTH) и содержит пять полей:

ПолеТипОписание
lamportsu64Баланс в lamports. Владелец может списывать; любая программа может зачислять.
dataVec<u8>Состояние аккаунта или байткод программы. Макс. 10 Миб. Только владелец может изменять.
ownerPubkeyПрограмма с правом записи. Можно переназначить только при обнулённых данных.
executableboolTrue = program account.
rent_epochEpochУстарело. Устанавливается в u64::MAX для аккаунтов, освобождённых от rent.
Account
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// if true, this account's data contains a program (and is now read-only)
pub executable: bool,
/// deprecated
pub rent_epoch: Epoch,
}

Lamports

Поле lamports содержит баланс аккаунта в lamports (1 SOL = 1 000 000 000 lamports).

Каждый аккаунт должен поддерживать минимальный баланс в lamports, называемый балансом для освобождения от rent, чтобы его данные хранились в блокчейне. Этот баланс пропорционален размеру данных аккаунта.

Хотя это часто называют "rent", баланс для освобождения от rent фактически является возвратным депозитом: вся сумма возвращается при закрытии аккаунта.

См. minimum_balance() и константы rent constants.

Data

Поле data хранит произвольный массив байтов. Его содержимое зависит от типа аккаунта:

  • Program accounts: содержит исполняемый байткод или адрес program data account, который хранит байткод.
  • Data accounts: содержит определённые программой данные состояния. Формат сериализации задаётся программой-владельцем.

Чтение данных аккаунта требует двух шагов:

  1. Получить аккаунт по его адресу.
  2. Десериализовать поле data из сырых байтов в структуру данных, определённую программой.

Владелец

Поле owner содержит program ID (публичный ключ) программы, которая владеет этим аккаунтом.

Только программа-владелец может:

  • Изменять поле data аккаунта
  • Списывать лампорты с поля lamports аккаунта

Любая программа может добавить лампорты на другой аккаунт, но только владелец может списывать лампорты с него.

Для program accounts владельцем является loader program аккаунта.

Исполняемый

Поле executable — это булево значение, определяющее, является ли аккаунт program account или data account:

  • true = program account (содержит исполняемый код)
  • false = data account (хранит состояние)

Эпоха аренды

Поле rent_epoch устарело.

Ранее отслеживало, когда с аккаунта автоматически списывались лампорты для оплаты хранения данных в блокчейне. Поскольку сбор rent устарел, rent_epoch устанавливается в u64::MAX для всех новых аккаунтов, освобождённых от rent.

Lamports

Поле lamports содержит баланс аккаунта в lamports (1 SOL = 1 000 000 000 lamports).

Каждый аккаунт должен поддерживать минимальный баланс в lamports, называемый балансом для освобождения от rent, чтобы его данные хранились в блокчейне. Этот баланс пропорционален размеру данных аккаунта.

Хотя это часто называют "rent", баланс для освобождения от rent фактически является возвратным депозитом: вся сумма возвращается при закрытии аккаунта.

См. minimum_balance() и константы rent constants.

Data

Поле data хранит произвольный массив байтов. Его содержимое зависит от типа аккаунта:

  • Program accounts: содержит исполняемый байткод или адрес program data account, который хранит байткод.
  • Data accounts: содержит определённые программой данные состояния. Формат сериализации задаётся программой-владельцем.

Чтение данных аккаунта требует двух шагов:

  1. Получить аккаунт по его адресу.
  2. Десериализовать поле data из сырых байтов в структуру данных, определённую программой.

Владелец

Поле owner содержит program ID (публичный ключ) программы, которая владеет этим аккаунтом.

Только программа-владелец может:

  • Изменять поле data аккаунта
  • Списывать лампорты с поля lamports аккаунта

Любая программа может добавить лампорты на другой аккаунт, но только владелец может списывать лампорты с него.

Для program accounts владельцем является loader program аккаунта.

Исполняемый

Поле executable — это булево значение, определяющее, является ли аккаунт program account или data account:

  • true = program account (содержит исполняемый код)
  • false = data account (хранит состояние)

Эпоха аренды

Поле rent_epoch устарело.

Ранее отслеживало, когда с аккаунта автоматически списывались лампорты для оплаты хранения данных в блокчейне. Поскольку сбор rent устарел, rent_epoch устанавливается в u64::MAX для всех новых аккаунтов, освобождённых от rent.

Account Examples
// Example Token Mint Account
Account {
lamports: 1461600,
data.len: 82,
owner: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb,
executable: false,
rent_epoch: 0,
data: 010000001e213c90625a7e643d9555bb01b6c3fe6416d7afd523ce8c7ddd9b923ceafb9d00000000000000000901010000001e213c90625a7e643d9555bb01b6,
}
// Example Token Program Account
Account {
lamports: 4513200894,
data.len: 134080,
owner: BPFLoader2111111111111111111111111111111111,
executable: true,
rent_epoch: 18446744073709551615,
data: 7f454c460201010000000000000000000300f70001000000d8f90000000000004000000000000000800902000000000000000000400038000400400009000800,
}

Is this page helpful?

Содержание

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

Управляется

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