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

Як карбувати 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

У каталозі скриптів створіть файл 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) нашого контракту — це інтерфейс для взаємодії з нашим смарт-контрактом. Ви можете дізнатися більше про ABI контрактів тут (opens in a new tab). 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. Ви можете видаляти або додавати атрибути в розділі attributes. Найважливіше — переконайтеся, що поле 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.

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

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