Токены на 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 фактически являются аккаунтами данных, принадлежащими Token Program.

Token ProgramToken Program

Mint Account

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

  • Предложение: Общее предложение токена
  • Десятичные знаки: Десятичная точность токена
  • Полномочия эмиссии: Аккаунт, уполномоченный создавать новые единицы токена, увеличивая предложение
  • Полномочия заморозки: Аккаунт, уполномоченный замораживать токены в token 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
  • Владелец: Аккаунт, уполномоченный переводить токены из token account
  • Количество: Число токенов, которое 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>,
}

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

Схема связей аккаунтовСхема связей аккаунтов

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

Associated Token Account

Associated token accounts упрощают процесс поиска адреса token account для конкретного mint и владельца. Думайте об associated token account как о "стандартном" token account для конкретного 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 для депозитов rent и комиссий за транзакции. Для новых пользователей 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

Больше примеров можно найти в документации 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 account начинается с нулевым запасом. Проверьте текущий запас с помощью:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

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

Example
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

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

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

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

Создание Token Account

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

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

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

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Вывод:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1

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

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

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

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

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

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 для:

Чтобы создать новый 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 accounts:

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 Accounts. Вот пример на Javascript на Solana Playground.

И отправителю, и получателю нужны token accounts для конкретного токена (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, см. руководство Начало работы с Token Extensions и документацию SPL.

Is this page helpful?