Токены в Solana

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

Этот раздел охватывает основные концепции представления токенов в Solana. Обратитесь к разделу Основы SPL токенов для примеров кода.

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

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

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

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

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

Token Programs

Экосистема Solana включает два основных Token Programs. Исходный код обоих программ приведен ниже.

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

Token ProgramToken Program

Mint Account

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

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

Аккаунт выпуска (Mint Account)Аккаунт выпуска (Mint 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.

Токен-аккаунт

Программа токенов (Token Program) создает токен-аккаунты для отслеживания индивидуальной собственности на каждую единицу токена. Токен-аккаунт хранит данные, такие как:

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

Токен-аккаунтТокен-аккаунт

Полные данные, хранящиеся в каждом токен-аккаунте, включают следующее:

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), который он хочет хранить, с адресом кошелька, установленным как владелец токен-аккаунта. Каждый кошелек может владеть несколькими токен-аккаунтами для одного и того же токена (mint), но токен-аккаунт может иметь только одного владельца и хранить единицы только одного токена (mint).

Отношения аккаунтовОтношения аккаунтов

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

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

Ассоциированные токен-аккаунты упрощают процесс нахождения адреса токен-аккаунта для конкретного выпуска (mint) и владельца. Считайте ассоциированный токен-аккаунт "по умолчанию" для конкретного выпуска (mint) и владельца.

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

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

Associated Token AccountAssociated Token Account

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

Расширенная схема связей аккаунтовРасширенная схема связей аккаунтов

Примеры использования Token CLI

CLI spl-token помогает экспериментировать с SPL токенами. Примеры ниже используют терминал Solana Playground для выполнения CLI-команд прямо в браузере без локальной установки.

Создание токенов и аккаунтов требует SOL для депозита аренды аккаунта и оплаты комиссий за транзакции. Для новых пользователей Solana Playground создайте кошелёк Playground и выполните команду solana airdrop в терминале Playground. Вы также можете получить devnet SOL из публичного веб-крана.

Terminal
$
solana airdrop 2

Выполните spl-token --help, чтобы увидеть все доступные команды.

Terminal
$
spl-token --help

Чтобы установить CLI spl-token локально, выполните:

Terminal
$
cargo install spl-token-cli

Больше примеров можно найти в документации CLI spl-token.

Адреса аккаунтов, отображаемые в вашем терминале, будут отличаться от приведённых ниже примеров. Используйте адреса из вашего терминала Playground при выполнении инструкций. Например, команда create-token выводит адрес mint account с вашим кошельком Playground в качестве mint authority.

Создание нового токена

Чтобы создать новый токен (mint account), выполните:

Terminal
$
spl-token create-token

Результат будет выглядеть так:

Terminal Output
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Address: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Decimals: 9
Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1

Новый mint аккаунт начинается с нулевого запаса. Проверьте текущий запас с помощью команды:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

Команда supply для нового токена возвращает 0:

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Создание нового mint аккаунта требует транзакции с двумя инструкциями. Вот пример на Javascript в Solana Playground.

  1. System Program создает новый аккаунт с пространством для данных Mint Account и передает право собственности Token Program.

  2. Token Program инициализирует данные нового аккаунта как Mint Account.

Создание Token Account

Чтобы хранить токены определенного mint, создайте token аккаунт:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Пример команды:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Вывод:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

Команда create-account создает associated token аккаунт с вашим адресом кошелька в качестве владельца.

Чтобы создать token аккаунт с другим владельцем:

Terminal
$
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

Примечание: <TOKEN_ADDRESS> указывает mint аккаунт для token аккаунта.

Пример команды:

Example
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Вывод:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt

Создание Associated Token Account требует одной инструкции, которая вызывает Associated Token Program. Вот пример на Javascript в Solana Playground.

Associated Token Program использует Cross Program Invocations для выполнения следующих действий:

  • Вызов System Program для создания нового аккаунта, используя предоставленный PDA в качестве адреса
  • Вызов Token Program для инициализации данных Token Account

Чтобы создать новый Token Account с новым keypair вместо адреса Associated Token Account, отправьте транзакцию с двумя инструкциями. Вот пример на Javascript в Solana Playground.

  1. System Program создает новый аккаунт с пространством для данных Token Account и передает право собственности Token Program.

  2. Token Program инициализирует данные как Token Account.

Выпуск токенов

Чтобы создать новые единицы токена, выпустите токены на Token Account:

Terminal
$
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

Пример команды:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Вывод:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG

Чтобы выпустить токены на другой Token Account:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Вывод:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7

Инструкция MintTo в Token Program создает новые токены. Авторитет выпуска должен подписать транзакцию. Инструкция выпускает токены на Token Account и увеличивает общее предложение в Mint Account. Вот пример на Javascript в Solana Playground.

Перевод токенов

Чтобы перевести токены между Token Account:

Terminal
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

Пример команды:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Вывод:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o

Инструкция Transfer в Token Program обрабатывает переводы токенов. Владелец Token Account отправителя должен подписать транзакцию. Инструкция перемещает токены между Token Account. Вот пример на Javascript в Solana Playground.

И у отправителя, и у получателя должны быть Token Account для конкретного токена (mint). Отправитель может включить инструкции для создания Token Account получателя в той же транзакции.

Создание метаданных токена

Программа Token Extensions позволяет хранить метаданные (имя, символ, ссылка на изображение) непосредственно в учетной записи Mint Account.

Чтобы создать токен с расширением метаданных:

Example
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata

Вывод:

Terminal Output
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.
Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP
Decimals: 9
Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai

Чтобы инициализировать метаданные:

Terminal
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>

URI токена ссылается на метаданные вне цепочки. Пример формата JSON можно посмотреть здесь.

Пример команды:

Example
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"

Просмотрите метаданные в Solana Explorer.

Узнайте больше в руководстве по расширению метаданных. Для получения подробной информации о Token Extensions ознакомьтесь с руководством для начинающих и документацией SPL.

Is this page helpful?