Lompat ke konten utama

Cara Mencetak NFT (Bagian 2/3 dari Seri Tutorial NFT)

ERC-721
Alchemy
Solidity
kontrak pintar
Pemula
Sumi Mudgil
22 April 2021
8 menit baca

"Pencetakan NFT" adalah tindakan menerbitkan instans unik dari token ERC-721 Anda di rantai blok. Menggunakan kontrak pintar kami dari Bagian 1 dari seri tutorial NFT ini, mari kita asah keterampilan Web3 kita dan cetak sebuah NFT. Di akhir tutorial ini, Anda akan dapat mencetak sebanyak mungkin NFT sesuai keinginan hati (dan dompet) Anda!

Mari kita mulai!

Langkah 1: Periksa pengaturan Anda

Jika Anda mengikuti tutorial pertama tentang pembuatan kontrak pintar NFT Anda, Anda sudah memiliki semua yang dibutuhkan: proyek Hardhat 3 dengan plugin Ethers (buka di tab baru) dan ethers.js (buka di tab baru), sebuah pustaka yang digunakan untuk mempermudah pembuatan permintaan ke rantai blok Ethereum. Kami akan menulis kode pencetakan kami sebagai skrip Hardhat, sehingga kode tersebut menggunakan kembali pengaturan jaringan Sepolia dan nilai API_URL serta PRIVATE_KEY dari Bagian 1 — tidak ada hal baru yang perlu diinstal.

Langkah 2: Buat file mint-nft.js

Di dalam direktori skrip Anda, buat file mint-nft.js dan tambahkan baris kode berikut:

import { network } from "hardhat"

const { ethers } = await network.create()

Seperti dalam skrip penyebaran kami, network.create() terhubung ke jaringan yang Anda pilih dengan --network saat Anda menjalankan skrip, dan memberi kami objek ethers untuk itu.

Langkah 3: Ambil ABI kontrak Anda

Antarmuka Biner Aplikasi (ABI) kontrak kami adalah antarmuka untuk berinteraksi dengan kontrak pintar kami. Anda dapat mempelajari lebih lanjut tentang . Hardhat secara otomatis menghasilkan ABI untuk kami saat mengompilasi kontrak dan menyimpannya di file artifacts/contracts/MyNFT.sol/MyNFT.json. Plugin Hardhat Ethers membacanya dari sana untuk kami saat kami membuat instans kontrak kami di langkah 5, jadi kami tidak perlu memuatnya sendiri.

Jika Anda ingin melihat ABI, Anda dapat mencetaknya ke konsol Anda. Dari direktori akar proyek Anda, jalankan:

node -p "JSON.stringify(require('./artifacts/contracts/MyNFT.sol/MyNFT.json').abi)"

Langkah 4: Konfigurasikan metadata untuk NFT Anda menggunakan IPFS

Jika Anda ingat dari tutorial kami di Bagian 1, fungsi kontrak pintar mintNFT kami menerima parameter tokenURI yang harus mengarah ke dokumen JSON yang mendeskripsikan metadata NFT— yang sebenarnya menghidupkan NFT, memungkinkannya memiliki properti yang dapat dikonfigurasi, seperti nama, deskripsi, gambar, dan atribut lainnya.

Interplanetary File System (IPFS) adalah protokol terdesentralisasi dan jaringan peer-to-peer untuk menyimpan dan berbagi data dalam sistem file terdistribusi.

Kami akan menggunakan Pinata, Antarmuka Pemrograman Aplikasi (API) IPFS dan perangkat yang praktis, untuk menyimpan aset dan metadata NFT kami guna memastikan NFT kami benar-benar terdesentralisasi. Jika Anda tidak memiliki akun Pinata, daftar untuk mendapatkan akun gratis di sini (buka di tab baru) dan selesaikan langkah-langkah untuk memverifikasi email Anda.

Setelah Anda membuat akun:

  • Navigasikan ke halaman Files (buka di tab baru) dan klik tombol "Add" di sudut kanan atas halaman.

  • Unggah gambar ke Pinata — ini akan menjadi aset gambar untuk NFT Anda. Jangan ragu untuk menamai aset tersebut sesuka Anda. Pastikan Anda mengunggahnya ke IPFS publik: file di Private IPFS (buka di tab baru) tidak dapat diambil oleh dompet dan pasar yang menampilkan NFT Anda.

  • Setelah Anda mengunggah, Anda akan melihat file tersebut terdaftar di halaman Files bersama dengan CID (pengidentifikasi konten) miliknya. Salin CID tersebut. Anda dapat melihat unggahan Anda di: https://gateway.pinata.cloud/ipfs/<CID>, atau melalui gateway khusus yang terdaftar di bawah "Gateways" di bilah sisi Pinata. Anda dapat menemukan gambar yang kami gunakan di IPFS di sini (buka di tab baru), sebagai contoh.

Sekarang, kita akan mengunggah satu dokumen lagi ke Pinata. Namun sebelum kita melakukannya, kita perlu membuatnya!

Di direktori akar Anda, buat file baru bernama nft-metadata.json dan tambahkan kode json berikut:

Jangan ragu untuk mengubah data di json tersebut. Anda dapat menghapus atau menambahkan ke bagian atribut. Yang terpenting, pastikan bidang gambar menunjuk ke lokasi gambar IPFS Anda, dalam bentuk ipfs://<image-CID> — jika tidak, NFT Anda akan menyertakan foto anjing (yang sangat lucu!).

Setelah Anda selesai mengedit file JSON, simpan dan unggah ke Pinata, mengikuti langkah-langkah yang sama seperti yang kita lakukan untuk mengunggah gambar. Salin juga CID dari nft-metadata.json; kita akan membutuhkannya di langkah 9.

Langkah 5: Buat instans kontrak Anda

Sekarang, untuk berinteraksi dengan kontrak kami, kami perlu membuat instansnya di kode kami. Untuk melakukannya, kami akan membutuhkan alamat kontrak kami, yang dicetak oleh skrip penyebaran kami di Bagian 1. Anda juga dapat menemukannya di Etherscan (buka di tab baru) atau Blockscout (buka di tab baru) dengan mencari alamat yang Anda gunakan untuk menyebarkan kontrak.

Lihat alamat kontrak Anda di Etherscan

Dalam contoh di atas, alamat kontrak kami adalah 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.

Selanjutnya kita akan menggunakan metode getContractAt dari plugin Hardhat Ethers untuk membuat kontrak kita menggunakan namanya (yang memberitahunya ABI mana yang akan digunakan) dan alamatnya. Di file mint-nft.js Anda, tambahkan yang berikut ini, ganti alamatnya dengan milik Anda sendiri:

const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = await ethers.getContractAt("MyNFT", contractAddress)

Langkah 6: Periksa file .env

Setiap transaksi yang kami kirim harus ditandatangani dengan kunci privat akun Anda. Jika Anda menyelesaikan bagian 1 dari tutorial ini, file .env kami seharusnya sudah terlihat seperti ini:

API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"

Tidak perlu menambahkan alamat publik Anda: ethers mengetahuinya dari kunci privat.

Langkah 7: Buat transaksi Anda

Pertama, mari kita tentukan fungsi bernama mintNFT(tokenURI) dan buat transaksi kita dengan melakukan hal berikut:

  1. Dapatkan akun tempat kita mengirim transaksi. ethers.getSigners() mengembalikan akun yang dikonfigurasi untuk jaringan, yang di Sepolia adalah akun yang kunci privatnya ada di .env. Karena mintNFT adalah onlyOwner, ini harus merupakan akun yang sama yang menyebarkan kontrak.

  2. Panggil fungsi mintNFT pada instans kontrak kita, dengan alamat kita sendiri sebagai penerima dan URI metadata. Ini adalah komputasi yang ingin kita lakukan dalam transaksi ini — yang dalam hal ini adalah mencetak NFT.

Anda tidak perlu menghitung nonce (jumlah transaksi yang dikirim dari alamat Anda, yang mencegah serangan pemutaran ulang), batas gas, atau biayanya sendiri: ethers mengambil atau memperkirakannya sebelum mengirim transaksi.

File mint-nft.js Anda seharusnya terlihat seperti ini sekarang:

Langkah 8: Tandatangani transaksi

Karena jaringan dikonfigurasi dengan kunci privat kita, ethers menandatangani transaksi dengannya secara otomatis sebelum mengirimkannya.

Memanggil mintNFT akan kembali setelah transaksi dikirim, dan memberi kita hash transaksi, yang dapat kita gunakan untuk memastikan transaksi kita ditambang dan tidak dibatalkan oleh jaringan. tx.wait() kemudian menunggu hingga transaksi disertakan dalam sebuah blok. Kami juga telah menambahkan beberapa pemeriksaan kesalahan sehingga kami tahu apakah transaksi kami berhasil diselesaikan.

Langkah 9: Panggil mintNFT dan jalankan mint-nft.js

Ingat nft-metadata.json yang Anda unggah ke Pinata? Dapatkan CID-nya dari Pinata dan teruskan ipfs://<metadata-CID> sebagai parameter ke fungsi mintNFT. Dompet dan pasar menyelesaikan URI ipfs:// melalui gateway IPFS pilihan mereka, sehingga NFT Anda tidak bergantung pada satu gateway mana pun.

Periksa kembali apakah CID yang Anda salin tertaut ke nft-metadata.json Anda dengan memuat https://gateway.pinata.cloud/ipfs/<metadata-CID> ke jendela terpisah. Halaman tersebut akan terlihat mirip dengan tangkapan layar di bawah ini:

Halaman Anda harus menampilkan metadata jsonHalaman Anda harus menampilkan metadata json

Secara keseluruhan, kode Anda akan terlihat seperti ini:

Sekarang, jalankan skrip terhadap Sepolia untuk mencetak NFT Anda:

npx hardhat run scripts/mint-nft.js --network sepolia

Setelah beberapa detik, Anda akan melihat respons seperti ini di terminal Anda:

The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
Your NFT was minted in block <block number>

Untuk melihat detail transaksi Anda, cari hash-nya di Etherscan (buka di tab baru) atau Blockscout (buka di tab baru).

Lihat hash transaksi NFT Anda di EtherscanLihat hash transaksi NFT Anda di Etherscan

Dan itu saja! Anda sekarang telah menyebarkan DAN mencetak NFT di rantai blok Ethereum

Menggunakan mint-nft.js Anda dapat mencetak sebanyak mungkin NFT sesuai keinginan hati (dan dompet) Anda! Pastikan saja untuk meneruskan tokenURI baru yang mendeskripsikan metadata NFT (jika tidak, Anda hanya akan membuat sekumpulan NFT identik dengan ID yang berbeda).

Mungkin, Anda ingin dapat memamerkan NFT Anda di dompet Anda — jadi pastikan untuk memeriksa Bagian 3: Cara Melihat NFT Anda di Dompet Anda!