Перейти к основному контенту

Как чеканить NFT (Часть 2/3 серии руководств по NFT)

ERC-721
alchemy
solidity
смарт-контракты
Для начинающих
Суми Мудгил
22 апреля 2021 г.
8 минут на чтение

Beeple (opens in a new tab): $69 млн 3LAU (opens in a new tab): $11 млн Grimes (opens in a new tab): $6 млн

Все они чеканили свои NFT, используя мощный API Alchemy. В этом руководстве мы научим вас делать то же самое менее чем за 10 минут.

«Чеканка NFT» — это процесс публикации уникального экземпляра вашего токена ERC-721 в блокчейне. Используя наш смарт-контракт из Части 1 этой серии руководств по NFT, давайте применим наши навыки работы с Web3 и отчеканим NFT. В конце этого руководства вы сможете чеканить столько NFT, сколько пожелает ваша душа (и кошелек)!

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

Шаг 1: Установите Web3

Если вы следовали первому руководству по созданию смарт-контракта NFT, у вас уже есть опыт использования Ethers.js. Web3 похож на Ethers, так как это библиотека, используемая для упрощения создания запросов к блокчейну Эфириума. В этом руководстве мы будем использовать Alchemy Web3 (opens in a new tab) — расширенную библиотеку Web3, которая предлагает автоматические повторные попытки и надежную поддержку WebSocket.

В домашнем каталоге вашего проекта выполните:

npm install @alch/alchemy-web3

Шаг 2: Создайте файл mint-nft.js

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

require("dotenv").config()
const API_URL = process.env.API_URL
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)

Шаг 3: Получите ABI вашего контракта

ABI (Application Binary Interface) нашего контракта — это интерфейс для взаимодействия с нашим смарт-контрактом. Вы можете узнать больше об . Hardhat автоматически генерирует ABI для нас и сохраняет его в файле MyNFT.json. Чтобы использовать его, нам нужно будет извлечь содержимое, добавив следующие строки кода в наш файл mint-nft.js:

const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")

Если вы хотите увидеть ABI, вы можете вывести его в консоль:

console.log(JSON.stringify(contract.abi))

Чтобы запустить mint-nft.js и увидеть ваш ABI, выведенный в консоль, перейдите в терминал и выполните:

node scripts/mint-nft.js

Шаг 4: Настройте метаданные для вашего NFT с помощью IPFS

Если вы помните из нашего руководства в Части 1, функция нашего смарт-контракта mintNFT принимает параметр tokenURI, который должен указывать на JSON-документ, описывающий метаданные NFT — это именно то, что оживляет NFT, позволяя ему иметь настраиваемые свойства, такие как имя, описание, изображение и другие атрибуты.

Interplanetary File System (IPFS) — это децентрализованный протокол и одноранговая сеть для хранения и обмена данными в распределенной файловой системе.

Мы будем использовать Pinata, удобный API и набор инструментов IPFS, для хранения нашего актива NFT и метаданных, чтобы гарантировать, что наш NFT действительно децентрализованный. Если у вас нет аккаунта Pinata, зарегистрируйте бесплатный аккаунт здесь (opens in a new tab) и выполните шаги для подтверждения вашей электронной почты.

После создания аккаунта:

  • Перейдите на страницу «Files» (Файлы) и нажмите синюю кнопку «Upload» (Загрузить) в левом верхнем углу страницы.

  • Загрузите изображение в Pinata — это будет файл изображения для вашего NFT. Можете назвать актив как угодно.

  • После загрузки вы увидите информацию о файле в таблице на странице «Files». Вы также увидите столбец CID. Вы можете скопировать CID, нажав кнопку копирования рядом с ним. Вы можете просмотреть загруженный файл по адресу: https://gateway.pinata.cloud/ipfs/<CID>. Например, вы можете найти изображение, которое мы использовали в IPFS, здесь (opens in a new tab).

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

How to upload your image to Pinata

Теперь мы хотим загрузить еще один документ в Pinata. Но прежде чем мы это сделаем, нам нужно его создать!

В корневом каталоге создайте новый файл с именем nft-metadata.json и добавьте следующий JSON-код:

Не стесняйтесь изменять данные в JSON. Вы можете удалять или добавлять элементы в раздел атрибутов. Самое главное, убедитесь, что поле image указывает на расположение вашего изображения в IPFS — иначе ваш NFT будет включать фотографию (очень милой!) собаки.

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

How to upload your nft-metadata.json to Pinata

Шаг 5: Создайте экземпляр вашего контракта

Теперь, чтобы взаимодействовать с нашим контрактом, нам нужно создать его экземпляр в нашем коде. Для этого нам понадобится адрес нашего контракта, который мы можем получить из развертывания или в Blockscout (opens in a new tab), найдя адрес, который вы использовали для развертывания контракта.

View your contract address on Etherscan

В приведенном выше примере адрес нашего контракта — 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.

Далее мы будем использовать метод contract (opens in a new tab) Web3 для создания нашего контракта с использованием ABI и адреса. В ваш файл mint-nft.js добавьте следующее:

const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"

const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

Шаг 6: Обновите файл .env

Теперь, чтобы создавать и отправлять транзакции в цепь Эфириума, мы будем использовать адрес вашего открытого аккаунта Эфириума для получения нонса аккаунта (объясним ниже).

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

API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-private-account-address"
PUBLIC_KEY = "your-public-account-address"

Шаг 7: Создайте вашу транзакцию

Сначала давайте определим функцию с именем mintNFT(tokenData) и создадим нашу транзакцию, выполнив следующее:

  1. Получите ваши PRIVATE_KEY и PUBLIC_KEY из файла .env.

  2. Далее нам нужно будет определить нонс аккаунта. Спецификация нонса используется для отслеживания количества транзакций, отправленных с вашего адреса, что необходимо нам в целях безопасности и для предотвращения атак повторного воспроизведения. Чтобы получить количество транзакций, отправленных с вашего адреса, мы используем getTransactionCount (opens in a new tab).

  3. Наконец, мы настроим нашу транзакцию со следующей информацией:

  • 'from': PUBLIC_KEY — источник нашей транзакции, наш открытый адрес

  • 'to': contractAddress — контракт, с которым мы хотим взаимодействовать и которому отправляем транзакцию

  • 'nonce': nonce — нонс аккаунта с количеством транзакций, отправленных с нашего адреса

  • 'gas': estimatedGas — расчетный газ, необходимый для завершения транзакции

  • 'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI() — вычисление, которое мы хотим выполнить в этой транзакции — в данном случае это чеканка NFT

Ваш файл mint-nft.js теперь должен выглядеть так:

Шаг 8: Подпишите транзакцию

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

web3.eth.sendSignedTransaction даст нам хеш транзакции, который мы можем использовать, чтобы убедиться, что наша транзакция была добыта и не была отброшена сетью. Вы заметите, что в разделе подписания транзакции мы добавили проверку ошибок, чтобы знать, успешно ли прошла наша транзакция.

Шаг 9: Вызовите mintNFT и запустите node mint-nft.js

Помните metadata.json, который вы загрузили в Pinata? Получите его хеш-код из Pinata и передайте следующее в качестве параметра функции mintNFT https://gateway.pinata.cloud/ipfs/<metadata-hash-code>

Вот как получить хеш-код:

How to get your nft metadata hashcode on PinataКак получить хеш-код метаданных вашего NFT в Pinata

Дважды проверьте, что скопированный вами хеш-код ссылается на ваш metadata.json, загрузив https://gateway.pinata.cloud/ipfs/<metadata-hash-code> в отдельном окне. Страница должна выглядеть примерно так, как на скриншоте ниже:

Your page should display the json metadataВаша страница должна отображать метаданные в формате JSON

В целом ваш код должен выглядеть примерно так:

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

The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8

Check Alchemy's Mempool to view the status of your transaction!

Затем посетите ваш мемпул Alchemy (opens in a new tab), чтобы увидеть статус вашей транзакции (находится ли она в ожидании, добыта или отброшена сетью). Если ваша транзакция была отброшена, также полезно проверить Blockscout (opens in a new tab) и выполнить поиск по хешу транзакции.

View your NFT transaction hash on EtherscanПросмотр хеша транзакции вашего NFT в Etherscan

И это все! Теперь вы развернули И отчеканили NFT в блокчейне Эфириума

Используя mint-nft.js, вы можете чеканить столько NFT, сколько пожелает ваша душа (и кошелек)! Просто убедитесь, что передаете новый tokenURI, описывающий метаданные NFT (иначе вы просто создадите кучу одинаковых NFT с разными ID).

Предположительно, вы хотели бы иметь возможность похвастаться своим NFT в кошельке — поэтому обязательно ознакомьтесь с Частью 3: Как просмотреть ваш NFT в кошельке!