Токены — это цифровые активы, которые представляют право собственности на различные категории активов. Токенизация позволяет оцифровать права собственности. Токены в Solana называются SPL (Solana Program Library) токенами.
В этом разделе рассматриваются базовые концепции представления токенов в Solana. Для примеров кода обратитесь к разделу Основы SPL Token.
Основные моменты
-
Token Programs содержат всю логику инструкций для взаимодействия с токенами в сети (как взаимозаменяемыми, так и невзаимозаменяемыми).
-
Mint Account представляет конкретный токен и хранит глобальные метаданные о токене, такие как общий объем выпуска и полномочия на выпуск (адрес, уполномоченный создавать новые единицы токена).
-
Token Account отслеживает индивидуальное владение токенами для конкретного mint account и конкретного владельца.
-
Associated Token Account — это Token Account, созданный с адресом, полученным на основе адресов владельца и mint account.
Token Programs
В экосистеме Solana есть две основные Token Programs. Исходный код обеих программ ниже.
Token Program (Original)
- Базовые возможности работы с токенами (выпуск, перевод и др.)
- Неизменяемая и широко используемая
Token Extension Program (Token 2022)
- Включает все функции оригинальной Token Program
- Добавляет возможности через "расширения"
Token Programs содержат всю логику инструкций для взаимодействия с токенами в сети (как взаимозаменяемыми, так и невзаимозаменяемыми). Все токены на Solana фактически являются аккаунтами данных, принадлежащими Token Program.
Token Program
Mint Account
Токены в Solana уникально идентифицируются по адресу Mint Account, принадлежащего Token Program. Этот аккаунт выступает в роли глобального счетчика для конкретного токена и хранит такие данные, как:
- Supply: общий объем выпуска токена
- Decimals: количество знаков после запятой у токена
- Mint authority: аккаунт, уполномоченный создавать новые единицы токена, увеличивая его объем
- Freeze authority: аккаунт, уполномоченный замораживать токены в Token Account, предотвращая их перевод или сжигание
Полномочия на выпуск (mint authority) настраиваются при инициализации mint account. Они дают право на дальнейший выпуск токенов, однако этот аккаунт не обязательно должен совпадать с тем, который создал или оплатил mint account.
Mint Account
Полная информация, хранящаяся в каждом mint account, включает следующее:
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 initializedpub 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 Account
Полная информация, хранящаяся в каждом token account, включает следующее:
pub struct Account {/// The mint associated with this accountpub 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 delegatepub delegate: COption<Pubkey>,/// The account's statepub 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 delegatedpub 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 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?