Создание Сжатых NFT
Введение
Это руководство знакомит с концепцией сжатых NFT (cNFT) в блокчейне TON — специализированным форматом цифровых активов, оптимизированным для хранения данных с использованием алгоритмов сжатия и деревьев Меркла. Здесь объясняется, как cNFT позволяют снижать затраты на хранение и передачу данных при сохранении уникальности и проверяемости, а также приводятся практические шаги по развертыванию и управлению масштабируемыми NFT-коллекциями.
Особенности
- Экономия ресурсов: Деревья Меркла хранят только ключевые данные, снижая расходы на газ и нагрузку на сеть.
- Улучшенная масштабируемость: Эффективные контракты обрабатывают большие объёмы NFT без потери производительности.
- Оптимизированное хранение данных: Минимизация информации на блокчейне ускоряет работу системы и экономит место.
- Повышенная безопасность: Деревья Меркла обеспечивают быстрые проверки целостности данных и надёжную защиту активов.
- Снижение затрат: Перенос стоимости выпуска на конечных пользователей и создание “виртуальных” on-chain объектов только при необходимости.
Поддержка
Текущие ограничения
Большинство популярных кошельков и маркетплейсов не отображают незатребованные cNFT или NFT из коллекций, не являющихся официальными партнёрами. Например, Telegram Wallet и маркетплейс Getgems индексируют только первые 200 элементов для неофициальных коллекций, что создаёт трудности при работе с крупными коллекциями.
Сценарий атаки
Злоумышленник может создать сотни тысяч NFT с минимальными затратами, вынуждая маркетплейсы хранить сопутствующие данные — даже если сами элементы не размещены, а генерируются по требованию.
Возможное решение
Предоставить отдельный интерфейс, в котором пользователи смогут самостоятельно «запрашивать» (claim) свои cNFT. После запроса NFT индексируются и отображаются в кошельках и на маркетплейсах как обычные NFT, что обеспечивает лучшую видимость и доступность.
Настройка и развертывание
Подготовка NFT
Перед развертыванием необходимо подготовить метаданные и изображения для ваших NFT.
Подготовка метаданных
-
Метаданные коллекции Создайте файл
collection.json, содержащий обязательные поля в соответствии со стандартом данных NFT-токенов. Пример: -
Метаданные NFT-элементов Для каждого NFT создайте отдельный JSON-файл (например,
0.json,1.jsonи т.д.) с обязательными полями, указанными в стандарте данных NFT-токенов. Пример:
Подготовка ресурсов
- Изображения: Подготовьте изображения для коллекции (например,
logo.pngв качестве аватара) и для каждого NFT (например,0.png,1.pngи т.д.). - JSON-файлы: Разместите файл
collection.jsonи JSON-файлы для NFT на общедоступном сервере или в репозитории. Убедитесь, что у каждого файла уникальный URL.
Note
Все изображения и JSON-файлы должны быть доступны напрямую по своим URL-адресам.
Подготовка манифеста TC
Создайте JSON-файл манифеста TON Connect, описывающий ваше приложение для отображения во время подключения кошелька.
Пример:
Note
Убедитесь, что данный файл доступен по URL-адресу в открытом доступе.
Подготовка списка владельцев
Подготовьте файл owners.txt, в котором укажите адреса владельцев NFT — по одному адресу на строку. Первый адрес соответствует элементу с индексом 0, второй — элементу с индексом 1 и т.д.
Пример:
Подготовка инфраструктуры
Настройте сервер для размещения вашего API и интерфейса запроса (claim) NFT. Также получите доменное имя для доступа к API. В этом примере используется локальное тестовое развертывание на домашнем компьютере с помощью ngrok для создания публичного URL.
Настройка API для запроса NFT
-
Клонируйте репозиторий
Клонируйте проект, содержащий все необходимые исходные файлы: -
Установите зависимости
Установите Docker, Docker Compose и ngrok, и убедитесь, что они корректно настроены на вашей машине. -
Создайте Telegram-бота
Создайте бота в Telegram и получите его API-токен. -
Откройте доступ к API
Используйте ngrok для создания публичного URL для тестирования:Для продакшена: Настройте собственный домен и сконфигурируйте Nginx для проксирования запросов к вашему API на порт 8080. Это включает в себя:
- Регистрацию домена и привязку его к вашему серверу.
- Настройку Nginx для проксирования запросов на порт 8080.
-
Создайте файл
.env
Скопируйте файлenv.exampleпод именем.envи обновите его с учётом вашей конфигурации. Ниже приведено описание каждого параметра:Key Description Example Notes PORTПорт, на котором будет работать API. 8080ADMIN_USERNAMEИмя пользователя администратора для доступа к защищённым функциям. adminADMIN_PASSWORDПароль администратора для доступа к защищённым функциям. passwordDEPTHГлубина коллекции NFT (максимальное количество элементов = 2^DEPTH; максимальное значениеDEPTH— 30).20IS_TESTNETУкажите, подключаетесь ли вы к тестовой сети TON ( true) или основной сети (false).trueorfalsePOSTGRES_PASSWORDПароль для подключения к PostgreSQL. secretPOSTGRES_DBИмя базы данных PostgreSQL. merkleapiPOSTGRES_URIПолный URI подключения к PostgreSQL. postgresql://postgres:secret@db:5432/merkleapiBOT_TOKENТокен вашего Telegram-бота (полученный через @BotFather). 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11Используется в интерфейсе запроса NFT. API_BASE_URLВнешний домен вашего API. https://example.ngrok.ioЗамените на ваш публичный URL (например, через ngrok). TONCONNECT_MANIFEST_URLURL к файлу манифеста TON Connect. https://example.com/tonconnect-manifest.jsonЗамените на публичный адрес вашего манифеста. COLLECTION_ADDRESSАдрес NFT-коллекции. Укажите после развертывания коллекции. -
Запустите API и базу данных
Выполните следующую команду для запуска API и базы данных: -
Выполните миграции базы данных
Создайте необходимые таблицы в базе данных: -
Добавьте владельцев
Поместите файлowners.txt(с адресами владельцев) в папкуapi, затем выполните: -
Переобнаружение элементов
В браузере перейдите по адресу<API_URI>/admin/rediscoverи войдите, используяADMIN_USERNAMEиADMIN_PASSWORD. При успешном выполнении вы увидите сообщениеok. Спустя некоторое время (в зависимости от количества элементов) в папкеapi/apidata/updпоявится файл, например1.json. -
Сгенерируйте обновление
Выполните следующую команду для генерации обновления:docker-compose exec api /ctl genupd <path-to-update-file> <collection-owner> <collection-meta> <item-meta-prefix> <royalty-base> <royalty-factor> <royalty-recipient> <api-uri-including-v1>Замените параметры следующим образом:
<path-to-update-file>: Путь к файлу обновления, созданному на шаге 9 (например,api/apidata/upd/1.json).<collection-owner>: Адрес владельца NFT-коллекции.<collection-meta>: Полный URL к файлу метаданных коллекции (например,https://yourdomain.com/collection.json).<item-meta-prefix>: Общий префикс для метаданных элементов (например, если метаданные элемента 0 расположены по адресуhttps://yourdomain.com/0.json, используйтеhttps://yourdomain.com/).<royalty-base>: Числитель для расчёта роялти (например, 10 для 10%, если фактор-роялти равен 100).<royalty-factor>: Знаменатель для роялти (например, 100).<royalty-recipient>: Адрес, получающий роялти (может совпадать с<collection-owner>).<api-uri-including-v1>: Публичный URL вашего API с постфиксом/v1(например, если вы использовалиhttps://yourapi.com/admin/rediscoverдля генерации файла обновления, здесь укажитеhttps://yourapi.com/v1).
-
Вызовите ссылку
ton://
После генерации обновления в консоли появится ссылка форматаton://. Перейдите по этой ссылке и подтвердите транзакцию. Для удобства вы можете вставить эту ссылку в генератор QR-кодов и отсканировать её с помощью кошелька Tonhub (в testnet или mainnet). -
Установите адрес коллекции
В браузере перейдите по адресу<API_URI>/admin/setaddr/<collection-address>, заменив<collection-address>на адрес, полученный при развертывании коллекции. -
Ожидайте подтверждения
Следите за логами контейнера API до появления сообщения оcommitted state(зафиксированном состоянии). -
Развертывание завершено!
Запуск бота для запроса NFT
-
Обновите файл
.env
Добавьте в.envпеременнуюCOLLECTION_ADDRESS, полученную при развертывании коллекции. -
Запустите Telegram-бота
Выполните следующую команду для запуска бота: -
Взаимодействуйте с ботом
Откройте Telegram, перейдите к своему боту и следуйте его инструкциям для запроса NFT. -
Готово!
Обновление списка владельцев
Выполните следующие шаги, чтобы обновить список владельцев и применить изменения в вашей NFT-коллекции:
-
Подготовьте новый файл владельцев
Создайте файлnew-owners.txtс новыми адресами владельцев и поместите его в папкуapi. -
Добавьте новых владельцев
Выполните команду: -
Переобнаружьте элементы
В браузере перейдите по адресу<API_URI>/admin/rediscoverи войдите под своимиADMIN_USERNAMEиADMIN_PASSWORD. -
Найдите файл обновления
После переобнаружения найдите новый файл обновления в папкеapi/apidata/upd(например,2.json, если предыдущий был1.json). -
Сгенерируйте обновление
Выполните команду:Замените
<path-to-update-file>на путь к новому файлу (например,api/apidata/upd/2.json), а<collection-address>— на адрес вашей NFT-коллекции. -
Перейдите по
ton://ссылке
Перейдите по сгенерированной ссылкеton://и подтвердите транзакцию. Вы также можете создать QR-код по этой ссылке и отсканировать его с помощью кошелька Tonhub. -
Ожидайте подтверждения
Следите за логами контейнера API до появления сообщения оcommitted state(зафиксированном состоянии): -
Готово!
Заключение
Стандарт сжатых NFT кардинально меняет подход к созданию и управлению NFT коллекциями, предлагая масштабируемое и экономически эффективное решение для массового выпуска NFT. Устраняя ограничения существующих стандартов, данный подход открывает путь к более широкому применению NFT технологии в развитии сообществ и маркетинговых кампаниях.