Создание Сжатых 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. 8080
ADMIN_USERNAME
Имя пользователя администратора для доступа к защищённым функциям. admin
ADMIN_PASSWORD
Пароль администратора для доступа к защищённым функциям. password
DEPTH
Глубина коллекции NFT (максимальное количество элементов = 2^DEPTH
; максимальное значениеDEPTH
— 30).20
IS_TESTNET
Укажите, подключаетесь ли вы к тестовой сети TON ( true
) или основной сети (false
).true
orfalse
POSTGRES_PASSWORD
Пароль для подключения к PostgreSQL. secret
POSTGRES_DB
Имя базы данных PostgreSQL. merkleapi
POSTGRES_URI
Полный URI подключения к PostgreSQL. postgresql://postgres:secret@db:5432/merkleapi
BOT_TOKEN
Токен вашего Telegram-бота (полученный через @BotFather). 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
Используется в интерфейсе запроса NFT. API_BASE_URL
Внешний домен вашего API. https://example.ngrok.io
Замените на ваш публичный URL (например, через ngrok). TONCONNECT_MANIFEST_URL
URL к файлу манифеста 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 технологии в развитии сообществ и маркетинговых кампаниях.