Сводка
Аккаунты имеют 5 полей: lamports, data, owner, executable и rent_epoch. Каждый аккаунт идентифицируется уникальным 32-байтовым адресом. Для того чтобы аккаунт оставался в сети, на нем должен храниться минимальный баланс lamport, пропорциональный размеру данных.
Адрес аккаунта
Каждый адрес аккаунта — это 32-байтовое значение, отображаемое в виде строки, закодированной в base58. Адрес может быть одного из двух типов:
- Публичный ключ: соответствует Ed25519 keypair (имеет приватный ключ)
- Program derived address (PDA): детерминированно вычисляется из ID программы и seed-значений (не имеет приватного ключа)
Аккаунт с публичным ключом, закодированным в base58, в качестве адреса
Публичный ключ
Keypair состоит из публичного ключа (используется как адрес аккаунта) и
приватного ключа (используется для подписи транзакций). В следующем примере
создается keypair с помощью Solana SDK.
import { generateKeyPairSigner } from "@solana/kit";// Kit does not enable extractable private keysconst keypairSigner = await generateKeyPairSigner();console.log(keypairSigner);
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}`);
Поля аккаунта
Каждый
Account
имеет максимальный размер
MAX_ACCOUNT_DATA_LEN
(10 Миб, что эквивалентно MAX_PERMITTED_DATA_LENGTH) и содержит пять
полей:
| Поле | Тип | Описание |
|---|---|---|
lamports | u64 | Баланс в lamports. Владелец может списывать; любая программа может зачислять. |
data | Vec<u8> | Состояние аккаунта или байткод программы. Макс. 10 Миб. Только владелец может изменять. |
owner | Pubkey | Программа с правом записи. Можно переназначить только при обнулённых данных. |
executable | bool | True = program account. |
rent_epoch | Epoch | Устарело. Устанавливается в u64::MAX для аккаунтов, освобождённых от rent. |
pub struct Account {/// lamports in the accountpub 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,/// deprecatedpub 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: содержит определённые программой данные состояния. Формат сериализации задаётся программой-владельцем.
Чтение данных аккаунта требует двух шагов:
- Получить аккаунт по его адресу.
- Десериализовать поле
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.
Is this page helpful?