В мире блокчейна и 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 надежно сохранены в блокчейне. В проекте MintMe Global нас прежде всего интересовал блокчейн Polygon, т.к. большой проект, в котором нам нужна была такая токенизация, работает как раз на Polygon. Но мы решили сразу сделать более универсальный инструмент, обеспечив прямо на старте возможность работы еще и с Ethereum и Binance Smart Chain. Вероятно, этот список будет продолжен в дальнейшем. Все эти блокчейны являются EVM-based, т.е. работают на базе одной и той же виртуальной машины Ethereum, поэтому нам не составило труда загрузить одни и те же смартконтракты в каждый из них. Какой блокчейн будете использовать вы, зависит от ваших личных предпочтений и целей, однако следует учитывать стоимость транзакций в каждом из них. Очень показательно выглядит сравнение по цене загрузки наших смартконтрактов. Например, для загрузки основного смартконтракта MintMeFactory в сеть Polygon мы потратили несколько десятков центов, а вот загрузка в сеть Ethereum обошлась почти в 500$ - вот такая вот неэкономная экономика). Для того, чтобы показывать коллекции и токены на веб странице MintMe, нам потребовалось построить индексатор блокчейна, который отслеживает все транзакции по всем смартконтрактам всех наших пользователей. Тут можно вскрикнуть – ага, а говорили, что нет никакого бекенда, а вот же он – индексатор! Поспешу возразить – все сделано в рамках лучших практик web3 – для индексации использован замечательный сервис TheGraph, а нами были реализованы субграфы, которые неустанно обрабатывают каждый новый блок, чтобы мы быстро могли отобразить нашим пользователям все изменения в коллекциях и токенах. Поработать с нашим субграфом можно и напрямую, как говорится, без посредников. Это субграф для контрактов сети Polygon. Если интересуют другие сети, соответствующие им субграфы можно легко найти в поиске. Хватит технических деталей – вернемся на пользовательский уровень работы 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», выбираем коллекцию и нажимаем кнопку «Create NFT». Далее выполняем уже знакомую по созданию коллекции последовательность действий – заполняем форму, подписываем транзакцию и через несколько секунд видим наш первый токен новой коллекции! Бинго! Здесь позволю себе еще разок вернуться к техническим деталям, а то продвинутой части аудитории, вероятно, стало скучно. Скажу несколько слов про смартконтракт коллекции и его взаимодействие с основным смартконтрактом проекта MintMeFactory. Смартконтракт коллекции называется MintMe, построен на базе замечательного фреймворка OpenZeppellin и представляет собой стандартный ERC721 контракт. Это делает выпускаемые им токены полностью совместимыми с любыми NFT площадками и маркетплейсами, главное, чтобы они поддерживали выбранный вами для создания коллекции блокчейн. Может возникнуть вопрос, как мы индексируем потенциально неограниченное количество смартконтрактов пользователей, чтобы отслеживать все движения токенов. А тут все просто! Все контракты коллекций порождаются фабрикой MintMeFactory, которая всем им сообщает о себе при конструировании, а они уже уведомляют один единственный контракт фабрики при обработке каждой транзакции непосредственно в адрес контракта каждой коллекции. Таким образом, нам достаточно индексировать один единственный смартконтракт фабрики, чтобы знать обо всем происходящем в экосистеме MintMe Global – такой вот красивый лайфхак! Адреса наших смартконтрактов во всех поддерживаемых нами блокчейнах доступны по ссылке, все контракты верифицированы и можно ознакомиться с их исходными кодами. Вернемся к вопросу совместимости только что созданного токена – это ведь важно, чтобы создаваемые нами токены не оказывались запертой в рамках никому неизвестной площадки MintMe. А они и не заперты там! Давайте глянем, например, на opensea.io (эта площадка поддерживает блокчейны Polygon и Ethereum). Регистрируемся на OpenSea от имени аккаунта, адресу которого принадлежит коллекция, переходим в раздел «My Collections» и видим там нашу созданную коллекцию, содержащую один единственный токен! Если вдруг не видим, то нажимаем «Import an existing smartcontract», указываем блокчейн и ее адрес и вуа-ля! Для коллекций, которыми мы владеем, OpenSea позволяет настроить обложки и много других параметров – не пренебрегаем этим ведь встречают по одежке! Ну и разумеется, тут же на OpenSea мы можем выставить токен на продажу, т.е. воспользоваться механикой этого маркетплейса. Может возникнуть резонный вопрос, а в чем, собственно отличие того, что мы сделали от создания токена сразу на OpenSea? А отличие кардинальное. Созданная нами на MintMe коллекция и принадлежащие ей токены находятся в полном вашем владении, и никто не может ничего с ней сделать, кроме вас самих! Да, если она содержит какой-то незаконный контент, то мы можем исключить ее из выдачи сайта MintMe, также как и OpenSea, но уничтожить ее нельзя – она всегда будет доступна на других площадках или при прямом доступе к блокчейну и IPFS. Совершенно иная ситуация с коллекцией, созданной непосредственно на OpenSea – она находится под контролем OpenSea, т.е. по сути, вам не принадлежит. Ну что же, если вы дочитали до этого места, то уже знаете, что MintMe Global - это удобный инструмент, который позволяет без лишних телодвижений и затрат заиметь собственный смартконтракт, создать на его основе набор NFT токенов, разместить контент токенов в IPFS - и все это через удобный веб-интерфейс! Но все это, скорее побочный продукт, хоть и очень качественный продукт. Помните, выше я упоминал, что мы создавали этот продукт, как строительный кирпичик, который можно встраивать в любые более крупные системы, где требуется решение задачи токенизации чего угодно? Такую интеграцию я проиллюстрирую конкретным примером проекта, сделанного совершенно другой командой (и это особенно приятно!) - это проект MAIND. Базовая идея проекта MAIND состоит в том, что любой посетитель их сайта может задать некий краткий вопрос "искусственному интеллекту" и получить от него ответ в виде прикольного четверостишия, оформленного в виде карточки. Так вот, собственно, эта карточка с четверостишием и стала желаемым объектом для токенизации команды проекта MAIND. Стоит отметить, что ребята достаточно далеки от блокчейна и разбираться с ним не входило в их ближайшие планы - собственно и не пришлось, т.к. на помощь им пришел наш проект MintMe Global. В данной статье я лишь общими мазками затрону последовательность шагов, которые прошли ребята из MAIND, чтобы выполнить эту интеграцию: Прежде всего, они зашли на MintMe Global и создали свою коллекцию там через веб-интерфейс. Затем они настроили красивый внешний вид своей коллекции на OpenSea. Дальше немного технической "магии", которую мы помогли им сделать) Стандартный смартконтракт NFT токена MintMe позволяет создавать новые токены только владельцу коллекции, а по задумке MAIND токенизировать созданные карточки должен сам пользователь, ну и конечно ,сам оплачивать все комиссии. Кроме того, именно вокруг этой токенизации команда MAIND решила выстроить монетизацию своего проекта. Так на свет появился смартконтракт PublicMint, которому было передано владение коллекцией MAIND. Теперь любой пользователь MAIND, желающий токенизировать прикольный ответ "искусственного интеллекта", через Metamask отправляет запрос mint() на смартконтракт PublicMint, который уже транслирует его коллекции MAIND. В скором времени мы разместим на сайте проекта подробную техническую инструкцию об интеграции MintMe в любое внешнее решение, а может быть я напишу отдельный пост здесь. Уверен, наше решение вам понравится, мы искренне старались сделать качественный и полезный продукт, максимально соответствующей философии и парадигме web3! UPD: Инструкция по интеграции сервиса MintMe в ваш проект для создания собственных NFT для ваших пользователей UPD2: Видеоинструкция по работе с сервисом MintMe