Токены на 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 фактически являются аккаунтами данных, принадлежащими Token Program.
Token Program
Mint Account
Токены на Solana уникально идентифицируются адресом Mint Account, принадлежащего Token Program. Этот аккаунт действует как глобальный счетчик для конкретного токена и хранит такие данные, как:
- Предложение: Общее предложение токена
- Десятичные знаки: Десятичная точность токена
- Полномочия эмиссии: Аккаунт, уполномоченный создавать новые единицы токена, увеличивая предложение
- Полномочия заморозки: Аккаунт, уполномоченный замораживать токены в token 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
- Владелец: Аккаунт, уполномоченный переводить токены из token account
- Количество: Число токенов, которое 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>,}
Кошельку нужен 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 Account
Обратите внимание, что каждому кошельку нужен свой token account для хранения токенов одного и того же mint.
Расширенные отношения аккаунтов
Примеры использования Token CLI
CLI spl-token
помогает экспериментировать с SPL токенами. Примеры ниже
используют терминал Solana Playground для запуска
команд CLI прямо в браузере без локальной установки.
Создание токенов и аккаунтов требует SOL для депозитов rent и комиссий за
транзакции. Для новых пользователей 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
Больше примеров можно найти в
документации spl-token
.
Адреса аккаунтов, показанные в выводе вашего терминала, отличаются от примеров
ниже. Используйте адреса из вашего терминала Playground при выполнении действий.
Например, команда create-token
выводит адрес mint account с вашим
кошельком Playground в качестве mint authority.
Создание нового токена
Чтобы создать новый токен (mint account), запустите:
$spl-token create-token
Вывод будет выглядеть так:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Новый mint account начинается с нулевым запасом. Проверьте текущий запас с помощью:
$spl-token supply <TOKEN_ADDRESS>
Команда supply
для нового токена возвращает 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Создание нового Mint Account требует транзакции с двумя инструкциями. Вот пример на Javascript на Solana Playground.
-
System Program создает новый аккаунт с пространством для данных Mint Account и передает право собственности Token Program.
-
Token Program инициализирует данные нового аккаунта как Mint Account
Создание Token Account
Чтобы хранить токены определенного mint, создайте token account:
$spl-token create-account <TOKEN_ADDRESS>
Пример команды:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Вывод:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
Команда create-account
создает associated token account с адресом вашего
кошелька в качестве владельца.
Чтобы создать token account с другим владельцем:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Примечание: <TOKEN_ADDRESS>
указывает mint account для token account.
Пример команды:
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 accounts:
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 Accounts. Вот пример на Javascript на
Solana Playground.
И отправителю, и получателю нужны token accounts для конкретного токена (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, см. руководство Начало работы с Token Extensions и документацию SPL.
Is this page helpful?