Доказательство концепции платформы — пошаговое руководство по созданию конвейера генеративного искусства NFT.
Ускоряйтесь
Вот отличная статья на Medium, если у вас есть время, 111-минутное чтение о том, что такое NFT. Загляните в Википедию, чтобы узнать о генеративном искусстве.
Ради этой статьи я предполагаю, что вы немного знакомы с NFT и думаете о создании своего собственного. Можно сказать, что это уникальные цифровые объекты, которые представляют собой доказательство владения чем-либо. Генеративное искусство — это искусство, созданное в какой-то степени автономным процессом.
NFT — отличный способ передать право собственности на результаты алгоритмического искусства.
Текущие гплатформы для генеративного искусства и почему вам следует создавать собственные
Вот 4 платформы, которые должны доминировать в генеративном арт-пространстве:
ArtBlocks — платформа номер один для художников, позволяющая создавать генеративный контент по запросу, хранящийся в Ethereum
DoodleLabs — адаптация брендов и художников из реального мира, преодоление разрыва между физическим миром и пространством NFT
fx(hash) — открытая платформа для создания генеративных NFT на tezos
gen.art — ежемесячные выпуски артов на основе членства, работающие как квази-DAO с токеном центрального управления
Если вы многообещающий артист без большого количества поклонников, вам может быть трудно попасть на эти популярные, устоявшиеся платформы. В какой-то момент у ArtBlocks были месяцы ожидания художников. На данный момент они закрыли процесс подачи заявок, поэтому в ближайшее время вы не сможете претендовать на выпадение Factory. Как только вы запускаете свою платформу, вы выпускаете ее по расписанию.
Еще одним преимуществом самостоятельного выполнения является то, что у вас есть полный контроль над деталями. Вы будете признанным художником в любой момент. Я решил установить бесплатные зарезервированные монетные дворы, привязанные к каждому из 420 FourierPunks, моей предыдущей коллекции. Когда у вас есть контроль над платформой, вы можете проявить творческий подход к распространению!
Подробнее, что я пробовал?
Ниже приведен обзор шагов, которые я предпринял для создания этого конвейера, который можно использовать на https://genvibes.io, пока остаются монетные дворы. Я не буду утверждать, что все, что ниже, является правильным способом сделать что-то, но я обнаружил, что это работает. Буду рад услышать отзывы в комментариях или в Твиттере, если у вас есть предложения или вопросы!
Шаг 1. Напишите код для генеративного искусства на выбранном языке сценариев
Я видел много отличных результатов от генеративных художников в Твиттере с использованием p5js, поэтому я использовал его для этого проекта. Теоретически вы можете использовать любой язык сценариев, который вам нравится. Я бы сказал, чем меньше зависимостей, тем лучше. Кроме того, было бы оптимальным создать сценарий наименьшего возможного размера в байтах. Причина в том, что сценарий в идеале окажется в вашем контракте.
Итак, напишите потрясающий сценарий создания искусства, который опирается на случайность, связанную одними и теми же правилами, и производит различные, но унифицированные результаты, каждый из которых прекрасен и уникален.
Шаг 2. Создайте договор солидности
Контракт — это то, что связывает воедино все важные аспекты владения и происхождения посредством токена. Для большинства проектов я запускаю онлайн-среду разработки Remix и загружаю контракт с помощью мастера OpenZeplin для библиотек контрактов ERC721.
Есть несколько функций, которые я добавил на этом этапе, чтобы подготовиться к конвейеру. В качестве примеров я буду использовать фрагменты из Generative Vibes Contract. Начнем с функции монетного двора.
Эта функция монетного двора требует оплаты и ограничивает общее количество монетных дворов. Он отслеживает идентификатор токена, используя объект счетчика OpenZeplin. Для многих других проектов NFT идентификатор токена будет увеличиваться и отправляться минтеру. Но для этого конвейера я хотел включить сопоставление идентификатора токена со случайным хэшем, сгенерированным при чеканке.
Код для генерации случайных чисел использует 20 крайних правых цифр хеша keccak256 атрибутов блока, идентификатора токена и минтера. Это значение используется для заполнения кода с шага 1 и определяет полученный результат искусства. Обязательно протестируйте семена! Я заметил, что p5js начинал создавать похожий вывод, когда семена были близки друг к другу или когда они превышали определенное значение. Проверьте свои семена.
Несколько переменных состояния используются, чтобы вывести это на более высокий уровень цепочки.
tokenHash
сопоставляет tokenId со своим случайным числомp5jsversion
хранит версию единственной зависимости скриптаgenerationCodeHash
— это хэш keccak256 кода JavaScript._baseURIextended
— это конечная точка метаданныхgenerationCode
— это сопоставление индекса со строкой, предназначенное для хранения генерации по частям в контракте.
Цель состоит в том, чтобы настроить контракт так, чтобы он имел конечное состояние, в котором само содержание контракта может воссоздать искусство. Раньше я рекомендовал меньше зависимостей, потому что их подключение к цепочке обходится дороже. Минимизированная версия p5js весит почти 800 КБ, что составляет около 512 000 000 газа. Учитывая текущие расходы на газ, это может быть более 50 ETH. В сообществе принято считать, что p5js «доступен из многих источников и вряд ли потеряется», поэтому хранения номера версии должно хватить на очень долгое время.
Как уже говорилось, хранить вещи на цепи дорого. Поэтому при развертывании контракта generationCode
был включен в качестве места назначения для фрагментов кода. Если кто-то хочет получить код, есть метод get для извлечения строк по индексу. Хэш скрипта был жестко закодирован во время развертывания для более позднего доказательства того, что «это код, используемый для создания ваших произведений искусства».
Последние несколько функций, которые я решил включить, позволили мне вознаградить владельцев предыдущего проекта. Существует отдельная функция монетного двора, которая позволяет пользователю отправить идентификатор FourierPunk, и если он достоверно владеет этим токеном, его монетный двор бесплатен. Я подумал, что это будет забавный способ вознаградить сторонников моего предыдущего проекта.
Шаг 3. Создайте свой веб-сайт для минтинга
Учитывая, насколько сообразительными становятся люди, вам может не понадобиться ни один из них! Достаточно присутствия в Твиттере или Discord с четкими инструкциями, как чеканить из контракта на Etherscan.
Но вот что я использовал: простой HTML, CSS и ванильный JavaScript. Три кнопки для минтинга и несколько ссылок на соцсети. Я использовал библиотеку ethers.js для взаимодействия со всем, что связано с web3 — чеканкой, проверкой прав собственности, подсчетом и прослушиванием событий. На сайте также есть API метаданных, который возвращает дружественный для OpenSea JSON.
Если пользователь заходит на сайт и у него есть несколько генеративных вайбов, идентификаторы их токенов будут отображаться внизу страницы. Эти ссылки ведут на страницу view.html, которая передает идентификатор в качестве параметра в URL-адресе.
Страница просмотра — это то, что запускает JavaScript на стороне клиента. Страница сначала импортирует нашу конкретную версию p5js из CDN, а затем внедряет скрипт генерации изображений. Дополнительный встроенный JavaScript извлекает начальное значение из нашего API. Это было место, где я размышлял над тем, что делать. Я мог бы использовать web3 для вызова контракта и прямого получения случайного числа. Чтобы упростить конвейер, я решил использовать вызов REST, а не полагаться на web3.
Шаг 4. Создайте воронку продаж
Пока я концептуализировал этот проект, до этого момента все было довольно ясно. Я возился с p5js, находя способы сделать приятные результаты, и у меня уже было понимание того, на что будут похожи контракт и веб-сайт, благодаря опыту в прошлых проектах. Вопросы, которые постоянно возникали у меня, были: «Как мне перейти от мятного к размещенному образу, созданному скриптом? Какая инфраструктура мне нужна? Как сделать его устойчивым и быстрым? Есть ли риск того, что код будет отображаться по-разному в разных средах? Нужно ли мне сесть, изучить Kubernetes/Docker и разместить это? Сколько это все будет стоить?»
Аналитический паралич. До. 🎇💡 🎇 «Просто делайте все локально.» Простое решение, может быть, глупое? Неважно, заставил меня двигаться снова. Итак, я встал перед своей любимой IDE, Jupyter, и прокомментировал конвейер. Путь стал чище.
Вот код конвейера.
Во-первых, проверьте общую поставку контракта.
Во-вторых, выполните итерацию по каждому токену и проверьте, связаны ли с ними метаданные. Если нет, добавьте идентификатор токена в очередь. Для этого пайплайна отсутствие метаданных означает, что токен создан недавно, а искусство не отображается и не размещается.
То, как это закодировано — ужасно. Импорт среднего кода, избыточность, некачественная оптимизация. 😱 Но работает ли это? До сих пор да. Проходя мимо этого…
Начиная с последнего изображения, мы видим, что очередь, которую мы создали на предыдущем шаге, теперь повторяется. Каждый идентификатор токена передается в функцию pipeline
. Первая часть метаданных передается в AWS DynamoDB для передачи API. В этот момент, когда вы перейдете к https://api.genvibes.io/token?id={tid}
, вы получите обратно идентификатор токена и его случайное число.
Следующая часть сохраняет png и атрибуты изображения этого токена. У меня все работало хорошо, поэтому я не хотел вносить еще много изменений в сценарий. В этой части я использовал Selenium, чтобы запустить браузер и загрузить изображение токена, которое имитирует, когда кто-то переходит к нему. Значения метаданных возвращаются из функции в скрипте p5js, который помещается в <div>
, который может быть очищен BeautifulSoup. Изображение сохраняется на моем рабочем столе.
Затем openseaify()
создает метаданные таким образом, чтобы они соответствовали стандартам метаданных OpenSea. Все готово, кроме изображения, которое нужно где-то разместить. Я использую некоторые конечные точки из сервиса закрепления Pinata, чтобы загрузить сохраненный png в IPFS. Это возвращает хэш IPFS, который может быть сохранен в JSON и может использоваться OpenSea. Как только метаданные будут готовы, мы обновим запись в DynamoDB.
Шаг 5. Запустите!
Создав все компоненты, поместите все туда, куда нужно! Вот обзор архитектуры, которую я использовал:
✅ AWS Amplify для веб-сайта
✅ AWS DynamoDB для хранения метаданных
✅ AWS API Gateway для конечной точки REST
✅ Выделенный компьютер для конвейера рендеринга
Затем отправляйтесь в Twitter и Discord для продвижения 👈 (сложная часть)
Можно улучшить
В моей текущей настройке есть вопиющая ошибка. Конвейер рендеринга должен продолжать работать до тех пор, пока не будет завершена разработка проекта. На данный момент за несколько дней было выпущено около 20 монетных дворов, и с ограничением максимального предложения более 1000, похоже, это может занять некоторое время. Я постараюсь перенести конвейер на облачный сервер.
Следующая проблема — время, необходимое для рендеринга большой очереди. К счастью, этот скрипт создает вывод за несколько секунд. Даже если оставшиеся токены будут отчеканены в следующем блоке, это будет завершено через несколько часов. Не самое ужасное место для этого. Если бы я пытался улучшить это, я бы изучил подходящую технологию организации очередей, такую как Kafka, и позволил бы ей широко масштабироваться. Сейчас в процессе нет ничего, что могло бы это ограничить.
Наконец, как вариант, я видел, как другие платформы порождали несколько проектов из одного и того же контракта, используя шаблонные идентификаторы токенов, тогда как мой пример здесь для одной коллекции. Я не думал о плюсах и минусах такого дела.
Если вы сможете продумать вышеперечисленные вопросы и собрать несколько хороших иллюстраций, у вас будет вполне подходящая платформа! Это все, что у меня есть для вас от этого проекта. Нашли ли вы какие-либо части полезными? Любые предложения о том, как сделать вещи лучше? Дайте мне знать!
Если вам понравилась эта статья, зайдите в Твиттер и посмотрите Generative Vibes
Пожалуйста, наслаждайтесь.
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.