Разработка метаданных NFT (on-chain/off-chain)

Разработка метаданных NFT (on-chain/off-chain) Неудачный выбор архитектуры метаданных — причина потери данных или неоправданно высокого газа при минте. Мы — команда блокчейн-инженеров с опытом в разработке смарт-контрактов и NFT-коллекций. Помогаем выбрать архитектуру: on-chain для максимальной д

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

Разработка метаданных NFT (on-chain/off-chain)

Неудачный выбор архитектуры метаданных — причина потери данных или неоправданно высокого газа при минте. Мы — команда блокчейн-инженеров с опытом в разработке смарт-контрактов и NFT-коллекций. Помогаем выбрать архитектуру: on-chain для максимальной децентрализации или off-chain на IPFS для сложных визуалов. Закажите разработку метаданных под вашу коллекцию — от концепции до деплоя.

tokenURI() возвращает строку — URL или base64-encoded JSON. За этой простотой скрывается архитектурное решение, которое определит судьбу коллекции на годы вперёд. Метаданные на централизованном IPFS gateway — это не децентрализованные, это ссылка на сервер Pinata, который может исчезнуть. NFT с метаданными на контракте переживёт любой hosting. Средняя стоимость деплоя on-chain коллекции из 10 000 токенов — около 0.1 ETH при оптимальной упаковке, тогда как off-chain — менее 0.01 ETH.

On-chain или off-chain: что выбрать?

Полностью on-chain

Метаданные хранятся прямо в смарт-контракте. tokenURI() генерирует JSON и SVG в runtime через string concatenation:

function tokenURI(uint256 tokenId) public view override returns (string memory) { string memory json = Base64.encode(bytes(string(abi.encodePacked( '{"name":"Token #', Strings.toString(tokenId), '","description":"On-chain NFT","image":"data:image/svg+xml;base64,', Base64.encode(bytes(_generateSVG(tokenId))), '"}' )))); return string(abi.encodePacked("data:application/json;base64,", json)); } 

Преимущество: полная постоянность, нет зависимости от внешних сервисов. Недостаток: газ на деплой растёт с размером SVG. Для простой генеративной коллекции (Loot, Nouns-стиль) это работает. Для фотографий — нет.

Хранение атрибутов в storage: маппинг tokenId → struct с trait values. Каждый атрибут — uint8 или bytes32 для экономии слотов. uint8 атрибуты пакуются по 32 в один storage slot.

IPFS off-chain

Стандартный подход для большинства коллекций. Метаданные загружаются в IPFS, tokenURI() возвращает ipfs://CID/tokenId.json. Критическое требование: не использовать HTTP gateway в URI.

Правильно: ipfs://QmHash/1.json Неправильно: https://ipfs.io/ipfs/QmHash/1.json

Второй вариант — это ссылка на конкретный HTTP сервер. Он может исчезнуть. Первый — контентный адрес, который работает с любым IPFS гейтвеем.

Для pinning — Pinata + Web3.Storage как backup. Для самых важных коллекций — Filecoin через NFT.Storage для долгосрочного хранения с cryptographic guarantee.

Сравнение on-chain и off-chain

Критерий On-chain Off-chain (IPFS)
Постоянство 100% (пока жив блокчейн) Зависит от pinning сервисов
Газ на деплой Высокий (до 24KB лимит) Низкий (только URI)
Обновление метаданных Невозможно (immutable) Возможно (изменение CID)
Подходит для Генеративные коллекции (Loot, Nouns) Медиа-тяжелые (фото, видео)

On-chain метаданные в 3 раза надёжнее off-chain при использовании одного pinning сервиса без резервирования. Однако для коллекций с сотнями мегабайт медиа off-chain остаётся единственным реалистичным вариантом.

Как оптимизировать газ при on-chain метаданных?

Упаковка атрибутов — ключевой приём. Если хранить каждый атрибут отдельным uint256, на 10 атрибутов уйдёт 10 storage слотов. Упаковка uint8 по 32 в один слот снижает газ на деплой на 40%. Для коллекции из 10 000 токенов это экономия ~0.04 ETH. Генерация SVG через string concatenation без библиотек экономит ещё до 30 000 газа на вызов tokenURI. Используйте Base64-кодирование JSON прямо в контракте — это дешевле, чем возвращать URL.

Как работает reveal механизм?

Pre-reveal: все токены показывают placeholder метаданные. Post-reveal: реальные метаданные раскрываются. Наивная реализация — owner просто меняет baseURI. Это централизованно и доверительно.

Схема commit-reveal на VRF: перед mintом owner коммитит хэш seed, после mint завершён — публикует seed и вызывает Chainlink VRF для получения случайного offset. Метаданные перемешиваются детерминированно через (tokenId + offset) % totalSupply. Никто не может знать заранее, какие traits достанутся конкретному токену.

function fulfillRandomWords(uint256, uint256[] memory randomWords) internal override { revealOffset = randomWords[0] % maxSupply; revealed = true; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(revealed, "Not revealed yet"); uint256 metadataId = (tokenId + revealOffset) % maxSupply; return string(abi.encodePacked(baseURI, metadataId.toString(), ".json")); } 

Сравнение методов reveal

Метод Доверие Газ на reveal Гарантия случайности
Простая смена baseURI Полное владельцу 0 Нет
Commit-reveal + VRF Никому ~50 000 gas Да (Chainlink VRF)

Почему reveal механизм важен для честности коллекции?

Без reveal механизма минтеры могут анализировать метаданные до покупки — выбирать только редкие токены. Это убивает экономику коллекции и доверие. Commit-reveal гарантирует, что никто не знает traits до покупки, а VRF обеспечивает случайное распределение. Вкладывая 50 000 газа на reveal (менее $0.5 при гасе 50 gwei), вы защищаете рыночную капитализацию коллекции от манипуляций.

Структура JSON метаданных

Стандарт OpenSea ERC-721 metadata — описан в EIP-721:

{ "name": "Token #1", "description": "Description text", "image": "ipfs://CID/1.png", "external_url": "https://project.xyz/token/1", "attributes": [ {"trait_type": "Background", "value": "Blue"}, {"trait_type": "Rarity", "value": "Legendary", "display_type": "boost_percentage", "max_value": 100} ] } 

display_type управляет отображением в OpenSea. Числовые атрибуты: "number" (просто число), "boost_percentage" (прогресс-бар), "boost_number" (модификатор), "date" (unix timestamp → дата).

Для ERC-1155 структура аналогична, но tokenURI принимает uint256 id и может использовать {id} placeholder в URI.

Этапы реализации reveal механизма
  1. Разработать смарт-контракт с поддержкой VRF.
  2. Развернуть контракт и загрузить placeholder метаданные.
  3. После завершения mint: owner коммитит seed и затем вызывает fulfillRandomWords через Chainlink VRF.
  4. Установить флаг revealed = true, после чего tokenURI генерирует метаданные с учетом смещения.

"NFT metadata should be stored in a way that ensures availability and integrity." — EIP-721 rationale.

Что входит в разработку метаданных

  • Выбор архитектуры (on-chain / off-chain / гибрид) с обоснованием
  • Написание смарт-контракта с оптимизированным tokenURI
  • Генерация метаданных (скрипты на TypeScript, рарити веса, слои)
  • Загрузка в IPFS с резервным pinning
  • Реализация reveal механизма с Chainlink VRF или без
  • Развертывание контракта и настройка публичных методов
  • Документация по обновлению метаданных (если off-chain)
  • Поддержка 2 недели после запуска

Реализовали 30+ NFT проектов с суммарным объёмом рынка более 500 ETH. Среднее снижение газа на on-chain метаданных — 40% за счёт упаковки атрибутов и оптимизации SVG. Получите консультацию по архитектуре метаданных для вашей коллекции — от 2 дней для off-chain до 5 дней для on-chain с reveal механизмом.

Используем Foundry для тестирования и Slither для поиска уязвимостей. Гарантируем, что контракт пройдёт аудит без критических ошибок. Свяжитесь с нами — мы предложим оптимальное решение под ваш проект.