Cum să emitem un NFT (Partea 2/3 din seria de tutoriale despre NFT-uri)
Beeple(opens in a new tab): 69 de milioane de dolari 3LAU(opens in a new tab): 11 milioane de dolari Grimes(opens in a new tab): 6 milioane de dolari
Toți și-au emis NFT-urile folosind puternicul API al Alchemy. În acest tutorial vă vom învăța cum să faceți același lucru în <10 minute.
„Emiterea unui NFT” este actul de a publica o instanță unică a tokenului dvs. ERC-721 pe blockchain. Utilizând contractul nostru inteligent din Partea 1 a acestei serii de tutoriale despre NFT-uri, haideți să ne adaptăm aptitudinile pentru web3 și să emitem un NFT. La sfârșitul acestui tutorial veți fi capabili să bateți cât de multe NFT-uri vă dorește inima (și portofelul)!
Să începem!
Etapa 1: Instalarea web3
Dacă ați urmat primul tutorial privind crearea contractului inteligent NFT, aveţi deja experienţă în utilizarea Ethers.js. Web3 este similar cu Ethers, întrucât este o bibliotecă utilizată pentru a facilita crearea de cereri către blockchain-ul Ethereum. În acest tutorial vom folosi Alchemy Web3(opens in a new tab), o bibliotecă Web3 îmbunătățită, care oferă reîncercări automate și o compatibilitate robustă cu WebSocket.
În directorul principal al proiectului dvs., rulați:
1npm install @alch/alchemy-web3
Etapa 2: Crearea unui fișier mint-nft.js
În interiorul directorului dvs. de scripturi, creați un fișier mint-nft.js și adăugați următoarele linii de cod:
1require("dotenv").config()2const API_URL = process.env.API_URL3const { createAlchemyWeb3 } = require("@alch/alchemy-web3")4const web3 = createAlchemyWeb3(API_URL)Copiați
Etapa 3: Obţinerea ABI-ului contractului dvs.
ABI-ul contractului nostru (Application Binary Interface) („Interfața binară a aplicației”) este interfața de interacțiune cu contractul nostru inteligent. Puteți afla mai multe despre ABI-urile de contract aici(opens in a new tab). Hardhat ne generează automat un ABI și îl salvează în fișierul MyNFT.json. În vederea folosirii acestuia, va trebui să-i analizăm conținutul prin adăugarea următoarelor linii de cod în fișierul nostru mint-nft.js:
1const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")Copiați
Dacă vreți să vedeți ABI-ul, îl puteți imprima în consolă:
1console.log(JSON.stringify(contract.abi))Copiați
Pentru a rula mint-nft.js și pentru a vedea ABI-ul imprimat în consolă, navigați în terminal și rulați
1node scripts/mint-nft.jsCopiați
Etapa 4: Configurarea metadatelor pentru NFT utilizând IPFS
Dacă vă amintiți din tutorialul nostru din Partea 1, funcția noastră de contract inteligent mintNFT primește un parametru tokenURI care ar trebui să rezolve la un document JSON care descrie metadatele NFT-ului— și care este de fapt ceea ce dă viață NFT-ului, permițându-i să aibă proprietăți configurabile, cum ar fi un nume, o descriere, o imagine și alte atribute.
Interplanetary File System (IPFS) este un protocol descentralizat și o rețea peer-to-peer pentru stocarea și partajarea datelor într-un sistem de fișiere distribuit.
Vom folosi Pinata, un API și un set practic de instrumente IPFS, pentru a stoca activul și metadatele NFT, ca să ne asigurăm că NFT-ul nostru este cu adevărat descentralizat. Dacă nu aveți un cont Pinata, vă puteți crea unul gratuit aici(opens in a new tab), apoi completați etapele de verificare a e-mail-ului.
Odată ce ați creat contul:
Navigați la pagina „Files” („Fișiere”) și dați clic pe butonul albastru „Upload” („Încărcare”) din partea superioară stângă a paginii.
Încărcați o imagine în pinata — aceasta va constitui activul de imagine pentru NFT-ul dvs. Puteți numi activul oricum doriți
După încărcare, veți vedea informațiile despre fișier în tabelul de pe pagina Fișiere. Veți vedea şi o coloană CID. Puteți copia CID-ul dând clic pe butonul de copiere de lângă el. Puteți vizualiza fișierul încărcat la:
https://gateway.pinata.cloud/ipfs/<CID>
. Puteți găsi imaginea pe care am folosit-o pe IPFS aici(opens in a new tab), de exemplu.
Pentru cei care învață mai bine vizual, etapele de mai sus sunt rezumate aici:
Acum vrem să încărcăm încă un document în Pinata. Dar mai întâi trebuie să îl creăm!
În directorul rădăcină, creați un nou fișier numit nft-metadata.json și adăugați următorul cod 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": "https://gateway.pinata.cloud/ipfs/QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",14 "name": "Ramses"15}Afișează totCopiați
Dacă doriți, puteți să modificați datele din json. Puteți scoate sau adăuga elemente din secțiunea de atribute. Însă cel mai important este să verificați ca parametrul din secțiunea „image” să indice locația imaginii IPFS — dacă nu, NFT-ul dvs. va include o fotografie a unui câine (foarte simpatic!).
După ce ați terminat de editat fișierul json, salvați-l și încărcați-l în Pinata, urmând aceiași pași pe care i-am urmat pentru încărcarea imaginii.
Etapa 5: Crearea unei instanțe a contractului
În continuare, pentru a interacționa cu contractul nostru, trebuie să creăm o instanță a acestuia în codul nostru. Ca să facem acest lucru, vom avea nevoie de adresa contractului, care poate fi obținută fie din implementare, fie din Etherscan(opens in a new tab), căutând adresa pe care ați folosit-o pentru implementarea acestuia.
În exemplul de mai sus, adresa contractului nostru este 0x81c587EB0fE773404c42c1d2666b5f557C470eED.
Apoi vom utiliza metoda contract(opens in a new tab) web3 pentru a crea contractul, folosind „ABI” și „address”. În fișierul „mint-nft.js”, adăugați următoarele:
1const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"23const nftContract = new web3.eth.Contract(contract.abi, contractAddress)Copiați
Etapa 6: Actualizarea fișierului .env
Mai departe, pentru a crea și a trimite tranzacții în lanțul Ethereum, vom folosi adresa publică a contului dvs. Ethereum pentru a obține nonce-ul contului (vom explica mai jos).
Adăugați cheia dvs. publică la fișierul „.env” — dacă ați finalizat partea 1 a tutorialului, fișierul nostru „.env” ar trebui să arate acum așa:
1API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"2PRIVATE_KEY = "your-private-account-address"3PUBLIC_KEY = "your-public-account-address"Copiați
Etapa 7: Crearea unei tranzacții
În primul rând, să definim o funcție numită minfNFT(tokenData)
și să creăm tranzacția noastră procedând astfel:
Obțineți PRIVATE_KEY și PUBLIC_KEY din fișierul „
.env
”.Apoi trebuie să aflăm care este nonce-ul contului. Specificația nonce este utilizată pentru a monitoriza numărul de tranzacții trimise de la adresa dvs. — este necesară din motive de securitate și pentru a preveni atacurile de reluare(opens in a new tab). Pentru a obține numărul tranzacțiilor trimise de la adresa dvs., vom folosi getTransactionCount(opens in a new tab).
În cele din urmă, vom configura tranzacția noastră cu următoarele informații:
'from': PUBLIC_KEY
— Originea tranzacției noastre este adresa noastră publică'to': contractAddress
— Contractul cu care vrem să interacționăm și la care să trimitem tranzacțianonce': nonce
— Nonce-ul contului cu numărul de tranzacții trimise de la adresa noastră'gas': estimatedGas
— Valoarea estimată a gazului necesar pentru finalizarea tranzacției'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()
— Calculul pe care dorim să îl efectuăm în această tranzacție - care în acest caz este emiterea unui NFT
Fișierul dvs. mint-nft.js ar trebui să arate astfel acum:
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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED";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'); //get latest nonce1516 //the transaction17 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 }Afișează totCopiați
Etapa 8: Semnarea tranzacției
După ce ne-am creat tranzacția, trebuie să o semnăm pentru a o trimite. Aici urmează să folosim cheia noastră privată.
web3.eth.sendSignedTransaction
ne va furniza hash-ul tranzacției, pe care îl putem folosi pentru a verifica dacă tranzacția noastră a fost minată și nu a fost abandonată de rețea. În secțiunea de semnare a tranzacției, am adăugat o verificare a erorilor, astfel încât să știm dacă tranzacția noastră a fost efectuată cu succes.
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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)1213async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce1516 //the transaction17 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 "The hash of your transaction is: ",34 hash,35 "\nCheck Alchemy's Mempool to view the status of your transaction!"36 )37 } else {38 console.log(39 "Something went wrong when submitting your transaction:",40 err41 )42 }43 }44 )45 })46 .catch((err) => {47 console.log(" Promise failed:", err)48 })49}Afișează totCopiați
Etapa 9: Apelarea mintNFT și rularea nodului contract-interact.js
Vă amintiți de „metadata.json” pe care ați încărcat-o în Pinata? Obțineți codul său hash din Pinata și treceți-l ca parametru la funcția mintNFT https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
Iată cum să obțineți codul hash:
Cum să obțineți codul hash al metadatelor nft pe Pinata
Verificați de două ori dacă hashcode-ul pe care l-ați copiat se leagă de metadata.json by loading
https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
într-o fereastră separată. Pagina ar trebui să arate similar cu captura de ecran de mai jos:
Pagina dvs. ar trebui să afișeze metadatele json
În ansamblu, codul dvs. ar trebui să arate cam așa:
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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)1213async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce1516 //the transaction17 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 "The hash of your transaction is: ",34 hash,35 "\nCheck Alchemy's Mempool to view the status of your transaction!"36 )37 } else {38 console.log(39 "Something went wrong when submitting your transaction:",40 err41 )42 }43 }44 )45 })46 .catch((err) => {47 console.log("Promise failed:", err)48 })49}5051mintNFT(52 "https://gateway.pinata.cloud/ipfs/QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP"53)Afișează totCopiați
Acum rulați node scripts/mint-nft.js
pentru a vă implementa NFT-ul. După câteva secunde, ar trebui să vedeți un răspuns ca acesta în terminalul dvs.:
1The hash of your transaction is: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e0023Check Alchemy's Mempool to view the status of your transaction!
În continuare, vizitați mempool-ul Alchemy(opens in a new tab) pentru a verifica starea tranzacției (dacă este în așteptare, minată sau abandonată de rețea). Dacă tranzacția dvs. a fost abandonată, este util să verificați și Ropsten Etherscan(opens in a new tab) pentru a căuta hash-ul tranzacției.
Vedeți hash-ul tranzacției NFT pe Etherscan
Şi asta-i tot! Acum ați implementat și emis un NFT pe blockchain-ul Ethereum
Folosind „mint-nft.js”, puteți bate cât de multe NFT-uri vă dorește inima (și portofelul)! Doar aveţi grijă să introduceți un nou tokenURI care să descrie metadatele NFT-ului (altfel o să ajungeți să creați o grămadă de jetoane identice cu ID-uri diferite).
Fără îndoială că ați vrea să vă mândriţi cu NFT-ul din portofel — așa că nu uitați să consultați Partea 3: Cum să vă vizualizați NFT-ul în portofel!
Ultima modificare: @pettinarip(opens in a new tab), 23 noiembrie 2023