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

Як викарбувати NFT (Частина 2/3 із серії підручників про NFT)

ERC-721
alchemy
мова програмування
Смарт-контракти
Початківець
Sumi Mudgil
22 квітня 2021 р.
8 читається за хвилину

Beepleopens in a new tab: 69 мільйонів доларів 3LAUopens in a new tab: 11 мільйонів доларів Grimesopens 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 Web3opens 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 нашого контракту (Application Binary Interface) — це інтерфейс для взаємодії з нашим смарт-контрактом. Дізнатися більше про 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, дозволяючи йому мати такі властивості, що налаштовуються: назву, опис, зображення та інші атрибути.

Міжпланетна файлова система (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": "Breed",
5 "value": "Maltipoo"
6 },
7 {
8 "trait_type": "Eye color",
9 "value": "Mocha"
10 }
11 ],
12 "description": "The world's most adorable and sensitive pup.",
13 "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
14 "name": "Ramses"
15}
Показати все

Можете змінювати дані в JSON. Ви можете видаляти атрибути або додавати нові. Найголовніше, переконайтеся, що поле зображення вказує на розташування вашого зображення в IPFS, інакше у ваш NFT потрапить фото (дуже милого!) собаки.

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

Як завантажити nft-metadata.json у Pinata

Крок 5. Створення екземпляра вашого контракту

Тепер, щоб взаємодіяти з нашим контрактом, нам потрібно створити його екземпляр у нашому коді. Для цього нам знадобиться адреса нашого контракту, яку ми можемо отримати з даних розгортання або в Blockscoutopens in a new tab, знайшовши адресу, яку ви використовували для розгортання контракту.

Перегляд адреси вашого контракту на Etherscan

У наведеному вище прикладі адреса нашого контракту — 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.

Далі ми використаємо метод contractopens 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. Щоб отримати кількість транзакцій, надісланих із вашої адреси, ми використовуємо getTransactionCountopens 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 Alchemyopens in a new tab, щоб побачити статус вашої транзакції (чи вона очікує на розгляд, чи її видобуто, чи відхилено мережею). Якщо вашу транзакцію було відхилено, також корисно перевірити Blockscoutopens in a new tab і знайти хеш вашої транзакції.

Перегляд хешу транзакції вашого NFT на EtherscanПерегляд хешу транзакції вашого NFT на Etherscan

Ось і все! Ви щойно розгорнули ТА викарбували NFT на блокчейні Ethereum

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

Імовірно, ви хотіли б мати можливість показати свій NFT у гаманці — тож обов'язково перегляньте Частину 3. Як переглянути свій NFT у гаманці!

Останні оновлення сторінки: 14 лютого 2026 р.

Чи була ця інструкція корисною?