Токены в 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 Program (Оригинальный)
- Базовые возможности токенов (выпуск, перевод и т. д.)
- Неизменяемый и широко используемый
Token Extension Program (Token 2022)
- Включает все функции оригинального Token Program
- Добавляет функции через "расширения"
Token Programs содержат всю логику инструкций для взаимодействия с токенами в сети (как с заменяемыми, так и с незаменяемыми). Все токены в Solana фактически являются data accounts, принадлежащими Token Program.
Token Program
Mint Account
Токены в Solana уникально идентифицируются адресом Mint Account, принадлежащего Token Program. Этот аккаунт действует как глобальный счетчик для конкретного токена и хранит данные, такие как:
- Supply: Общее количество токенов
- Decimals: Точность токена в десятичных знаках
- Mint authority: Аккаунт, уполномоченный создавать новые единицы токена, увеличивая общее количество
- Freeze authority: Аккаунт, уполномоченный замораживать токены в токен-аккаунте, предотвращая их передачу или сжигание
Аккаунт выпуска (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.
Токен-аккаунт
Программа токенов (Token Program) создает токен-аккаунты для отслеживания индивидуальной собственности на каждую единицу токена. Токен-аккаунт хранит данные, такие как:
- Mint: Токен, единицы которого хранятся в токен-аккаунте
- Owner: Аккаунт, уполномоченный переводить токены из токен-аккаунта
- Amount: Количество токенов, которые в данный момент хранятся в токен-аккаунте
Токен-аккаунт
Полные данные, хранящиеся в каждом токен-аккаунте, включают следующее:
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), который он хочет хранить, с адресом кошелька, установленным как владелец токен-аккаунта. Каждый кошелек может владеть несколькими токен-аккаунтами для одного и того же токена (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 Account
Обратите внимание, что каждому кошельку требуется собственный token account для хранения токенов из одного и того же mint.
Расширенная схема связей аккаунтов
Примеры использования Token CLI
CLI spl-token
помогает экспериментировать с SPL токенами. Примеры ниже
используют терминал Solana Playground для выполнения
CLI-команд прямо в браузере без локальной установки.
Создание токенов и аккаунтов требует SOL для депозита аренды аккаунта и оплаты
комиссий за транзакции. Для новых пользователей Solana Playground создайте
кошелёк Playground и выполните команду solana airdrop
в терминале
Playground. Вы также можете получить devnet SOL из публичного
веб-крана.
$solana airdrop 2
Выполните spl-token --help
, чтобы увидеть все доступные команды.
$spl-token --help
Чтобы установить CLI spl-token
локально, выполните:
$cargo install spl-token-cli
Больше примеров можно найти в
документации CLI spl-token
.
Адреса аккаунтов, отображаемые в вашем терминале, будут отличаться от
приведённых ниже примеров. Используйте адреса из вашего терминала Playground при
выполнении инструкций. Например, команда create-token
выводит адрес mint
account с вашим кошельком Playground в качестве mint authority.
Создание нового токена
Чтобы создать новый токен (mint account), выполните:
$spl-token create-token
Результат будет выглядеть так:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Новый mint аккаунт начинается с нулевого запаса. Проверьте текущий запас с помощью команды:
$spl-token supply <TOKEN_ADDRESS>
Команда supply
для нового токена возвращает 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Создание нового mint аккаунта требует транзакции с двумя инструкциями. Вот пример на Javascript в Solana Playground.
-
System Program создает новый аккаунт с пространством для данных Mint Account и передает право собственности Token Program.
-
Token Program инициализирует данные нового аккаунта как Mint Account.
Создание Token Account
Чтобы хранить токены определенного mint, создайте token аккаунт:
$spl-token create-account <TOKEN_ADDRESS>
Пример команды:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Вывод:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Команда create-account
создает associated token аккаунт с вашим адресом
кошелька в качестве владельца.
Чтобы создать token аккаунт с другим владельцем:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Примечание: <TOKEN_ADDRESS>
указывает mint аккаунт для token аккаунта.
Пример команды:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Вывод:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 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.
-
System Program создает новый аккаунт с пространством для данных Token Account и передает право собственности Token Program.
-
Token Program инициализирует данные как Token Account.
Выпуск токенов
Чтобы создать новые единицы токена, выпустите токены на Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Пример команды:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Вывод:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Чтобы выпустить токены на другой Token Account:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Вывод:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Инструкция MintTo
в Token Program создает новые токены. Авторитет выпуска
должен подписать транзакцию. Инструкция выпускает токены на Token Account и
увеличивает общее предложение в Mint Account. Вот пример на Javascript в
Solana Playground.
Перевод токенов
Чтобы перевести токены между Token Account:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Пример команды:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Вывод:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Инструкция Transfer
в Token Program обрабатывает переводы токенов.
Владелец Token Account отправителя должен подписать транзакцию. Инструкция
перемещает токены между Token Account. Вот пример на Javascript в
Solana Playground.
И у отправителя, и у получателя должны быть Token Account для конкретного токена (mint). Отправитель может включить инструкции для создания Token Account получателя в той же транзакции.
Создание метаданных токена
Программа Token Extensions позволяет хранить метаданные (имя, символ, ссылка на изображение) непосредственно в учетной записи Mint Account.
Чтобы создать токен с расширением метаданных:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Вывод:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo 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: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
Чтобы инициализировать метаданные:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
URI токена ссылается на метаданные вне цепочки. Пример формата JSON можно посмотреть здесь.
Пример команды:
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?