Salt la conținutul principal

Cum să emitem un NFT (Partea 2/3 din seria de tutoriale despre NFT-uri)

NFT-uriERC-721AlchemySoliditycontractele inteligente
Începător
Sumi Mudgil
22 aprilie 2021
9 minute de citit minute read

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_URL
3const { 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.js
Copiaț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:

Pentru cei care învață mai bine vizual, etapele de mai sus sunt rezumate aici:

Cum să vă încărcați imaginea în Pinata(opens in a new tab)

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ă tot
Copiaț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.

Cum să vă încărcați nft-metadata.json în Pinata

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.

Vizualizarea adresei dvs. de contract pe Etherscan

Î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"
2
3const 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:

  1. Obțineți PRIVATE_KEY și PUBLIC_KEY din fișierul „.env”.

  2. 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).

  3. Î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ția

  • nonce': 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;
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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED";
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'); //get latest nonce
15
16 //the transaction
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 }
Afișează tot
Copiaț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_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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
15
16 //the transaction
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 "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 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log(" Promise failed:", err)
48 })
49}
Afișează tot
Copiaț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 hashcode-ul metadatelor nft pe PinataCum 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 jsonPagina 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_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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
15
16 //the transaction
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 "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 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log("Promise failed:", err)
48 })
49}
50
51mintNFT(
52 "https://gateway.pinata.cloud/ipfs/QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP"
53)
Afișează tot
Copiaț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: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e00
2
3Check 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.

Vizualizarea hash-ului tranzacției NFT pe EtherscanVedeț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

A fost util acest tutorial?