Як викарбувати NFT (Частина 2/3 із серії підручників про NFT)
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_URL3const { 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. Але перш ніж зробити це, нам потрібно його створити!
У кореневому каталозі створіть новий файл 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, виконавши ті самі кроки, що й під час завантаження зображення.
Крок 5. Створення екземпляра вашого контракту
Тепер, щоб взаємодіяти з нашим контрактом, нам потрібно створити його екземпляр у нашому коді. Для цього нам знадобиться адреса нашого контракту, яку ми можемо отримати з даних розгортання або в Blockscoutopens in a new tab, знайшовши адресу, яку ви використовували для розгортання контракту.
У наведеному вище прикладі адреса нашого контракту — 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.
Далі ми використаємо метод contractopens 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. Щоб отримати кількість транзакцій, надісланих із вашої адреси, ми використовуємо getTransactionCountopens 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 Alchemyopens in a new tab, щоб побачити статус вашої транзакції (чи вона очікує на розгляд, чи її видобуто, чи відхилено мережею). Якщо вашу транзакцію було відхилено, також корисно перевірити Blockscoutopens in a new tab і знайти хеш вашої транзакції.
Перегляд хешу транзакції вашого NFT на Etherscan
Ось і все! Ви щойно розгорнули ТА викарбували NFT на блокчейні Ethereum
За допомогою mint-nft.js ви можете карбувати стільки NFT, скільки забажає ваше серце (і гаманець)! Просто не забудьте передати новий tokenURI, що описує метадані NFT (інакше ви просто створите купу однакових токенів із різними ідентифікаторами).
Імовірно, ви хотіли б мати можливість показати свій NFT у гаманці — тож обов'язково перегляньте Частину 3. Як переглянути свій NFT у гаманці!
Останні оновлення сторінки: 14 лютого 2026 р.


