NFT (не взаимозаменяемый токен) — это увлекательная новая технология, которая представляет владение активом в цифровом виде. В этом руководстве мы рассмотрим некоторую важную справочную информацию, настроим сторонние сервисы и, наконец, закодируем и развернем наш собственный NFT в тестовой сети Ropsten.

Давайте начнем!

Исходная информация

Прежде чем создавать собственный NFT, давайте взглянем на технологии и функции, благодаря которым NFT работают.

Взаимозаменяемые против невзаимозаменяемых

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

С другой стороны, невзаимозаменяемые предметы не имеют одинаковой ценности по сравнению друг с другом. Например, точная копия Моны Лизы не равна по ценности оригинальной картине, несмотря на то, что она одинакова во всех отношениях. Не взаимозаменяемые предметы по своей сути уникальны и не могут считаться эквивалентными каким-либо другим предметам.

Предмет может быть как взаимозаменяемым, так и невзаимозаменяемым. Например, в то время как два места в эконом-классе в самолете стоят одинаково, один человек может придавать сентиментальное значение месту у окна, уменьшая ценность каждого другого места для этого человека.

Блокчейн

Блокчейн — это общедоступная база данных или цифровая книга, в которой отслеживаются транзакции. Он реплицируется в нескольких компьютерных системах, которые являются частью цепочки. Мы построим наш NFT на блокчейне Ethereum.

Чеканка токенов ERC721

Минтинг — это процесс создания чего-то впервые или, в нашем случае, публикации уникального экземпляра нашего токена ERC721 в блокчейне. ERC-721 — это стандарт для создания NFT, а токен ERC721 — это уникальное представление цифрового контента, опубликованного в блокчейне Ethereum. Никогда не бывает двух одинаковых токенов, поэтому каждый раз, когда вы создаете новый токен с одним и тем же блоком кода, будет генерироваться новый адрес.

Смарт-контракты и NFT

Смарт-контракты — это простые программы, которые развертываются в блокчейне и работают как есть, то есть они не контролируются пользователем. Мы можем использовать смарт-контракт для создания и отслеживания наших токенов.

NFT — это цифровое хранилище данных, соответствующее стандарту ERC-721 и работающее в общедоступной цепочке блоков. NFT содержат информацию или данные об активе, который они представляют, который может быть цифровым элементом, таким как твит, или физическим элементом, таким как толстовка с капюшоном.

Смарт-контракт можно считать NFT, если он реализует стандарт ERC-721, а NFT является экземпляром смарт-контракта. Каждый раз, когда мы создаем новый NFT, мы используем код смарт-контракта, который был развернут в блокчейне.

Общедоступные сети: основная сеть против тестовой сети

Ethereum использует несколько сетей. Сеть, используемая в производстве, обычно называется Mainnet, а другие, которые используются для тестирования, называются Testnet. Мы развернем созданный нами NFT в Ropsten Testnet, тестовой сети с доказательством работы для Ethereum.

Обратите внимание, что когда мы в конечном итоге развернем наш NFT либо в рабочей среде, либо в основной сети, история транзакций и балансы, которые у нас есть в тестовой сети Ropsten, не будут перенесены. Думайте о тестовой сети как о общедоступной среде подготовки/разработки, а о основной сети — как о производственной среде.

Частные сети

Сеть считается частной, если ее узлы не подключены к общедоступной цепочке блоков. Вы можете запустить блокчейн Ethereum в частной сети, например на своем локальном компьютере, или на группе компьютеров, например в сетях консорциума, которые недоступны в основной или тестовой сети.

Запуск блокчейна Ethereum на группе машин, таких как интранет, потребует проверки транзакций с помощью узла, программного обеспечения Ethereum, работающего на клиенте, который проверяет блоки и данные транзакций.

HardHat и Ganache — это два примера сред разработки блокчейна Ethereum, которые вы можете запустить на своем локальном компьютере для компиляции, тестирования, развертывания и отладки приложения смарт-контракта.

Мы запустим наше приложение в общедоступной сети, чтобы к нему мог получить доступ любой, кто подключен к сети.

Смесители

Чтобы протестировать наше приложение, нам нужно получить Ether (ETH), криптовалюту Ethereum, из крана. Сборщики, такие как Ropsten Faucet, — это веб-приложения, которые позволяют указать и отправить тестовые ETH на адрес, который затем можно использовать для совершения транзакций в тестовой сети.

Цена ETH на биржах определяется транзакциями, происходящими в основной сети в любой момент времени. Если вы решите запустить свое приложение Ethereum в частной сети, вам не нужен тестовый ETH.

Узлы и клиенты

Как упоминалось ранее, узлы проверяют блоки и данные транзакций. Вы можете создать свой собственный узел, используя такие клиенты, как Geth и OpenEthereum, и внести свой вклад в блокчейн Ethereum, проверяя транзакции и блоки в блокчейне.

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

Мы будем использовать Alchemy API для развертывания нашего приложения в блокчейне Ropsten. Alchemy была описана как AWS для блокчейнов и предоставляет инструменты для разработчиков, которые позволяют нам просматривать информацию о том, как работает наше приложение.

Создание NFT

Предпосылки

  • Node.js и нпм
  • базовые знания JavaScript

Я люблю фотографировать и делаю много снимков на свое мобильное устройство. Что может быть лучше для защиты моей работы, чем создать NFT, который я могу передать любому, кто любит мои фотографии? Затем они могут использовать данные NFT либо в тестовой сети Ropsten, либо в основной сети, чтобы доказать, что они владеют правами на исходное изображение.

Мы создадим NFT, который идентифицирует фотографию Реки Осун, которую я сделал ниже, которая, как полагают, обладает уникальными целебными свойствами.

Создать учетную запись Алхимия

Мы будем использовать Алхимию для кодирования нашего NFT, что позволит нам пропустить процесс запуска узла Ethereum на нашей локальной машине.

Перейдите на панель инструментов Alchemy, где вы увидите экран под названием «Создайте свое первое приложение». Я использовал свое имя в качестве названия команды и назвал приложение «The Osun River NFT».

Выберите Ropsten в качестве тестовой сети для приложения.

Нажмите кнопку Создать приложение, чтобы продолжить.

На следующем экране выберите бесплатный план. На следующем экране вы можете не вводить платежную информацию, нажав кнопку Пропустить сейчас, но вы можете сделать это позже. На последнем экране выберите параметр Ограниченная емкость.

Теперь вы увидите наше приложение в списке на панели инструментов.

Создайте учетную запись Ethereum

Нам нужно создать кошелек для хранения учетной записи Ethereum. Чтобы развернуть наше приложение в сети, нам нужно будет заплатить комиссию, выраженную в ETH, известную как плата за газ. При тестировании нашего приложения мы можем использовать фиктивный ETH для завершения процесса, который мы получим из сборщика позже.

Мы создадим учетную запись Ethereum, используя MetaMask, виртуальный кошелек, который доступен как расширение Chrome.

После того, как вы установили MetaMask и создали учетную запись, откройте расширение MetaMask в Chrome и выберите тестовую сеть Ropsten из списка сетей.

MetaMask автоматически сгенерирует адрес кошелька, выраженный в ETH. Просто нажмите Учетная запись 1, чтобы скопировать адрес своего кошелька.

Получение ETH из крана

Давайте отправим эфир на наш новый кошелек с помощью Ropsten Faucet. Сначала введите адрес своего кошелька, который вы можете скопировать сверху, и сайт отправит 1ETH на ваш кошелек.

Вы можете подтвердить это, проверив свой кошелек MetaMask.

Настраиваем наш токен

Давайте начнем кодировать наш токен NFT! Сначала создайте новый каталог для нашего проекта и инициализируйте npm:

mkdir the-osun-river-nft && cd the-osun-river-nft
npm init -y

Нам нужно настроить Hardhat, среду разработки для Ethereum, которая позволит нам скомпилировать наше приложение на нашем локальном компьютере и протестировать функциональность перед развертыванием в тестовой сети Ropsten.

Чтобы установить Hardhat в качестве зависимости разработки в нашем проекте, запустите:

npm install -D hardhat

Теперь инициализируйте Hardhat с помощью команды npx hardhat:

Выберите Создать пустой hardhat.config.js. Позже мы будем использовать этот файл для настройки конфигурации нашего проекта. Теперь мы создадим две новые папки в нашем проекте: в одной будет храниться код нашего смарт-контракта, а в другой — скрипты, которые развертываются и взаимодействуют с кодом смарт-контракта:

mkdir contracts && mkdir scripts

Создание смарт-контракта

Смарт-контракты — это просто приложения, которые можно запускать в блокчейне Ethereum. Они написаны на языке под названием Solidity.

Код нашего смарт-контракта будет основан на реализации ERC721 OpenZeppelin. ERC721 — это стандарт для представления права собственности на NFT, а контракты OpenZeppelin предоставляют нам некоторую гибкость в использовании ERC721.

Установите библиотеку контрактов OpenZeppelin:

npm i @openzeppelin/[email protected]

В вашем каталоге contracts создайте файл OsunRiverNFT.sol, используя приведенный ниже код. Я оставил несколько комментариев, разъясняющих каждую строку:

Чтобы наш NFT был действительным токеном ERC721, он должен соответствовать всем стандартам ERC721. import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; обеспечивает это, импортируя стандарты ERC721 в наш файл.

Подключение MetaMask к проекту

Теперь мы подключим наш кошелек MetaMask к нашему проекту. Каждая транзакция в виртуальном кошельке требует закрытого ключа, поэтому нам нужно получить наш закрытый ключ MetaMask.

В браузере Chrome откройте расширение MetaMask, нажмите на три точки в правом верхнем углу и выберите параметр Сведения об учетной записи. Затем нажмите кнопку Экспорт закрытого ключа. Введите свой пароль, чтобы увидеть свой закрытый ключ, затем скопируйте его.

Важно обеспечить безопасность нашего закрытого ключа в кодовой базе нашего проекта, чтобы предотвратить его раскрытие при использовании платформ контроля версий, таких как GitHub. Чтобы сохранить наши ключи в безопасности, мы установим пакет dotenv:

npm i dotenv

Создайте файл .env в корне вашего проекта, затем добавьте в него ранее закрытый ключ MetaMask. Вы также добавите свою алхимию API_URL, которую можно найти, перейдя на панель инструментов Alchemy, щелкнув раскрывающийся список Приложения, выбрав созданное ранее приложение, а затем выбрав Ключ просмотра кнопка:

METAMASK_PRIVATE_KEY = "yourMetamaskPrivateKey"
API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"

Настройка Ether.js

Ether.js — библиотека, упрощающая взаимодействие с блокчейном Ethereum. Мы будем использовать плагин Ether для Hardhat:

npm i -D @nomiclabs/hardhat-ethers 'ethers@^5.0.0'

Перейдите к файлу hardhat.config.js, который мы создали ранее, чтобы добавить некоторые из новых установленных нами зависимостей:

Давайте пройдемся по тому, что у нас есть в нашем файле конфигурации:

  • Пакет dotenv: позволяет нам использовать переменные среды в нашем приложении Node.js.
  • require("@nomiclabs/hardhat-ethers"): запускает удобные методы, предоставляемые Ether, в наших сценариях развертывания.
  • defaultNetwork: указывает, какую сеть должен использовать Hardhat при развертывании нашего приложения (Ropsten Testnet).
  • accounts: закрытый ключ, сгенерированный MetaMask, который позволяет нашему приложению подключаться к нашему виртуальному кошельку MetaMask для завершения транзакции.
  • url: указывает URL-адрес, на котором размещено наше приложение Node.js (серверы Alchemy).

Мы подключимся к тестовой сети Ropsten через узлы, размещенные по нашему URL-адресу. Подробнее о конфигурационных файлах в Hardhat можно прочитать здесь.

Теперь давайте запустим задачу compile, которую предоставляет Hardhat, чтобы проверить, что все работает правильно:

npx hardhat compile

Вы должны увидеть сообщение об успешном завершении, подобное приведенному ниже. Вы можете игнорировать предупреждения, которые появляются в терминале.

Создание сценария развертывания

Теперь, когда мы завершили код нашего смарт-контракта, давайте напишем необходимые сценарии для развертывания нашего смарт-контракта в блокчейне Ethereum.

В вашем каталоге scripts создайте новый файл с именем deploy.js:

Теперь мы можем запустить задачу развертывания Hardhat:

npx hardhat run scripts/deploy.js --network ropsten

Мы добавляем флаг --network ropsten, чтобы сказать Hardhat подключиться к определенной сети, в нашем случае Ropsten.

Через несколько секунд мы увидим, что наш смарт-контракт успешно развернут в тестовой сети Ropsten. Из журналов нашего терминала мы можем увидеть только что созданный адрес для нашего смарт-контракта.

Теперь давайте подтвердим, что наш смарт-контракт развернут в блокчейне. Зайдите в Ropsten Etherscan и вставьте адрес вашего контракта в строку поиска. Вы должны увидеть подробную информацию о вашем контракте в течение одной минуты.

Если вы проверите свой кошелек Ethereum на MetaMask, вы заметите, что количество ETH, которое у вас есть, было уменьшено из-за платы за газ, необходимой для обработки транзакций. Теперь мы успешно развернули наш смарт-контракт в тестовой сети Ropsten!

Создание NFT

Наш код смарт-контракта принимает два аргумента: адрес получателя и токенURI. tokenURI ссылается на данные, к которым мы хотели бы прикрепить наш токен. Чтобы использовать адрес получателя, просто передайте его в адрес кошелька пользователя, которому вы передаете токен.

Данные, хранящиеся в блокчейне, необходимо обрабатывать, проверять и тиражировать в нескольких сетях, что делает хранение данных в блокчейне очень дорогим. Загружать все изображение в блокчейн не рекомендуется, и вместо этого вы можете хранить только метаданные для NFT.

Хотя URL-адрес для NFT может храниться в блокчейне, ссылка может отключиться в любое время. Кроме того, любой, кто имеет доступ к содержимому по URL-адресу, может изменить его.

Примером может служить случай, когда NFT-художник вытащил коврик из NFT, которые он продал на OpenSea, что означает, что он изменил исходные изображения, которые он продал покупателям. Ссылка на эти изображения все еще присутствовала в блокчейне, однако исходное содержимое было полностью изменено.

Поэтому нам нужен доступный, постоянный, децентрализованный и неизменяемый способ хранения данных.

Использование IPFS

IPFS — это распределенная система для хранения и доступа к файлам, использующая адресацию контента для решения вышеуказанной проблемы. Любой части данных, загруженной в IPFS, будет присвоен уникальный идентификатор контента (CID). Как только CID сгенерирован для фрагмента данных, этот CID всегда будет представлять эти данные, и данные не могут быть изменены.

Вот пример IPFS URI:

ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi

Чтобы сгенерировать IPFS URI, вам просто нужно добавить префикс CID с ipfs://. В браузере URI IPFS имеют следующий формат:

https://ipfs.io/ipfs/{CID}

URI будет разрешен вашим пользовательским агентом (браузером) для отображения содержимого. Есть несколько браузеров, способных разрешать URI IPFS, но мы будем использовать браузер Google Chrome версии 90.

Настройка web3.js

Давайте продолжим добавлять метаданные в наш NFT. Устанавливаем пакет Alchemy Web3:

npm install @alch/alchemy-web3

Согласно документам, web3.js — это набор библиотек, который позволяет вам взаимодействовать с локальным или удаленным узлом Ethereum с помощью HTTP, IPC или WebSocket.

Alchemy использует библиотеку Web3.js, расширяя ее функциональность, предлагая автоматические повторные попытки и надежную поддержку WebSocket.

Настройка скриптов для чеканки NFT

Теперь пришло время написать сценарии для создания нашего NFT.

В папке scripts создайте файл с именем mint-nft.js. Затем добавьте следующий блок кода:

Загрузка метаданных NFT в Pinata

Pinata — это платформа для использования протокола IPFS для хранения метаданных NFT. Если вы еще этого не сделали, создайте учетную запись.

После входа в систему нажмите бирюзовую кнопку загрузить, нажмите Файл, затем выберите изображение NFT.

Как только изображение будет успешно загружено, вы увидите его на панели инструментов. Обязательно обратите внимание на буквенно-цифровые символы в приведенном выше столбце IPFS CID. Мы воспользуемся ими позже.

Теперь, когда мы загрузили наше изображение в Pinata, давайте создадим файл JSON для хранения информации о нашем NFT. Мы будем хранить URI в блокчейне при создании NFT.

В корне вашего приложения создайте файл с именем nft-metadata.json и добавьте следующую информацию. Не забудьте изменить значение изображения, чтобы использовать CID, созданный при загрузке изображения в Pinata:

Обратите внимание, что для атрибута изображения мы добавили CID IPFS из панели управления Pinata с префиксом https://ipfs.io/ipfs/. Сохраните файл, затем вернитесь к Пинате, чтобы загрузить файл.

Вы должны увидеть как изображение, так и файлы JSON на нашей панели инструментов.

Создание экземпляра нашего контракта

Чтобы создать NFT, возьмите адрес контракта, который был создан, когда наш смарт-контракт был развернут в тестовой сети Ropsten. Вы можете увидеть это в логах нашего терминала. Адрес нашего контракта: 0x9436f34035a4885650C8311cA24e3E2DeD2FF0a2.

Вернитесь в файл scripts/mint-nft.js и добавьте следующий код:

Давайте обновим наш файл .env нашим общедоступным адресом Ethereum, который является тем же адресом учетной записи, который мы скопировали ранее. Добавьте адрес в наш файл .env:

Далее нам нужно создать транзакцию.

Добавьте следующий код в наш файл mint-nft.js. Я добавил комментарии, чтобы объяснить, что мы делаем на каждом этапе:

Я создал новый кошелек MetaMask и передал адрес кошелька в tx.data выше. Вы также можете пройти в наш METAMASK_PUBLIC_KEY, если хотите. В рабочей среде адрес кошелька, переданный здесь, должен быть адресом кошелька получателя NFT.

Теперь, когда транзакция создана, нам нужно подписать транзакцию, используя наш METAMASK_PRIVATE_KEY.

Добавьте следующий блок кода в файл mint-nft.js внутри функции mintNFT:

Наконец, нам нужно скопировать хэш CID IPFS из файла nft-metadata.json **, ​​который мы ранее загрузили в Pinata, и передать его в нашу функцию mintNFT при ее вызове:

Если вы откроете ссылку выше в нашем браузере, вы должны увидеть наш файл nft-metadata.json с указанным выше CID:

Теперь мы можем запустить node scripts/mint-nft.js в нашем терминале, чтобы отчеканить наш NFT. Подождите несколько секунд, и вы должны получить ответ.

Теперь перейдем к Alchemy Mempool, который отслеживает статус всех транзакций, происходящих на нашем счете, без использования Etherscan.

Мы можем увидеть информацию о нашем новоиспеченном NFT на Etherscan, а также URL-адрес, который ссылается на наш файл nft-metadata.json в блокчейне Ethereum.

Прокрутите вниз до входных данных и нажмите кнопку декодировать входные данные. Вы должны увидеть данные, которые мы передали нашей функции createNFT в файле contracts/OsunRiverNFT.sol: адрес принимающего кошелька и URL-адрес файла JSON, который содержит метаданные нашего NFT.

Если вы выполните поиск адреса контракта, который использовался для создания NFT на Etherscan, вы увидите запись обо всех созданных NFT или, точнее, обо всех транзакциях, которые произошли с использованием этого смарт-контракта.

Добавление нашего NFT в наш кошелек MetaMask

  1. Проверьте подключение к тестовой сети Ropsten.
  2. Откройте расширение кошелька MetaMask
  3. Нажмите кнопку добавить токен.
  4. Скопируйте контрактный адрес вашего нового токена из Etherscan и вставьте его в MetaMask. MetaMask автоматически сгенерирует символ токена.
  5. Нажмите Далее, чтобы добавить токен в свой кошелек.

Вывод

Благодаря этому мы научились:

  • Создайте и разверните смарт-контракт в тестовой сети Ropsten.
  • Монетный двор NFT путем развертывания смарт-контракта в блокчейне
  • Добавьте метаданные в наш NFT, используя протокол адресации контента в IPFS через Piñata.
  • Посмотрите наш NFT в нашем кошельке MetaMask

Надеюсь, вы понимаете, почему NFT вызывают такой переполох. Это захватывающая технология, которая, вероятно, задержится на какое-то время.

В производстве шаги точно такие же, как в этом уроке. Единственное отличие состоит в том, что теперь вы будете взаимодействовать с основной сетью, а не с тестовой.

Вы можете увидеть весь код этого проекта на моем GitHub.

Добавляете ли вы новые библиотеки JS для повышения производительности или создания новых функций? А если они делают наоборот?

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

LogRocket — это решение для мониторинга внешних приложений, которое позволяет вам воспроизводить ошибки JavaScript, как если бы они произошли в вашем собственном браузере, чтобы вы могли более эффективно реагировать на ошибки.

LogRocket отлично работает с любым приложением, независимо от фреймворка, и имеет плагины для регистрации дополнительного контекста из Redux, Vuex и ngrx/store. Вместо того, чтобы гадать, почему возникают проблемы, вы можете агрегировать и сообщать о том, в каком состоянии было ваше приложение, когда возникла проблема. LogRocket также отслеживает производительность вашего приложения, сообщая такие показатели, как загрузка ЦП клиента, использование памяти клиента и многое другое.