Перейти к содержанию

Создание Сжатых 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-токенов. Пример:

    {
        "name": "<collection name>",
        "description": "<collection description>",
        "image": "<link to the image (e.g. https://yourdomain.com/logo.png)>"
    }
    
  • Метаданные NFT-элементов Для каждого NFT создайте отдельный JSON-файл (например, 0.json, 1.json и т.д.) с обязательными полями, указанными в стандарте данных NFT-токенов. Пример:

    {
        "name": "<item name>",
        "description": "<item description>",
        "image": "<link to the image (e.g. https://yourdomain.com/0.png)>"
    }
    

Подготовка ресурсов

  • Изображения: Подготовьте изображения для коллекции (например, logo.png в качестве аватара) и для каждого NFT (например, 0.png, 1.png и т.д.).
  • JSON-файлы: Разместите файл collection.json и JSON-файлы для NFT на общедоступном сервере или в репозитории. Убедитесь, что у каждого файла уникальный URL.

Note

Все изображения и JSON-файлы должны быть доступны напрямую по своим URL-адресам.

Подготовка манифеста TC

Создайте JSON-файл манифеста TON Connect, описывающий ваше приложение для отображения во время подключения кошелька.
Пример:

{
  "url": "<app url>",
  "name": "<app name>",
  "iconUrl": "<app icon url>"
}

Note

Убедитесь, что данный файл доступен по URL-адресу в открытом доступе.

Подготовка списка владельцев

Подготовьте файл owners.txt, в котором укажите адреса владельцев NFT — по одному адресу на строку. Первый адрес соответствует элементу с индексом 0, второй — элементу с индексом 1 и т.д.
Пример:

UQDYzZmfsrGzhObKJUw4gzdeIxEai3jAFbiGKGwxvxHinf4K
UQCDrgGaI6gWK-qlyw69xWZosurGxrpRgIgSkVsgahUtxZR0

Подготовка инфраструктуры

Настройте сервер для размещения вашего API и интерфейса запроса (claim) NFT. Также получите доменное имя для доступа к API. В этом примере используется локальное тестовое развертывание на домашнем компьютере с помощью ngrok для создания публичного URL.

Настройка API для запроса NFT

  1. Клонируйте репозиторий
    Клонируйте проект, содержащий все необходимые исходные файлы:

    git clone https://github.com/nessshon/cnft-toolbox 
    
  2. Установите зависимости
    Установите Docker, Docker Compose и ngrok, и убедитесь, что они корректно настроены на вашей машине.

  3. Создайте Telegram-бота
    Создайте бота в Telegram и получите его API-токен.

  4. Откройте доступ к API
    Используйте ngrok для создания публичного URL для тестирования:

    ngrok http 8080 
    

    Для продакшена: Настройте собственный домен и сконфигурируйте Nginx для проксирования запросов к вашему API на порт 8080. Это включает в себя:

    • Регистрацию домена и привязку его к вашему серверу.
    • Настройку Nginx для проксирования запросов на порт 8080.
  5. Создайте файл .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 or false
    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-коллекции. Укажите после развертывания коллекции.
  6. Запустите API и базу данных
    Выполните следующую команду для запуска API и базы данных:

    docker-compose up -d db api 
    
  7. Выполните миграции базы данных
    Создайте необходимые таблицы в базе данных:

    docker-compose exec api /ctl migrate 
    
  8. Добавьте владельцев
    Поместите файл owners.txt (с адресами владельцев) в папку api, затем выполните:

    docker-compose exec api /ctl add /api/owners.txt 
    
  9. Переобнаружение элементов
    В браузере перейдите по адресу <API_URI>/admin/rediscover и войдите, используя ADMIN_USERNAME и ADMIN_PASSWORD. При успешном выполнении вы увидите сообщение ok. Спустя некоторое время (в зависимости от количества элементов) в папке api/apidata/upd появится файл, например 1.json.

  10. Сгенерируйте обновление
    Выполните следующую команду для генерации обновления:

    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).
  11. Вызовите ссылку ton://
    После генерации обновления в консоли появится ссылка формата ton://. Перейдите по этой ссылке и подтвердите транзакцию. Для удобства вы можете вставить эту ссылку в генератор QR-кодов и отсканировать её с помощью кошелька Tonhub (в testnet или mainnet).

  12. Установите адрес коллекции
    В браузере перейдите по адресу <API_URI>/admin/setaddr/<collection-address>, заменив <collection-address> на адрес, полученный при развертывании коллекции.

  13. Ожидайте подтверждения
    Следите за логами контейнера API до появления сообщения о committed state (зафиксированном состоянии).

    docker-compose logs api 
    
  14. Развертывание завершено!

Запуск бота для запроса NFT

  1. Обновите файл .env
    Добавьте в .env переменную COLLECTION_ADDRESS, полученную при развертывании коллекции.

  2. Запустите Telegram-бота
    Выполните следующую команду для запуска бота:

    docker-compose up -d redis bot 
    
  3. Взаимодействуйте с ботом
    Откройте Telegram, перейдите к своему боту и следуйте его инструкциям для запроса NFT.

  4. Готово!

Обновление списка владельцев

Выполните следующие шаги, чтобы обновить список владельцев и применить изменения в вашей NFT-коллекции:

  1. Подготовьте новый файл владельцев
    Создайте файл new-owners.txt с новыми адресами владельцев и поместите его в папку api.

  2. Добавьте новых владельцев
    Выполните команду:

    docker-compose exec api /ctl add /api/new-owners.txt 
    
  3. Переобнаружьте элементы
    В браузере перейдите по адресу <API_URI>/admin/rediscover и войдите под своими ADMIN_USERNAME и ADMIN_PASSWORD.

  4. Найдите файл обновления
    После переобнаружения найдите новый файл обновления в папке api/apidata/upd (например, 2.json, если предыдущий был 1.json).

  5. Сгенерируйте обновление
    Выполните команду:

    docker-compose exec api /ctl genupd <path-to-update-file> <collection-address> 
    

    Замените <path-to-update-file> на путь к новому файлу (например, api/apidata/upd/2.json), а <collection-address> — на адрес вашей NFT-коллекции.

  6. Перейдите по ton:// ссылке
    Перейдите по сгенерированной ссылке ton:// и подтвердите транзакцию. Вы также можете создать QR-код по этой ссылке и отсканировать его с помощью кошелька Tonhub.

  7. Ожидайте подтверждения
    Следите за логами контейнера API до появления сообщения о committed state (зафиксированном состоянии):

    docker-compose logs api 
    
  8. Готово!

Заключение

Стандарт сжатых NFT кардинально меняет подход к созданию и управлению NFT коллекциями, предлагая масштабируемое и экономически эффективное решение для массового выпуска NFT. Устраняя ограничения существующих стандартов, данный подход открывает путь к более широкому применению NFT технологии в развитии сообществ и маркетинговых кампаниях.

См. Также