Токени на 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 на mint account USDC.
Token Account
Token Program створює token account для відстеження індивідуального володіння кожною одиницею токена. 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 account для одного й того ж токена (mint), але token account може мати лише одного власника і зберігати одиниці лише одного токена (mint).
Account Relationship
Зверніть увагу, що дані кожного token account включають поле owner
, яке
визначає, хто має повноваження над token account. Це відрізняється від власника
програми, зазначеного в базовому типі
Account, яким є Token Program для всіх token
account.
Associated Token Account
Associated token account спрощують процес пошуку адреси token account для конкретного mint та власника. Думайте про associated token account як про "типовий" token account для конкретного mint та власника.
Асоційований 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, перегляньте Посібник для початківців та документацію SPL.
Is this page helpful?