
AllYouNeedIsNFT: проверка уникальности изображений и генеративный NFT-редактор
- Опубликовано
- • 4 мин чтения•--- просмотров
В 2021-2022 годах я был сооснователем NFT-маркетплейса AllYouNeedIsNFT. В разговорах с художниками постоянно всплывала одна проблема: картинки из одной коллекции раз за разом появлялись в других под новыми именами. Покупатель не мог быстро отличить копию от оригинала.
Поэтому параллельно с маркетплейсом мы сделали два инструмента. Первый проверяет, существует ли NFT-изображение уже в других коллекциях. Второй - редактор, в котором художник генерирует целую коллекцию из ассетов, нарисованных им самим. В этой статье про оба.
Проверка изображения по рынку
Сервис уникальности написал сторонний разработчик по спецификации, которую мы с ним согласовали. Я курировал сдачу и интегрировал сервис в основной сайт. На видео ниже ранняя сборка, которая ещё отлаживается.
Сервис отталкивается от уже существующих коллекций. Он извлекает коллекцию, скачивает все её изображения и индексирует их. База собиралась с OpenSea и других площадок.
Основная работа происходит на этапе индексации. Алгоритм анализа изображений обрабатывает каждую картинку и связывает её с теми, что уже лежат в индексе. Для каждой пары он считает счёт схожести. В индексе хранятся и сами изображения, и связи между ними, поэтому при поиске не нужно заново сравнивать пиксели.
Когда добавляется новая коллекция, сервис делает выборку по уже проиндексированным коллекциям и сравнивает с ними каждое изображение из новой. Каждая картинка получает индекс уникальности - одно число, которое показывает, насколько она близка к чему-то, что уже есть на рынке.
Тот же путь работает и для одной картинки. Посетитель загружает изображение, сервис прогоняет его по индексу и возвращает ближайшее совпадение. На скриншоте результат для одного изображения из одной из проанализированных коллекций: сервис признал его неуникальным и указал на comfy-apes-club #100 на blur.io как на оригинал.

Генерация коллекции из ассетов одного художника
Второй инструмент - NFT-редактор. Генеративные коллекции тогда обычно собирали из слоёв, нарисованных разными людьми, и результат редко был похож на чью-то конкретную работу. Редактор сделан так, чтобы всю коллекцию мог задать один художник.
Художник начинает с холста, на скриншотах это 800x600, и делит его на произвольные области. Области могут быть вложены друг в друга. Для каждой области художник загружает свой набор изображений, и отдельный набор для фонов.

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

В итоге получается коллаж в стиле, который художник задал при настройке рабочего пространства. Переключатель превью показывает пример до сохранения, а чекбокс Published управляет тем, когда коллекция станет видна на маркетплейсе. Кошелёк в шапке подключён к Fantom, который маркетплейс тогда поддерживал.

Редактор работал и на телефоне. Те же элементы управления выстраиваются вертикально, а холст сохраняет пропорции.

Где искать остальное
Сервис уникальности заработал по адресу unique.allyouneedisnft.com, и я интегрировал его в маркетплейс. На странице проекта есть видеопрезентация, которую я записывал для англоязычной аудитории, и полная спецификация, по которой сервис был построен.
Если вы строите маркетплейс сегодня, урок всё ещё в силе. Проиндексируйте рынок, с которым конкурируете, до того как принимать загрузки, и дайте покупателю счёт схожести вместо обещания.
По теме
Проекты

AllYouNeedIsNft - стартап NFT-маркетплейса
До: идея на бумаге, 0 пользователей, 0 строк кода. После: работающий NFT-маркетплейс с авторизацией через кошелёк, листингами и процессом покупки. Результат: MVP за 3 месяца, первые авторы подключены на пике рынка Web3.
Статьи
Структура проекта и тестирование в .NET Core 6 vs .NET Core 5: юнит-тесты, GraphQL и test server fixtures
Практическое сравнение структуры проектов .NET Core 5 и 6 с реальными примерами юнит-тестирования, интеграции GraphQL и настройки test server fixture.
Собеседование в Chainlink Labs
Прошёл первый этап отбора в Chainlink Labs. Всё понравилось, но позиция требовала находиться на территории США.
Pausable в OpenZeppelin: рубильник для смарт-контракта
Если продуманные механизмы контракта дали сбой, остаётся последний: рубильник. В OpenZeppelin для этого есть Pausable, и забывать про него нельзя.
Открыт для работы по контракту
Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.
Записаться на 30-минутный звонок