
Plug and Play: Token Extensions
Введение
Token Extensions упрощают создание программируемых токенов в Solana. Разработчики могут комбинировать более десятка расширений Mint и Account с помощью новой программы Token Extensions. В этом руководстве вы создадите взаимозаменяемые и невзаимозаменяемые токены, процентные и замороженные токены, токены под вашим полным контролем (включая возможность перемещать их из чужих аккаунтов), а также закроете минт-аккаунты для возврата средств.
Plug and Play Token Extensions — это руководство с интерактивными примерами в Solana Playground, которое поможет вам освоить Token Extensions и создать на TypeScript следующие токены:
Код этого руководства адаптирован из руководства для разработчиков Solana. Скрипты для создания Token Extensions находятся в разделе Дополнительные ресурсы.
Аккаунт Token Extensions
Token Extensions добавляют новые инструкции поверх Token Program. Аккаунты, созданные обеими программами, имеют одинаковую начальную структуру данных: сначала идут данные Token Program, а затем — данные Token Extensions. Если вы не знакомы с данными аккаунтов, прочитайте о выделении пространства в вводном руководстве по Anchor. Вкратце: при создании аккаунта в Solana необходимо явно выделить пространство для хранения данных ончейн. На основе его объема можно рассчитать количество лампортов, необходимое для освобождения аккаунта от арендной платы.
Так выглядит создание минт-аккаунта с расширениями. Чтобы выделить пространство для Token Extensions, используйте функцию getMintLen. Она возвращает размер минт-аккаунта с расширениями. В примере NonFungibleToken.ts получите длину минт-аккаунта с расширениями типов MetadataPointer и MintCloseAuthority.
NonFungibleToken.ts, строка 54:
// Size of Mint Account with extension
const mintLen = getMintLen([
ExtensionType.MetadataPointer,
ExtensionType.MintCloseAuthority,
]);Расширения Metadata и Metadata Pointer позволяют хранить метаданные и указывать на них без сторонних протоколов. TokenMetadata — это интерфейс из @solana/spl-token-metadata с такими полями, как updateAuthority, mint, name, symbol, uri и additionalMetadata. Длину метаданных определяют с помощью функции pack, вызванной для объекта метаданных.
NonFungibleToken.ts, строка 60:
// Metadata to store in Mint Account
const metaData: TokenMetadata = {
updateAuthority: updateAuthority,
mint: mint,
name: "Solana Soldier",
symbol: "SOLD",
uri: "https://shdw-drive.genesysgo.net/G1Tzt42SDqCV3x9vPY5X826foA8fEk8BR4bB5wARh75d/OIG2.jpg",
additionalMetadata: [["armor", null]],
};
// Size of metadata
const metadataLen = pack(metaData).length;
// Size of MetadataExtension 2 bytes for type, 2 bytes for length
const metadataExtension = TYPE_SIZE + LENGTH_SIZE;Сложите длину минт-аккаунта, размер расширения метаданных и длину метаданных, чтобы определить минимальное количество лампортов для минт-аккаунта.
NonFungibleToken.ts, строка 75:
// Minimum lamports required for Mint Account
const lamports = await connection.getMinimumBalanceForRentExemption(
mintLen + metadataExtension + metadataLen
);Инструкции Token Extensions
Библиотеки Solana, такие как @solana/spl-token и @solana/spl-token-metadata, добавляют поддержку TypeScript для программы Token Extensions. Сначала создайте аккаунт с нужным объемом пространства и количеством лампортов для освобождения от арендной платы. Для этого используйте SystemProgram из @solana/web3.js.
NonFungibleToken.ts, строка 80:
// Instruction to invoke System Program to create new account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: payer.publicKey, // Account that will transfer lamports to created account
newAccountPubkey: mint, // Address of the account to create
space: mintLen, // Amount of bytes to allocate to the created account
lamports, // Amount of lamports transferred to created account
programId: TOKEN_2022_PROGRAM_ID, // Program assigned as owner of created account
});Теперь можно создать инструкции, задающие параметры минта. Следующие инструкции необходимо выполнить до вызова initializeMint. В Plug and Play перед минтом используются следующие инструкции:
- Инициализация указателя метаданных: createInitializeMetadataPointerInstruction
- Инициализация полномочий на закрытие минта: createInitializeMintCloseAuthorityInstruction
- Инициализация непередаваемого минта: createInitializeNonTransferableMintInstruction
- Инициализация постоянного делегата: createInitializePermanentDelegateInstruction
- Инициализация минта процентного токена: createInitializeInterestBearingMintInstruction
Аккаунты метаданных можно инициализировать и обновлять независимо от initializeMint. Однако Metadata Pointer необходимо инициализировать до минта. Порядок инструкций в транзакции определяет порядок их выполнения. Создайте минт-аккаунт, инициализируйте указатель метаданных, а затем полномочия на закрытие минта с публичным ключом минта. После этого инициализируйте минт-аккаунт и аккаунты метаданных, а затем обновите дополнительные метаданные.
NonFungibleToken.ts, строка 135:
transaction = new Transaction().add(
createAccountInstruction,
initializeMetadataPointerInstruction,
initializeMintCloseAuthorityInstruction,
initializeMintInstruction,
initializeMetadataInstruction,
updateFieldInstruction
);Файлы nonFungibleToken.ts, soulboundToken.ts, interestBearingToken.ts и delegateToken.ts используют одинаковую структуру для создания токенов. Отличаются только применяемые расширения и инструкции.
Сначала импортируйте все необходимые функции из соответствующих библиотек Solana, определите плательщика и сгенерируйте адрес минта. Затем определите объем пространства и количество лампортов, необходимых адресу минта с выбранными расширениями токена. Создайте инструкции с помощью библиотек @solana/spl-token и @solana/spl-token-metadata, добавьте их в транзакцию, отправьте транзакцию в сеть и проверьте результаты.
Операции с токенами, такие как перевод и сжигание, можно использовать с разными расширениями токенов. Для токенов с Metadata Extension можно использовать инструкции createUpdateFieldInstruction и createRemoveKeyInstruction, чтобы соответственно обновлять или удалять метаданные.
Plug and Play
Клиент в Solana Playground содержит необходимые функции для работы с Token Extensions. Например, непередаваемый токен использует расширения Non-Transferable и Metadata для создания непередаваемого NFT. Функции для создания токенов и взаимодействия с ними находятся в том же файле и доступны для импорта. В Solana Playground вместо импорта необходимо скопировать и вставить код.
Файл quest.ts позволяет пройти игру Solana Soldier. Также можно запустить каждый файл с расширениями токенов и изучить их возможности по отдельности. Для прохождения задания кошельку Playground потребуется SOL в Devnet. Получить Devnet SOL через аирдроп также можно в нашем кране Solana Devnet.
Задание начинается с создания Solana Soldier — NFT, в котором плательщик (pg.wallet.keypair) получает полномочия на закрытие минта. Это позволяет плательщику закрыть минт-аккаунт и вернуть из него SOL. Такой механизм помогает приложениям возвращать SOL из аккаунтов, которые больше не используются.
Создав Solana Soldier, используйте адрес его минта, чтобы обновить метаданные NFT. Изменим броню солдата на iron. Функции getMetadata, updateMetadata и removeMetadata находятся в файле NonFungibleToken.ts, начиная со строки 167. Эти функции можно вызывать для минт-аккаунтов, использующих Metadata Extension. Для простоты функции метаданных включены только в файл NonFungibleToken.ts.
Теперь пора повышать уровень. Процентный токен будет отражать уровень Solana Soldier. Импортируйте createInterestBearingToken из InterestBearingToken.ts и создайте токен с помощью этой инструкции. Проценты на аккаунте будут начисляться по ставке, указанной в строке 43 файла InterestBearingToken.ts. Функция amountToUiAmount позволяет определить количество токенов с учетом начисленных процентов. Проценты накапливаются со временем, поэтому можно вызывать amountToUiAmount, чтобы проверять уровень Solana Soldier.
Когда солдат начнет повышать уровень, ему потребуется задание. Его представляет непередаваемый токен: солдат не может его передать (попробуйте перехватить ошибку при вызове функции перевода), а избавиться от задания можно только путем сжигания токена. Но вместо того чтобы отказываться от задания, давайте его изучим. Подсказка: проверьте метаданные!
После того как вы прочитаете задание, руководство Plug and Play развернет армию по адресу токена. Solana Soldier должен уметь вернуть армию плательщику после развертывания токенов. Token Extensions позволяют сделать это с помощью полномочий делегата. Делегат может переводить и сжигать токены независимо от их владельца. Назначьте постоянным делегатом доступную вам пару ключей. Эта пара ключей должна подписывать операции сжигания и перевода токенов.
Токены с делегатом будут представлять армию Solana. Создайте токены с делегатом в аккаунте токенов противника с помощью createDelegateTokens из строки 33 файла DelegateToken.ts. После выпуска токенов армия Solana и противник вступают в условное сражение. По окончании битвы отзовите солдат из аккаунта противника с помощью функции transferDelegateTokens из строки 176 файла DelegateTokens.ts.
Обратите внимание: с адреса противника отозваны не все солдаты. Будем считать, что они погибли. Используйте функцию burn из @solana/spl-token, чтобы сжечь токены, оставшиеся в аккаунте токенов противника (sourceTokenAccount).
После победы в битве задание Solana Soldier завершается. Для закрытия аккаунта и возврата арендной платы использовалась функция closeAccount из @solana/spl-token. В этой статье не рассматриваются такие Token Extensions, как конфиденциальные переводы, комиссии за переводы и хуки переводов. Почти все расширения токенов можно комбинировать. Есть лишь несколько исключений, например хуки переводов и непередаваемые токены. Ссылки на примеры Token Extensions из этого руководства в Solana Playground приведены в разделе Дополнительные ресурсы.
Заключение
Вдохновленное CryptoZombies руководство Plug and Play охватывает основы создания популярных Token Extensions путем комбинирования расширений. Оно демонстрирует их компонуемость через практический игровой опыт. Примеры можно использовать как готовые решения Plug and Play или как руководство для разработчиков собственных токенов. Они предлагают упрощенный процесс создания аккаунтов с Token Extensions: от расчета их размера до определения порядка инструкций. Если игровой формат оказался полезным, поделитесь отзывом в нашем Discord или отметьте @helius в X.
Дополнительные ресурсы
- Начало работы с Token Extensions
- Solana Soldier в Solana Playground
- Полномочия на закрытие минта | Solana Playground
- Непередаваемые токены | Solana Playground
- Процентные токены | Solana Playground
- Постоянный делегат | Solana Playground
- Метаданные | Solana Playground
- Token Extensions на GitHub
- Token Program на GitHub
- SPL на GitHub
Похожие статьи
Подпишитесь на Helius
Следите за новостями разработки на Solana и получайте уведомления о наших публикациях


