Как создать NFT (часть 2 из 3 серии руководств по NFT)
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, так как это библиотека, используемая для упрощения создания запросов в блокчейн Ethereum. В этом руководстве мы будем использовать Alchemy Web3 (opens in a new tab), которая является усовершенствованной библиотекой Web3, предлагающей автоматические повторные попытки и надежную поддержку WebSocket.
В домашнем каталоге вашего проекта выполните:
1npm install @alch/alchemy-web3Шаг 2. Создайте файл mint-nft.js
В каталоге scripts создайте файл mint-nft.js и добавьте следующие строки кода:
1require("dotenv").config()2const API_URL = process.env.API_URL3const { createAlchemyWeb3 } = require("@alch/alchemy-web3")4const web3 = createAlchemyWeb3(API_URL)Шаг 3. Получите ABI вашего контракта
ABI (двоичный интерфейс приложения) нашего контракта — это интерфейс для взаимодействия с нашим смарт-контрактом. Подробнее об ABI контрактов можно узнать здесь (opens in a new tab). Hardhat автоматически генерирует для нас ABI и сохраняет его в файле MyNFT.json. Чтобы использовать его, нам нужно будет проанализировать содержимое, добавив следующие строки кода в наш файл mint-nft.js:
1const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")Если вы хотите увидеть ABI, вы можете вывести его в консоль:
1console.log(JSON.stringify(contract.abi))Чтобы запустить mint-nft.js и увидеть свой ABI, выведенный в консоль, перейдите в терминал и выполните команду:
1node 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) и выполните шаги для подтверждения вашей электронной почты.
После создания аккаунта:
-
Перейдите на страницу «Файлы» и нажмите синюю кнопку «Загрузить» в левом верхнем углу страницы.
-
Загрузите изображение в Pinata — это будет графический актив для вашего NFT. Не стесняйтесь называть актив так, как вам хочется.
-
После загрузки вы увидите информацию о файле в таблице на странице «Файлы». Вы также увидите столбец CID. Вы можете скопировать CID, нажав на кнопку копирования рядом с ним. Вы можете просмотреть загруженный файл по адресу:
https://gateway.pinata.cloud/ipfs/<CID>. Например, изображение, которое мы использовали, можно найти на IPFS здесь (opens in a new tab).
Для тех, кто лучше воспринимает информацию визуально, вышеуказанные шаги кратко изложены здесь:
Теперь нам нужно загрузить в Pinata еще один документ. Но прежде чем мы это сделаем, нам нужно его создать!
В корневом каталоге создайте новый файл с именем nft-metadata.json и добавьте в него следующий JSON-код:
1{2 "attributes": [3 {4 "trait_type": "Порода",5 "value": "Мальтипу"6 },7 {8 "trait_type": "Цвет глаз",9 "value": "Мокко"10 }11 ],12 "description": "Самый очаровательный и чувствительный щенок в мире.",13 "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",14 "name": "Рамзес"15}Показать всеВы можете изменять данные в JSON. Вы можете удалять или добавлять атрибуты в раздел attributes. Самое главное, убедитесь, что поле image указывает на местоположение вашего изображения в IPFS — в противном случае ваш NFT будет содержать фотографию (очень милой!) собаки.
Завершив редактирование файла JSON, сохраните его и загрузите в Pinata, выполнив те же действия, что и при загрузке изображения.
Шаг 5. Создайте экземпляр вашего контракта
Теперь, чтобы взаимодействовать с нашим контрактом, нам нужно создать его экземпляр в нашем коде. Для этого нам понадобится адрес нашего контракта, который мы можем получить из развертывания или Blockscout (opens in a new tab), найдя адрес, который вы использовали для развертывания контракта.
В приведенном выше примере адрес нашего контракта — 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.
Далее мы будем использовать метод contract (opens in a new tab) из Web3 для создания нашего контракта, используя ABI и адрес. В свой файл mint-nft.js добавьте следующее:
1const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"23const nftContract = new web3.eth.Contract(contract.abi, contractAddress)Шаг 6. Обновите файл .env
Теперь для создания и отправки транзакций в сеть Ethereum мы будем использовать адрес вашего публичного аккаунта Ethereum, чтобы получить nonce аккаунта (объясним ниже).
Добавьте свой публичный ключ в файл .env — если вы выполнили часть 1 руководства, ваш файл .env теперь должен выглядеть так:
1API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"2PRIVATE_KEY = "your-private-account-address"3PUBLIC_KEY = "your-public-account-address"Шаг 7. Создайте свою транзакцию
Сначала давайте определим функцию с именем mintNFT(tokenData) и создадим нашу транзакцию, выполнив следующие действия:
-
Возьмите PRIVATE_KEY и PUBLIC_KEY из файла
.env. -
Далее нам нужно определить nonce аккаунта. Спецификация nonce используется для отслеживания количества транзакций, отправленных с вашего адреса, что необходимо в целях безопасности и для предотвращения атак повторного воспроизведения (opens in a new tab). Чтобы получить количество транзакций, отправленных с вашего адреса, мы используем getTransactionCount (opens in a new tab).
-
Наконец, мы настроим нашу транзакцию со следующей информацией:
-
'from': PUBLIC_KEY— источник нашей транзакции — наш публичный адрес. -
'to': contractAddress— контракт, с которым мы хотим взаимодействовать и которому отправляем транзакцию. -
'nonce': nonce— nonce аккаунта с количеством транзакций, отправленных с нашего адреса. -
'gas': estimatedGas— расчетное количество газа, необходимое для завершения транзакции. -
'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()— вычисление, которое мы хотим выполнить в этой транзакции, — в данном случае это создание NFT.
Теперь ваш файл mint-nft.js должен выглядеть следующим образом:
1 require('dotenv').config();2 const API_URL = process.env.API_URL;3 const PUBLIC_KEY = process.env.PUBLIC_KEY;4 const PRIVATE_KEY = process.env.PRIVATE_KEY;56 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");7 const web3 = createAlchemyWeb3(API_URL);89 const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");10 const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";11 const nftContract = new web3.eth.Contract(contract.abi, contractAddress);1213 async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //получаем последний nonce1516 //транзакция17 const tx = {18 'from': PUBLIC_KEY,19 'to': contractAddress,20 'nonce': nonce,21 'gas': 500000,22 'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI()23 };24 }Показать всеШаг 8. Подпишите транзакцию
Теперь, когда мы создали нашу транзакцию, нам нужно подписать ее, чтобы отправить. Здесь мы будем использовать наш приватный ключ.
web3.eth.sendSignedTransaction предоставит нам хэш транзакции, который мы можем использовать, чтобы убедиться, что наша транзакция была обработана и не была отброшена сетью. Вы заметите, что в разделе подписи транзакции мы добавили проверку ошибок, чтобы знать, успешно ли прошла наша транзакция.
1require("dotenv").config()2const API_URL = process.env.API_URL3const PUBLIC_KEY = process.env.PUBLIC_KEY4const PRIVATE_KEY = process.env.PRIVATE_KEY56const { createAlchemyWeb3 } = require("@alch/alchemy-web3")7const web3 = createAlchemyWeb3(API_URL)89const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)1213async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //получаем последний nonce1516 //транзакция17 const tx = {18 from: PUBLIC_KEY,19 to: contractAddress,20 nonce: nonce,21 gas: 500000,22 data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),23 }2425 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)26 signPromise27 .then((signedTx) => {28 web3.eth.sendSignedTransaction(29 signedTx.rawTransaction,30 function (err, hash) {31 if (!err) {32 console.log(33 "Хэш вашей транзакции: ",34 hash,35 "\nПроверьте Mempool в Alchemy, чтобы просмотреть статус вашей транзакции!"36 )37 } else {38 console.log(39 "Что-то пошло не так при отправке вашей транзакции:",40 err41 )42 }43 }44 )45 })46 .catch((err) => {47 console.log(" Ошибка Promise:", err)48 })49}Показать всеШаг 9. Вызовите mintNFT и запустите node mint-nft.js
Помните файл metadata.json, который вы загрузили в Pinata? Получите его хэш-код из Pinata и передайте в качестве параметра функции mintNFT следующее: https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
Вот как получить хэш-код:
Как получить хэш-код метаданных вашего NFT на Pinata
Дважды проверьте, что скопированный вами хэш-код ссылается на ваш metadata.json, загрузив
https://gateway.pinata.cloud/ipfs/<metadata-hash-code>в отдельном окне. Страница должна выглядеть примерно так же, как на скриншоте ниже:
На вашей странице должны отображаться метаданные JSON
В итоге ваш код должен выглядеть примерно так:
1require("dotenv").config()2const API_URL = process.env.API_URL3const PUBLIC_KEY = process.env.PUBLIC_KEY4const PRIVATE_KEY = process.env.PRIVATE_KEY56const { createAlchemyWeb3 } = require("@alch/alchemy-web3")7const web3 = createAlchemyWeb3(API_URL)89const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)1213async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //получаем последний nonce1516 //транзакция17 const tx = {18 from: PUBLIC_KEY,19 to: contractAddress,20 nonce: nonce,21 gas: 500000,22 data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),23 }2425 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)26 signPromise27 .then((signedTx) => {28 web3.eth.sendSignedTransaction(29 signedTx.rawTransaction,30 function (err, hash) {31 if (!err) {32 console.log(33 "Хэш вашей транзакции: ",34 hash,35 "\nПроверьте Mempool в Alchemy, чтобы просмотреть статус вашей транзакции!"36 )37 } else {38 console.log(39 "Что-то пошло не так при отправке вашей транзакции:",40 err41 )42 }43 }44 )45 })46 .catch((err) => {47 console.log("Ошибка Promise:", err)48 })49}5051mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")Показать всеТеперь выполните node scripts/mint-nft.js, чтобы создать свой NFT. Через пару секунд вы должны увидеть в своем терминале примерно такой ответ:
1Хэш вашей транзакции: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e823Проверьте Mempool в Alchemy, чтобы просмотреть статус вашей транзакции!Затем посетите mempool в Alchemy (opens in a new tab), чтобы увидеть статус вашей транзакции (ожидает ли она, обработана или отклонена сетью). Если ваша транзакция была отклонена, также полезно проверить Blockscout (opens in a new tab) и найти хэш вашей транзакции.
Просмотр хэша транзакции вашего NFT на Etherscan
Вот и все! Вы развернули и создали NFT в блокчейне Ethereum
С помощью mint-nft.js вы можете создать столько NFT, сколько душе (и кошельку) угодно! Только не забудьте передать новый tokenURI, описывающий метаданные NFT (иначе вы просто создадите кучу одинаковых NFT с разными идентификаторами).
Предположительно, вы хотели бы иметь возможность похвастаться своим NFT в своем кошельке — так что обязательно ознакомьтесь с Частью 3: Как просмотреть свой NFT в кошельке!
Последнее обновление страницы: 23 февраля 2026 г.


