Перейти к основному содержанию

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

ERC-721
Alchemy
Solidity
Умные контракты
Beginner
Sumi Mudgil
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, так как это библиотека, используемая для упрощения создания запросов в блокчейн 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_URL
3const { 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

Теперь нам нужно загрузить в 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, выполнив те же действия, что и при загрузке изображения.

Как загрузить ваш nft-metadata.json в Pinata

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

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

Просмотр адреса вашего контракта в Etherscan

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

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

1const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
2
3const 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) и создадим нашу транзакцию, выполнив следующие действия:

  1. Возьмите PRIVATE_KEY и PUBLIC_KEY из файла .env.

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

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

  • '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;
5
6 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
7 const web3 = createAlchemyWeb3(API_URL);
8
9 const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");
10 const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";
11 const nftContract = new web3.eth.Contract(contract.abi, contractAddress);
12
13 async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //получаем последний nonce
15
16 //транзакция
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_URL
3const PUBLIC_KEY = process.env.PUBLIC_KEY
4const PRIVATE_KEY = process.env.PRIVATE_KEY
5
6const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
7const web3 = createAlchemyWeb3(API_URL)
8
9const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //получаем последний nonce
15
16 //транзакция
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
25 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
26 signPromise
27 .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 err
41 )
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Как получить хэш-код метаданных вашего NFT на Pinata

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

На вашей странице должны отображаться метаданные JSONНа вашей странице должны отображаться метаданные JSON

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

1require("dotenv").config()
2const API_URL = process.env.API_URL
3const PUBLIC_KEY = process.env.PUBLIC_KEY
4const PRIVATE_KEY = process.env.PRIVATE_KEY
5
6const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
7const web3 = createAlchemyWeb3(API_URL)
8
9const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //получаем последний nonce
15
16 //транзакция
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
25 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
26 signPromise
27 .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 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log("Ошибка Promise:", err)
48 })
49}
50
51mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
Показать все

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

1Хэш вашей транзакции: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
2
3Проверьте Mempool в Alchemy, чтобы просмотреть статус вашей транзакции!

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

Просмотр хэша транзакции вашего NFT на EtherscanПросмотр хэша транзакции вашего NFT на Etherscan

Вот и все! Вы развернули и создали NFT в блокчейне Ethereum

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

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

Последнее обновление страницы: 23 февраля 2026 г.

Было ли это руководство полезным?