В мире блокчейна и NFT я с незапамятных времен, но так сложилось, что я, как правило, делал достаточно сложные решения. И когда в какой-то момент возникла необходимость создания банального набора NFT токенов в рамках одной незначительной части очередного большого проекта, я подумал, что уж наверняка в эпоху, когда только ленивый не кричит про web3, есть куча решений, которые позволят мне легко и непринужденно, не изобретая велосипедов, решить мою более чем скромную задачу. Каково же было мое удивление, когда такого решения не нашлось! Одни проекты предлагали оформить подписку, другие предлагали создавать токены на базе непонятных смартконтрактов с неприлично широкими правами владельцев этих смартконтрактов. И никто не предложил полноценного решения, которое бы без непонятных лишних костов запустило бы для меня мой собственный смартконтракт, которым бы безраздельно владел я и только я, и предоставило инструментарий для загрузки и хранения контента токенов в какое-нибудь децентрализованное решение, типа IPFS. Было принято решение устранить эту несправедливость и через несколько недель появился MintMe Global, который мы с радостью дарим миру, внося свой посильный вклад в светлое web3 будущее.

Приступая к написанию этой статьи, я долго не мог решить, с какой позиции описывать наш сервис. Конечно, описание с точки того, что находится «под капотом», несомненно, интересно, но отсекает большую часть аудитории, которой было бы просто интересно использовать наше решение, как для личных нужд, так и в качестве публичной инфраструктуры в своих проектах. Но с другой стороны мы говорим про web3 решение, а значит большая часть реализации все равно находится в публичном доступе (например, смартконтракты) или же выполняется на стороне клиентского браузера, а значит тоже доступна для тех, кому это может быть интересно. Поэтому я решил подойти к описанию с пользовательской точки зрения, но по ходу повествования буду постоянно делать отсылки к технологиям и реализации, чего должно быть достаточно, чтобы либо повторить наш сервис, либо эффективно его использовать в своих программных продуктах.

Итак, для кого может быть интересна эта статья. Прежде всего для тех, кто только начинает знакомиться с NFT, кто имеет какой-то цифровой контент (изображения или видео) и желает вкусить магию его превращения в невзаимозаменяемый токен. И конечно, статья будет интересна тем, у кого есть собственный проект, не имеющий отношения к блокчейну и NFT, но есть намерение токенизировать какие-либо объекты в виде NFT – здесь я рассмотрю конкретный пример реализации такой интеграции.

Перед тем, как приступить к описанию нашего сервиса MintMe я все же дам определение того, что я называю невзаимозаменяемым токеном или NFT. NFT – это запись в распределенном реестре, которая принадлежит конкретному пользователю (записана на адрес пользователя в блокчейне). Запись эта обладает таким свойством, что прочитать ее может любой желающий (как, собственно, и все, что записано в блокчейн), а изменить или передать другому пользователю – только владелец. NFT может быть самой этой записью – так бывает редко, а может содержать ссылку на какой-то внешний объект, например, файл изображения, видео, музыки, просто текст или все что угодно. В принципе, нет каких-либо стандартов, которые бы определяли порядок хранения этого внешнего объекта, поэтому, зачастую, они лежат на каком-либо выделенном сервере или виртуальной машине, на корню ломая идею децентрализации, ведь стоит выключить этот самый сервер, как владелец NFT останется владельцем записи в блокчейне, которая уже не связана ни с каким реальным файлом. Или стоит владельцу сервера заменить этот файл, сохранив ссылку, по которой он был доступен, владелец токена картины Мона Лизы превратится во владельца ничего не стоящей фотографии котенка. Чтобы этого избежать, лучше работать в парадигме web3, используя в качестве платформы для хранения децентрализованные решения, например, IPFS. Что мы, собственно, и делаем в своих решениях.

Для начала работы с сервисом MintMe Global достаточно просто перейти к сайту проекта. Без лишних дополнительных движений перед нашим взором предстает Showroom проекта, где видны все коллекции, созданные другими участниками, конечно, при условии, что они не отключили их публичную видимость. Хочется сразу сказать, что у проекта MintMe Global отсутствует бекенд, т.е. это, действительно, web3 решение. Для ускорения работы мы подняли собственный узел IPFS для хранения контента NFT токенов, но даже если мы в какой-то момент выключим его, то вся система продолжит работать, т.к. IPFS является распределенной файловой системой, контент реплицирован на другие узлы, ну а записи о NFT со ссылками на IPFS надежно сохранены в блокчейне.

ShowRoom с каталогом уже созданных другими пользователями коллекций
ShowRoom с каталогом уже созданных другими пользователями коллекций

В проекте MintMe Global нас прежде всего интересовал блокчейн Polygon, т.к. большой проект, в котором нам нужна была такая токенизация, работает как раз на Polygon. Но мы решили сразу сделать более универсальный инструмент, обеспечив прямо на старте возможность работы еще и с Ethereum и Binance Smart Chain. Вероятно, этот список будет продолжен в дальнейшем. Все эти блокчейны являются EVM-based, т.е. работают на базе одной и той же виртуальной машины Ethereum, поэтому нам не составило труда загрузить одни и те же смартконтракты в каждый из них. Какой блокчейн будете использовать вы, зависит от ваших личных предпочтений и целей, однако следует учитывать стоимость транзакций в каждом из них. Очень показательно выглядит сравнение по цене загрузки наших смартконтрактов. Например, для загрузки основного смартконтракта MintMeFactory в сеть Polygon мы потратили несколько десятков центов, а вот загрузка в сеть Ethereum обошлась почти в 500$ - вот такая вот неэкономная экономика).

Для того, чтобы показывать коллекции и токены на веб странице MintMe, нам потребовалось построить индексатор блокчейна, который отслеживает все транзакции по всем смартконтрактам всех наших пользователей. Тут можно вскрикнуть – ага, а говорили, что нет никакого бекенда, а вот же он – индексатор! Поспешу возразить – все сделано в рамках лучших практик web3 – для индексации использован замечательный сервис TheGraph, а нами были реализованы субграфы, которые неустанно обрабатывают каждый новый блок, чтобы мы быстро могли отобразить нашим пользователям все изменения в коллекциях и токенах. Поработать с нашим субграфом можно и напрямую, как говорится, без посредников. Это субграф для контрактов сети Polygon. Если интересуют другие сети, соответствующие им субграфы можно легко найти в поиске.

Поиск субграфа сервиса MintMe Global
Поиск субграфа сервиса MintMe Global

Хватит технических деталей – вернемся на пользовательский уровень работы MintMe Global. Чтобы перестать быть простым наблюдателям и попробовать функционал проекта, необходимо установить и настроить браузерный кошелек Metamask. Я не буду расписывать, как это сделать – на просторах интернета огромное количество понятных инструкций, включая и наш ресурс - https://mintme.global/instructions/how-to-start-with-mintme. После установки Metamask необходимо подключить его к блокчейну, в котором собираетесь создавать токены – Ethereum, Polygon (Matic) или Binance Smart Chain. Для осуществления транзакций необходимо обзавестись каким-то количеством монет данного блокчейна для оплаты газа. После того, как Metamask установлен, настроен и на нем имеется какое-то минимальное количество монет, нужно осуществить привязку сайта MintMe, для чего кликнуть на соответствующее уведомление в нижнем левом углу страницы и подтвердить действие в Metamask. Если все сделано правильно, то в верхнем правом углу страницы вы увидите название блокчейна, к которому осуществлено подключение, текущий баланс и адрес. Если все верно, то самое время создать свою первую коллекцию.

Для создания коллекции необходимо перейти в раздел «My Assets», где будет доступна кнопка «Create Collection». После заполнения формы с информацией о коллекции и нажатия на кнопку «Create» будет сформирована транзакция, а Metamask предложит ее подписать. После подтверждения транзакции и ее фиксации в блокчейне, созданная коллекция появится в списке ваших коллекций, а также в общем списке коллекций в Showroom. Что же происходит при создании коллекции? А собственно, все просто  - осуществляется вызов функции createCollection() основного смартконтракта MintMeFactory, который внутри нее осуществляет деплой нового отдельного контракта, которым владеете вы и только вы. Далее с этим контрактом вы можете работать совершенно независимо от MintMe, обращаться к нему через свой собственный интерфейс, интерфейс браузера транзакций, типа polygonscan или etherscan, а может и со стороны другого смартконтракта. Вот она, настоящая свобода, которую несет в себе настоящий web3! Тут следует отметить, что за создание коллекции, как и за создание токенов внутри этой коллекции, мы берем небольшую комиссию. В блокчейне Polygon эта комиссия составляет 0.1 MATIC, что по ценам на начало апреля 2022 года составляет всего, то 0.015 $, т.е. комиссия поистине символическая.

Тут могли бы быть наши коллекции, но их пока нет)
Тут могли бы быть наши коллекции, но их пока нет)
Заполнение формы с информацией о новой коллекции
Заполнение формы с информацией о новой коллекции
А вот и созданная коллекция появилась в списке My Assets
А вот и созданная коллекция появилась в списке My Assets
Нашу новую коллекцию видим не только мы - она доступна в шоуруме всем желающим
Нашу новую коллекцию видим не только мы - она доступна в шоуруме всем желающим

Настало время создать первый токен в нашей новой коллекции! Для этого снова переходим в раздел «My Assets», выбираем коллекцию и нажимаем кнопку «Create NFT». Далее выполняем уже знакомую по созданию коллекции последовательность действий – заполняем форму, подписываем транзакцию и через несколько секунд видим наш первый токен новой коллекции! Бинго!

Внутри новой коллекции пока нет никаких токенов - надо это исправить!
Внутри новой коллекции пока нет никаких токенов - надо это исправить!
Заполняем информацию об объекте, который мы хотим токенизировать
Заполняем информацию об объекте, который мы хотим токенизировать
Мы стали счастливыми обладателями только что испеченных NFT!
Мы стали счастливыми обладателями только что испеченных NFT!

Здесь позволю себе еще разок вернуться к техническим деталям, а то продвинутой части аудитории, вероятно, стало скучно. Скажу несколько слов про смартконтракт коллекции и его взаимодействие с основным смартконтрактом проекта MintMeFactory. Смартконтракт коллекции называется MintMe, построен на базе замечательного фреймворка OpenZeppellin и представляет собой стандартный ERC721 контракт. Это делает выпускаемые им токены полностью совместимыми с любыми NFT площадками и маркетплейсами, главное, чтобы они поддерживали выбранный вами для создания коллекции блокчейн. Может возникнуть вопрос, как мы индексируем потенциально неограниченное количество смартконтрактов пользователей, чтобы отслеживать все движения токенов. А тут все просто! Все контракты коллекций порождаются фабрикой MintMeFactory, которая всем им сообщает о себе при конструировании, а они уже уведомляют один единственный контракт фабрики при обработке каждой транзакции непосредственно в адрес контракта каждой коллекции. Таким образом, нам достаточно индексировать один единственный смартконтракт фабрики, чтобы знать обо всем происходящем в экосистеме MintMe Global – такой вот красивый лайфхак! Адреса наших смартконтрактов во всех поддерживаемых нами блокчейнах доступны по ссылке, все контракты верифицированы и можно ознакомиться с их исходными кодами.

Вернемся к вопросу совместимости только что созданного токена – это ведь важно, чтобы создаваемые нами токены не оказывались запертой в рамках никому неизвестной площадки MintMe. А они и не заперты там! Давайте глянем, например, на opensea.io (эта площадка поддерживает блокчейны Polygon и Ethereum). Регистрируемся на OpenSea от имени аккаунта, адресу которого принадлежит коллекция, переходим в раздел «My Collections» и видим там нашу созданную коллекцию, содержащую один единственный токен! Если вдруг не видим, то нажимаем «Import an existing smartcontract», указываем блокчейн и ее адрес и вуа-ля! Для коллекций, которыми мы владеем, OpenSea позволяет настроить обложки и много других параметров – не пренебрегаем этим ведь встречают по одежке! Ну и разумеется, тут же на OpenSea мы можем выставить токен на продажу, т.е. воспользоваться механикой этого маркетплейса.

Без дополнительных движений новая коллекция доступна в моем аккаунте на OpenSea
Без дополнительных движений новая коллекция доступна в моем аккаунте на OpenSea
Внутри этой коллекции ничего неожиданного - всего-лишь созданные нами на MintMe токены)
Внутри этой коллекции ничего неожиданного - всего-лишь созданные нами на MintMe токены)

Может возникнуть резонный вопрос, а в чем, собственно отличие того, что мы сделали от создания токена сразу на OpenSea? А отличие кардинальное. Созданная нами на MintMe коллекция и принадлежащие ей токены находятся в полном вашем владении, и никто не может ничего с ней сделать, кроме вас самих! Да, если она содержит какой-то незаконный контент, то мы можем исключить ее из выдачи сайта MintMe, также как и OpenSea, но уничтожить ее нельзя – она всегда будет доступна на других площадках или при прямом доступе к блокчейну и IPFS. Совершенно иная ситуация с коллекцией, созданной непосредственно на OpenSea – она находится под контролем OpenSea, т.е. по сути, вам не принадлежит.

Ну что же, если вы дочитали до этого места, то уже знаете, что MintMe Global - это удобный инструмент, который позволяет без лишних телодвижений и затрат заиметь собственный смартконтракт, создать на его основе набор NFT токенов, разместить контент токенов в IPFS - и все это через удобный веб-интерфейс! Но все это, скорее побочный продукт, хоть и очень качественный продукт. Помните, выше я упоминал, что мы создавали этот продукт, как строительный кирпичик, который можно встраивать в любые более крупные системы, где требуется решение задачи токенизации чего угодно? Такую интеграцию я проиллюстрирую конкретным примером проекта, сделанного совершенно другой командой (и это особенно приятно!) - это проект MAIND. Базовая идея проекта MAIND состоит в том, что любой посетитель их сайта может задать некий краткий вопрос "искусственному интеллекту" и получить от него ответ в виде прикольного четверостишия, оформленного в виде карточки.

Главная страница проекта MAIND, где можно задать свой вопрос "искусственному интеллекту"
Главная страница проекта MAIND, где можно задать свой вопрос "искусственному интеллекту"
А тут мы получаем ответ на свой вопрос в виде четверостишия)
А тут мы получаем ответ на свой вопрос в виде четверостишия)

Так вот, собственно, эта карточка с четверостишием и стала желаемым объектом для токенизации команды проекта MAIND. Стоит отметить, что ребята достаточно далеки от блокчейна и разбираться с ним не входило в их ближайшие планы - собственно и не пришлось, т.к. на помощь им пришел наш проект MintMe Global.

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

  1. Прежде всего, они зашли на MintMe Global и создали свою коллекцию там через веб-интерфейс.

  2. Затем они настроили красивый внешний вид своей коллекции на OpenSea.

  3. Дальше немного технической "магии", которую мы помогли им сделать) Стандартный смартконтракт NFT токена MintMe позволяет создавать новые токены только владельцу коллекции, а по задумке MAIND токенизировать созданные карточки должен сам пользователь, ну и конечно ,сам оплачивать все комиссии. Кроме того, именно вокруг этой токенизации команда MAIND решила выстроить монетизацию своего проекта. Так на свет появился смартконтракт PublicMint, которому было передано владение коллекцией MAIND. Теперь любой пользователь MAIND, желающий токенизировать прикольный ответ "искусственного интеллекта", через Metamask отправляет запрос mint() на смартконтракт PublicMint, который уже транслирует его коллекции MAIND.

Так выглядит коллекция MAIND на сайте MintMe
Так выглядит коллекция MAIND на сайте MintMe

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

Комментарии (9)


  1. k-morozov
    28.04.2022 19:58

    В мире блокчейна и NFT я с незапамятных времен

    Учитывая что nft очень молодая технология, то "незапамятных времен" это сколько? 3 года? 5? 10?


    1. isvirin Автор
      28.04.2022 20:55

      Блокчейн тоже молодая технология - разлива 2008 года. Рад, что хоть что-то в статье нашло у Вас отклик )


  1. makar_crypt
    28.04.2022 21:04

    1) ничем не понял чем отличается от 1000 подобных сервисов выходящих каждый день

    2) Если у вас нету бэкенда , где крутится сайт? или в веб3 это уже не бэк ?

    3) Если у вас нету бэкенда , но вы используете индексатор графа , куда вы складываете данные от блоков?

    4) почему вы используете граф а не link? в чем разница ?


    1. isvirin Автор
      28.04.2022 21:18

      1) ничем не понял чем отличается от 1000 подобных сервисов выходящих каждый день

      Я не исключаю, что программируем мы лучше, чем ищем в интернете ) Приведите примеры, с удовольствием на них посмотрю и скажу, чем отличаются, если чем-то отличаются.

      2) Если у вас нету бэкенда , где крутится сайт? или в веб3 это уже не бэк ?

      Сайт - это всего лишь морда. Кто угодно может свой сайт сделать для проекта. На сайте нет базы данных, от которой хоть что-то зависит. Вся чувствительная информация лежит в блокчейне и IPFS. Наглядно это демонстрирует проект MAIND в конце статьи. Если я вдруг выключу все, что у меня относится к этому проекту и вдруг не будет никакого сайта и ничего-ничего, то MAIND даже не заметит, что я это сделал, т.к. они работают со смартконтрактом, субграфом и IPFS.

      3) Если у вас нету бэкенда , но вы используете индексатор графа , куда вы складываете данные от блоков?

      Вы же в курсе, что стек web3 давно выходит далеко за рамки блокчейна?) Так вот в этом стеке есть замечательная технология The Graph - децентрализованный инструмент для индексации блокчейна. По сути, блокчейн является базой данной, но с более чем ущербным языком запросов. The Graph решает эту проблему, создавая децентрализованный слой для индексации и хранения проиндексированных данных с удобным доступом через GraphQL запросы.

      4) почему вы используете граф а не link? в чем разница ?

      Простите, не понял вопрос. Может быть ответ в моем ответе на вопрос выше?)


      1. jonezq
        29.04.2022 13:09

        Foundation, opensea, solsea

        Сколько лет опыта нужно в крипте чтоб форкнуть открытую репу и создать свой nft маркетплейс / defi проект итд?


        1. isvirin Автор
          29.04.2022 14:11

          Foundation, opensea, solsea

          Вы правда считаете, что это открытые проекты? ) Или, что это даже web3 проекты? )

          Тогда покажите, мне, например, субграф проекта OpenSea - я правда буду очень признателен ) Или Вы не знаете, что такое субграф?


          1. jonezq
            29.04.2022 15:05

            это был пример раскрученных маркетплейсов, кому интересен россграм когда есть условный инстаграм/тикток
            я уверен есть с десяток нонейм проектов с паблик репами, если даже такие титаны как юнисвап дают доступ к коду и даже к сУбграфу, или Вы не знаете, что такое юнисвап?)

            Да мне-то куда до сУбграфа, я так - мимо проходил)


            1. isvirin Автор
              29.04.2022 15:20

              Это не совсем правильное сравнение с "раскрученными маркетплейсами". MintMe - это как минимум не маркетплейс, а как максимум, созданные на MintMe токены, вы можете продавать на той же OpenSea и где угодно. Просто, создавая токен на той же OpenSea, вы создаете токен на их смартконтракте и если OpenSea (или регулятору) что-то не понравится, то от вашей коллекции не останется даже следа. В случае с MintMe вы получаете свой собственный никем не управляемый (даже MintMe) смартконтракт, как-будто вы его сели и сами написали на solidity, а потом задеплоили - это сделать может далеко не каждый, в отличие от нажатия на несколько кнопочек в интерфейсе MintMe. После этого вы можете даже не возвращаться на MintMe, и вообще забыть это название, а продавать свои токены на той же OpenSea и любом другом "раскрученном маркетплейсе". Так что у нас и мысли не было делать россграм ) Ну и касательно ноунейм проектом - разумеется, если их поискать, то конечно же можно найти, даже в исходниках, и даже развернуть, но если мы можем сделать это, то мы и можем решить задачу создание своего смартконтракта для ERC721 (OpenZeppelin нам в помощь). Еще раз, мы просто создали удобный инструкмент для всех желающих, чтобы получить свой собственный смартконтракт, никем не контролируемый и никем не управляемый, кроме вас, как его владельца. Я искренне не понимаю упреков на наш адрес)) Это примерно, как упрекать OpenZeppulin, что они разработали и выложили типовые шаблоны смартокнтрактов, говоря им, что они тем самым считают людей дебилами, которые сами не могут эти простенькие смартконтракты написать руками, руководствуясь более чем доступным описанием языка solidity )

              p.s. Субграфы юнисвап - прекрасный пример того, как надо писать субграфы ) Мы их любим и уважаем )


              1. jonezq
                29.04.2022 16:10
                +1

                ок ясно, изначально неправильно понял цель проекта - чукча не читатель)