Активы на Solana

Токены — это цифровые активы, которые представляют право собственности на различные категории активов. Токенизация позволяет оцифровать права собственности. Токены в Solana называются SPL (Solana Program Library) токенами.

The Token Program updates a mint and its token accounts while owners authorize balance changes

В этом разделе рассматриваются базовые концепции представления токенов в Solana. Для примеров кода обратитесь к разделу Основы SPL Token.

Основные моменты

  • Token Programs содержат всю логику инструкций для взаимодействия с токенами в сети (как взаимозаменяемыми, так и невзаимозаменяемыми).

  • Mint Account представляет конкретный токен и хранит глобальные метаданные о токене, такие как общий объем выпуска и полномочия на выпуск (адрес, уполномоченный создавать новые единицы токена).

  • Token Account отслеживает индивидуальное владение токенами для конкретного mint account и конкретного владельца.

  • Associated Token Account — это Token Account, созданный с адресом, полученным на основе адресов владельца и mint account.

Token Programs

В экосистеме Solana есть две основные Token Programs. Исходный код обеих программ ниже.

Token Programs содержат всю логику инструкций для взаимодействия с токенами в сети (как взаимозаменяемыми, так и невзаимозаменяемыми). Все токены на Solana фактически являются аккаунтами данных, принадлежащими Token Program.

Token ProgramToken Program

Mint Account

Токены в Solana уникально идентифицируются по адресу Mint Account, принадлежащего Token Program. Этот аккаунт выступает в роли глобального счетчика для конкретного токена и хранит такие данные, как:

  • Supply: общий объем выпуска токена
  • Decimals: количество знаков после запятой у токена
  • Mint authority: аккаунт, уполномоченный создавать новые единицы токена, увеличивая его объем
  • Freeze authority: аккаунт, уполномоченный замораживать токены в Token Account, предотвращая их перевод или сжигание

Полномочия на выпуск (mint authority) настраиваются при инициализации mint account. Они дают право на дальнейший выпуск токенов, однако этот аккаунт не обязательно должен совпадать с тем, который создал или оплатил mint account.

Mint AccountMint Account

Полная информация, хранящаяся в каждом mint account, включает следующее:

Mint Account State
pub struct Mint {
/// Optional authority used to mint new tokens. The mint authority may only
/// be provided during mint creation. If no mint authority is present
/// then the mint has a fixed supply and no further tokens may be
/// minted.
pub mint_authority: COption<Pubkey>,
/// Total supply of tokens.
pub supply: u64,
/// Number of base 10 digits to the right of the decimal place.
pub decimals: u8,
/// Is `true` if this structure has been initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

Для справки: вот ссылка в Solana Explorer на USDC Mint Account.

Token Account

Token Program создает Token Accounts для отслеживания индивидуального владения каждой единицей токена. Token Account хранит такие данные, как:

  • Mint: токен, единицы которого хранятся в Token Account
  • Owner: аккаунт, уполномоченный переводить токены из Token Account
  • Amount: количество токенов, которые в данный момент находятся на Token Account

Token AccountToken Account

Полная информация, хранящаяся в каждом token account, включает следующее:

Token Account State
pub struct Account {
/// The mint associated with this account
pub mint: Pubkey,
/// The owner of this account.
pub owner: Pubkey,
/// The amount of tokens this account holds.
pub amount: u64,
/// If `delegate` is `Some` then `delegated_amount` represents
/// the amount authorized by the delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub state: AccountState,
/// If is_native.is_some, this is a native token, and the value logs the
/// rent-exempt reserve. An Account is required to be rent-exempt, so
/// the value is used by the Processor to ensure that wrapped SOL
/// accounts do not drop below this threshold.
pub is_native: COption<u64>,
/// The amount delegated
pub delegated_amount: u64,
/// Optional authority to close the account.
pub close_authority: COption<Pubkey>,
}

Для хранения каждого токена (mint) кошельку необходим отдельный token account, при этом адрес кошелька указывается как владелец token account. Один кошелек может иметь несколько token accounts для одного и того же токена (mint), но у каждого token account может быть только один владелец и храниться только один токен (mint).

Account RelationshipAccount Relationship

Обратите внимание, что данные каждого Token Account включают поле owner, определяющее, кто имеет права на этот Token Account. Это отличается от владельца программы, указанного в базовом типе Account, которым для всех Token Accounts является Token Program.

Associated Token Account

Ассоциированные токен-аккаунты упрощают процесс поиска адреса токен-аккаунта для конкретного mint и владельца. Можно считать ассоциированный токен-аккаунт «дефолтным» токен-аккаунтом для определённого mint и владельца.

Ассоциированный токен-аккаунт создаётся с адресом, полученным из адреса владельца и адреса mint account. Важно понимать, что ассоциированный токен-аккаунт — это просто токен-аккаунт с определённым адресом.

Это вводит ключевое понятие в разработке на Solana: Program Derived Address (PDA). PDA определяет адрес детерминированно, используя заранее заданные входные данные, что облегчает поиск адреса аккаунта.

Ассоциированный токен-аккаунтАссоциированный токен-аккаунт

Обратите внимание, что каждому кошельку нужен свой токен-аккаунт для хранения токенов одного и того же mint.

Расширенные отношения аккаунтовРасширенные отношения аккаунтов

Is this page helpful?

Содержание

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