Объяснение программы токенов Solana

Разбираем, как работают сменные и несменные токены в Solana.
Понимание токенов Solana может быть довольно сложным, если вы работаете с Ethereum. В Ethereum сменные токены используют стандарт ERC20, а несменные токены — стандарт ERC721. Каждый токен ERC20 имеет свой собственный смарт-контракт, а каждая коллекция NFT имеет свой собственный контракт ERC721 (или ERC1155). Довольно простые вещи.
В стране Solana все работает совсем по-другому. Давайте разберемся в этом.

Модель счета в Solana

  • Аккаунт либо содержит данные (например, сколько у вас токенов), либо является исполняемой программой (т.е. смарт-контрактом). Первые я называю «счетами данных», а вторые — «счетами программ». Важно отметить, что в отличие от Ethereum, программные счета не хранят состояние. Все состояние хранится в счетах данных.
  • Каждый счет содержит следующие поля 👇

  • Каждый счет имеет уникальный адрес (аналогично Ethereum). Большинство адресов являются открытым ключом пары ключей.
  • Каждый аккаунт принадлежит программе. По умолчанию, вновь созданный аккаунт принадлежит встроенной программе под названием «Системная программа». Только владелец учетной записи может изменять ее. Для получения более подробной информации вы можете обратиться к вики, которую я упоминал выше, или прочитать краткое руководство по учетным записям, которое я написал.

Что такое программа токенов Solana?

Программа токенов Solana позволяет следующее (для сменных и несменных токенов):

  • майнинг токенов
  • перевод токенов
  • сжигание токенов

По сути, вместо того, чтобы разворачивать новый смарт-контракт ERC20 для каждого нового токена, все, что вам нужно сделать, это отправить инструкцию в программу токенов. В зависимости от того, какую инструкцию вы отправите, программа токенов будет майнить/передавать/сжигать токены.

Если вы еще не все поняли, не волнуйтесь! Разбор примера должен сделать все намного яснее, что мы и сделаем далее.

Примечание: иногда вы увидите, что токены Solana называются «токенами SPL». SPL означает Solana Program Library, то есть набор программ Solana, которые команда Solana развернула на цепочке. Токены SPL похожи на токены ERC20, поскольку каждый токен SPL имеет стандартный набор функциональных возможностей.

Как работает программа токенов Solana?

Самый простой способ понять это — рассмотреть несколько примеров. Наши примеры будут касаться сменных токенов, а для взаимодействия с программой токенов мы будем использовать инструмент командной строки spl-token (вы можете установить его, выполнив команду cargo install spl-token-cli).

Повторимся, все, что делает spl-token, это посылает инструкции программе токенов. Вы можете имитировать следующее поведение, используя клиент JavaScript или взаимодействуя с программой токенов через CPI в Rust.

Предварительные условия

Во-первых, убедитесь, что вы установили Solana CLI и spl-token.

Затем выполните solana-keygen new -o ~/my_solana_wallet1.json и создайте новую переменную окружения $SOLADDR1, которая будет хранить полученный открытый ключ. Повторите этот процесс, но со второй переменной окружения под названием $SOLADDR2 (и назовите файл пары ключей my_solana_wallet2.json). Позже мы будем использовать эти адреса и файлы пар ключей для тестирования майнинга и передачи токенов.

Вот как эти значения выглядят для меня:

$ echo $SOLADDR1
3sdsSwWWjjGA7HpPBQfGaXRE2HqmdKicMXHRapqLAu4L
$ echo $SOLADDR2
ES2C1YPzNh5JjQu7DdxrveaPUHj9CnrRWSdrFo4ku5Zh
Войти в полноэкранный режим Выйти из полноэкранного режима

Примечание: многие команды в этом руководстве можно сделать короче, выполнив команду solana config set — keypair ~/my_solana_wallet1.json, которая устанавливает клиентскую пару ключей по умолчанию. Например, это позволит вам не использовать флаг —owner для многих следующих команд. Я использую более длинные версии команд, чтобы сделать их более понятными и ясными.

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

Теперь, когда все готово, мы можем использовать spl-token. Сначала создадим токен нового типа.

$ spl-token create-token —mint-authority ~/my_solana_wallet1.json

Создание токена 6ifRGEkJ6XmEjuqfTFNqAjjomUiDJTjRv4GHqBH6usWr.
Создание нового типа токена создает новый счет данных, который в дальнейшем мы будем называть «монетным счетом». Каждый тип токена связан ровно с одним счетом mint. Адрес монетного счета — 6ifRGEkJ6XmEjuqfTFNqAjjomUiDJTjRv4GHqBH6usWr, но мы будем использовать $TOKEN1, чтобы было удобнее читать. Мы можем запросить информацию о счете следующим образом (не обращайте внимания на всю эту тарабарщину в конце):

$ solana account $TOKEN1
Public Key: Aqf1rBKNQYgX1mjE64STwV3miEwXEe2ioZzD7n4vkpXk
Balance: 0.0014616 SOL
Owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Executable: false
Rent Epoch: 207
Length: 82 (0x52) bytes
0000:   01 00 00 00  2a b0 1a 64  bb c5 f0 df  bf 57 d5 61   ....*..d.....W.a
0010:   56 a8 b8 85  8f a8 0b 09  f1 f1 a2 dc  4d 51 b3 63   V...........MQ.c
0020:   8f 72 bd e9  00 00 00 00  00 00 00 00  09 01 00 00   .r..............
0030:   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00   ................
0040:   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00   ................
0050:   00 00
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы можем проверить владельца (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) с помощью Solana Explorer 👇. Владельцем является программа токенов (учетная запись программы), которая отвечает за создание новых токенов, майнинг токенов и передачу токенов.

Теперь давайте посмотрим на данные монетного счета — то, что идет после «Length: 82 (0x52) bytes», как показано выше. Читать обычные шестнадцатеричные данные довольно сложно, поэтому мы можем использовать Solana Explorer:

Solana Explorer декодирует данные и отображает их в человекочитаемом формате. Вот что означает каждое из полей:

  • Адрес — надеюсь, это не требует пояснений 😛 Это просто адрес счета монетного двора.
  • Текущее предложение — количество токенов, которые были отчеканены. Поскольку мы только что создали токен, это число равно 0.
  • Mint Authority — открытый ключ пары ключей, которой разрешено майнить токены (мы указали это с помощью флага —mint-authority. Если кто-либо другой попытается майнить токены, это не удастся.
  • Децималы — определяют наименьший номинал токена. Для NFT он должен быть равен нулю. По умолчанию используется девять.

Прежде чем мы продолжим, вот простая диаграмма, показывающая счета, которые находятся в игре, и как они связаны между собой. Легенда украдена из замечательного блога paulx’а:

  • «Внутренние отношения Solana» относится к полю владельца, которое устанавливается для каждой учетной записи, например, владелец, который отображается, когда вы запускаете solana account $TOKEN1.
  • «Отношения в пространстве пользователя» относятся к случаям, когда отношения между двумя учетными записями закодированы в данных учетной записи, например, поле «mint authority», которое мы рассмотрели выше.

Создание учетной записи токена

Прежде чем мы сможем майнить токены, мы должны сначала создать учетную запись токена.

$ spl-token create-account $TOKEN1 --owner $SOLADDR1                              
Creating account 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
Вход в полноэкранный режим Выход из полноэкранного режима

С этого момента мы будем использовать $TOKENACCT1 вместо 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak, и будем называть эту учетную запись «учетной записью токена». Возможно, вам интересно, что такое счет токенов? По сути, он просто хранит информацию о том, сколько токенов есть у конкретного пользователя, для определенного типа токенов. Например, если вы владеете 10 токенами1 и 5 токенами2, у вас будет два счета токенов.

Вот как выглядит счет токенов.

$ solana account $TOKENACCT1
Public Key: 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
Balance: 0.00203928 SOL
Owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Executable: false
Rent Epoch: 207
Вход в полноэкранный режим Выход из полноэкранного режима

Счет токенов имеет отношения с тремя другими счетами. Его внутренним владельцем является программа токенов, поскольку программа токенов должна иметь возможность модифицировать счет (например, добавлять в него новые токены). Затем, в пространстве пользователя, его владельцем является $SOLADDR1, а его «монетным двором», или связанной с ним учетной записью, является $TOKEN1.

Вот как теперь связаны все учетные записи:

Чеканка токенов

Наконец, мы можем чеканить токены! Эта часть проще — мы просто указываем счет монетного двора (который определяет «тип» жетона для монетного двора), количество жетонов для монетного двора и счет, на который их нужно выдать.

$ spl-token balance $TOKEN1 --owner $SOLADDR1
0
$ spl-token mint $TOKEN1 10 $TOKENACCT1 --mint-authority ~/my_solana_wallet1.json
Minting 10 tokens
  Token: Aqf1rBKNQYgX1mjE64STwV3miEwXEe2ioZzD7n4vkpXk
  Recipient: 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
$ spl-token balance $TOKEN1 --owner $SOLADDR1
10
Вход в полноэкранный режим Выход из полноэкранного режима

В дополнение к использованию spl-token balance, вы также можете использовать spl-token accounts, чтобы посмотреть, сколько токенов принадлежит определенному аккаунту.

$ spl-token accounts  --owner $SOLADDR1                                                                                                      
Token                                         Balance
---------------------------------------------------------------
Aqf1rBKNQYgX1mjE64STwV3miEwXEe2ioZzD7n4vkpXk  10
Войти в полноэкранный режим Выйти из полноэкранного режима

Что произойдет, если вы попытаетесь майнить токены с другим значением параметра —mint-authority?

$ spl-token mint $TOKEN1 10 $TOKENACCT1 --mint-authority ~/my_solana_wallet2.json
Minting 10 tokens
  Token: Aqf1rBKNQYgX1mjE64STwV3miEwXEe2ioZzD7n4vkpXk
  Recipient: 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
RPC response error -32002: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x4 [5 log messages]

Войти в полноэкранный режим Выйти из полноэкранного режима

Ответ? Это не сработает! Это происходит потому, что поле «mint authority» в учетной записи токена установлено на другую учетную запись, и только этой учетной записи разрешено майнить новые токены.

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

Давайте попробуем перевести несколько токенов на $SOLADDR2 (который должен был быть создан в разделе «Предварительные условия»).

$ spl-token transfer $TOKEN1 1 $SOLADDR2 —owner ~/my_solana_wallet1.json
Передача 5 токенов
Отправитель: 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
Получатель: ES2C1YPzNh5JjQu7DdxrveaPUHj9CnrRWSdrFo4ku5Zh
Счет ассоциированного токена получателя: FFednTgQRKDbGYjXrXk8SWPfzSJW3Q8ApN5mGCpGdAtE
Ошибка: Связанный с токеном счет получателя не существует. Добавьте --fund-recipient, чтобы пополнить его счет.
О, это не удалось 😨 Сообщение об ошибке говорит нам о причине — нам не разрешено передавать токены, если у получателя нет счета для токенов.

Есть два способа исправить это:

  1. Создайте учетную запись токена для получателя, а затем переведите токены.
  2. Использовать флаг —fund-recipient. Это заставит отправителя заплатить за создание счета токенов получателя. Мы выберем подход №1.
$ spl-token create-account $TOKEN1 --owner $SOLADDR2
Creating account FFednTgQRKDbGYjXrXk8SWPfzSJW3Q8ApN5mGCpGdAtE
$ spl-token transfer $TOKEN1 1 $SOLADDR2 --owner ~/my_solana_wallet1.json
Transfer 1 tokens
  Sender: 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
  Recipient: ES2C1YPzNh5JjQu7DdxrveaPUHj9CnrRWSdrFo4ku5Zh
  Recipient associated token account: FFednTgQRKDbGYjXrXk8SWPfzSJW3Q8ApN5mGCpGdAtE
$ spl-token balance $TOKEN1 --owner $SOLADDR2
1
Вход в полноэкранный режим Выйдите из полноэкранного режима

Отлично, все сработало! Давайте посмотрим на различные учетные записи в игре.

Обернутый SOL

Подобно тому, как ETH может быть обернут в токен ERC20 для формирования wETH, SOL может быть обернут в токен SPL.

$ spl-token wrap 1 ~/my_solana_wallet1.json
Wrapping 1 SOL into DXWzvX3RtZbito65G8ZgqmEzJM6Z6Fqy7NHkbpEmCUZD
Вход в полноэкранный режим Выход из полноэкранного режима

Конечно, вы можете развернуть полученный токен SPL, чтобы получить обратно свой SOL.

$ spl-token unwrap DXWzvX3RtZbito65G8ZgqmEzJM6Z6Fqy7NHkbpEmCUZD ~/my_solana_wallet1.json
Unwrapping DXWzvX3RtZbito65G8ZgqmEzJM6Z6Fqy7NHkbpEmCUZD
  Amount: 1 SOL
  Recipient: 3sdsSwWWjjGA7HpPBQfGaXRE2HqmdKicMXHRapqLAu4L
Войти в полноэкранный режим Выйти из полноэкранного режима

Такая обертка SOL позволяет легко обменивать SOL на другие токены SPL.

Подождите, а как же NFTS?

Теперь, когда мы рассмотрели, как работают сменные жетоны, понять, что такое не сменные жетоны, должно быть легко. Я просто дам вам почитать документацию, поскольку я все равно ничего не добавлю. Основными важными моментами являются:

Используйте —decimals 0 при создании токена, поскольку он должен быть только один.
После майнинга одного токена отключите дальнейший майнинг. Это гарантирует, что токен будет только один.
На практике никто не создает NFT таким образом. Вместо этого большинство людей используют Candy Machine — инструмент для загрузки изображений и метаданных и их майнинга в качестве NFT. Я объясню, как это работает, в одном из следующих постов!

Вот и все! Теперь вы должны понимать, как работают токены SPL и чем они отличаются от токенов ERC20. Вкратце:

  • Одна программа под названием Token Program способна создавать новые типы токенов, майнить новые токены и переводить токены между аккаунтами.
  • В отличие от токенов ERC20, где каждый новый тип токена связан с новым смарт-контрактом ERC20, существует только одна программа Token Program. Однако каждый новый тип токенов связан с новым монетным счетом.
  • Если пользователь хочет владеть некоторыми токенами определенного типа, ему необходимо иметь токен-счет. Другими словами, если кто-то владеет пятью разными типами токенов, у него будет пять разных счетов токенов.
  • Вы можете обернуть SOL в токен SPL, что позволяет легко обменивать его на другие токены SPL.
  • Несгораемый токен SPL — это токен с нулевыми десятичными знаками, который был отчеканен в одном экземпляре и отключен от будущей чеканки.Если вы хотите увидеть больше подобного контента, не стесняйтесь следовать за мной в Twitter!

Оцените статью
Procodings.ru
Добавить комментарий