Пошаговое создание коллекции NFT
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
👋 Введение
Невзаимозаменяемые токены (NFT) стали одной из самых обсуждаемых тем в мире цифрового искусства и коллекционирования. NFT - это уникальные цифровые активы, использующие технологию блокчейн для подтверждения права собственности и подлинности. Они открыли перед создателями и коллекционерами н овые возможности для монетизации и торговли цифровым искусством, музыкой, видео и другими цифровым контентом. За последние годы рынок NFT стремительно вырос, а некоторые сделки достигли миллионов долларов. В этой статье мы пошагово создадим коллекцию NFT на TON.
Вот такая прекрасная коллекция уток будет создана вами к концу этого урока:

🦄 Чему Вы научитесь
- Вы создадите коллекцию NFT на TON.
- Вы поймете, как работают NFT на TON.
- Вы выставите NFT на продажу.
- Вы загрузите метаданные на pinata.cloud.
💡 Необходимые компоненты
У вас уже должен быть testnet кошелек, в котором находится не менее 2 TON. Вы можете получить testnet коины от @testgiver_ton_bot.
- Откройте настройки и нажмите 5 раз на логотип Tonkeeper внизу экрана.
- Активируйте Dev mode.
- Вернитесь в главное меню и создайте новый testnet-кошелек - Добавить кошелек/Добавить аккаунт Testnet.
Мы будем использовать Pinata как систему хранения IPFS, поэтому вам также нужно создать аккаунт на pinata.cloud и получить api_key & api_secreat. Официальная обучающая документация Pinata может помочь в этом. Как только вы получите эти API-токены, возвращайтесь сюда!
💎 Что такое NFT на TON?
Прежде чем перейти к основной части нашего руководства, необходимо понять, как NFT работают на TON в общих чертах. Неожиданно, но мы начнем с объяснения того, как NFT работают на Ethereum (ETH), чтобы понять чем реализация NFT на TON уникальна по сравнению с другими блокчейнами в этой отрасли.
Реализация NFT на ETH
Реализация NFT на ETH крайне проста - существует 1 основной контракт коллекции, который хранит простую хэш-таблицу, содержащую данные NFT из этой коллекции. Все запросы, связанные с этой коллекцией (если какой-либо пользователь хочет передать NFT, выставить его на продажу и т.д.), отправляются именно в этот единый контракт коллекции.

Проблемы такой реализации в TON
Проблемы такой реализации в контексте TON подробно описаны в стандарте NFT в TON:
-
Непредсказуемоееее потребление газа. В TON расход газа на операции со словарем зависит от точного набора ключей. Кроме того, TON - это асинхронный блокчейн. Это означает, что если Вы отправляете сообщение смарт-контракту, то вы не знаете, сколько сообщений от других пользователей дойдет до смарт-контракта раньше вашего сообщения. Таким образом, вы не знаете, каким будет размер словаря в тот момент, когда ваше сообщение достигнет смарт-контракта. Это нормально для простого взаимодействия кошелек -> смарт-контракт NFT, но неприемлемо для цепочек смарт-контрактов, например, кошелек -> смарт-контракт NFT -> аукцион -> смарт-контракт NFT. Если мы не можем предсказать расход газа, то может возникнуть ситуация, когда владелец сменился в смарт-контракте NFT, но для операции аукциона не хватило Тонкоинов. Использование смарт-контрактов без словарей дает детерминированный расход газа.
-
Не масштабируется (становится узким местом). Масштабирование в TON основано на концепции шардинга, то есть автоматическом разделении сети на шардинги при высокой нагрузке. Один большой смарт-контракт популярного NFT противоречит этой концепции. В этом случае многие транзакции будут ссылаться на один смарт-контракт. Архитектура TON предусматривает использование шардинговых смарт-контрактов (см. whitepaper), но на данный момент они не реализованы.
TL;DR Решение ETH не масштабируемо и не подходит для асинхронных блокчейнов, таких, как TON.
Реализация TON NFT
В TON у нас есть мастер-контракт — смарт-контракт нашей коллекции, который хранит метаданные и адрес владельца коллекции. Главное, что если мы хотим создать (минтить) новый NFT-элемент, нам нужно просто отправить сообщение этому контракту коллекции. Этот контракт коллекции затем развернет новый контракт NFT-элемента, используя данные, которые мы предоставим.

Вы можете ознакомиться со статьей Обработка NFT в TON или прочитать стандарт NFT, если хотите более подробно изучить эту тему
⚙ Настройка среды разработки
Давайте начнем с создания пустого проекта:
- Создайте новую папку
mkdir MintyTON
- Откройте эту папку
cd MintyTON
- Инициализируем наш проект
yarn init -y
- Установите typescript
yarn add typescript @types/node -D
- Запуск проекта TypeScript
tsc --init
- Скопируйте эту конфигурацию в файл tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"lib": ["ES2022"],
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": "src",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"strict": true,
"esModuleInterop": true,
"strictPropertyInitialization": false
},
"include": ["src/**/*"]
}
- Добавьте скрипт для сборки и запуска нашего приложения в
package.json.
"scripts": {
"start": "tsc --skipLibCheck && node dist/app.js"
},
- Установите необходимые библиотеки
yarn add @pinata/sdk dotenv @ton/ton @ton/crypto @ton/core buffer
- Создайте файл
.envи добавьте свои собственные данные на основе этого шаблона
PINATA_API_KEY=your_api_key
PINATA_API_SECRET=your_secret_api_key
MNEMONIC=word1 word2 word3 word4
TONCENTER_API_KEY=aslfjaskdfjasasfas
Вы можете получить API-ключ для toncenter у @tonapibot и выбрать mainnet или testnet. В переменной MNEMONIC храните 24 слова сид-фразы кошелька владельца коллекции.
Отлично! Теперь мы готовы начать писать код для нашего проекта.