Como acuñar un NFT (parte 2/3 de la serie de tutoriales de NFT)
Beeple(opens in a new tab): 69 millones de $ 3Lau(opens in a new tab): 11 millones de $ Grimes(opens in a new tab): 6 millones de $
Todos ellos acuñaron sus NFT usando la poderosa API de Alchemy. En este tutorial, le enseñaremos a hacer lo mismo en < 10 minutos.
«Acuñar un NFT» es el acto de publicar una instancia única de su token ERC-721 en la cadena de bloques. Usando nuestro contrato inteligente de la parte 1 de esta serie de tutoriales NFT, hagamos flexibles nuestras habilidades Web3 y acuñemos un NFT. Al finalizar este tutorial, será capaz de localizar tantos NFT como se le antojen (¡o su billetera alcance!).
¡Comencemos!
Paso 1: Instalar Web3
Si siguió el primer tutorial sobre cómo crear su contrato inteligente NFT, entonces ya está familiarizado con el uso de Ethers.js. Web3 es similar a Ethers, ya que es una biblioteca usada para crear solicitudes en la cadena de bloques de Ethereum de manera simple. En este tutorial, usaremos Alchemy web3(opens in a new tab), que es una biblioteca de Web3 mejorada que ofrece reintentos automáticos y soporte robusto de WebSocket.
En el directorio de inicio de su proyecto ejecute:
1npm install @alch/alchemy-web32
Paso 2: Crear un archivo mint-nft.js
Dentro de su directorio de scripts, cree un archivo mint-nft.js
file y añada las siguientes líneas de código:
1require("dotenv").config()2const API_URL = process.env.API_URL3const { createAlchemyWeb3 } = require("@alch/alchemy-web3")4const web3 = createAlchemyWeb3(API_URL)5Copiar
Paso 3: Obtener su contrato ABI
Nuestro contrato ABI (las siglas en inglés de Aplicación de Interfaz Binaria) es la interfaz para interactuar con nuestro contrato inteligente. Puede profundizar aquí(opens in a new tab) acerca de los contratos ABI. Hardhat genera automáticamente una ABI para nosotros y la guarda en el archivo MyNFT.json
. Para poder usarlo, necesitaremos analizar el contenido añadiendo las siguientes líneas de código a nuestro archivo mint-nft.js
:
1const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")2Copiar
Si quiere ver la ABI puede hacerlo en su propia consola:
1console.log(JSON.stringify(contract.abi))2Copiar
Para ejecutar mint-nft.js
y ver su ABI impresa en la consola, abra la ventana del terminal y ejecute:
1node scripts/mint-nft.js2Copiar
Paso 4: Configurar los metadatos para su NFT usando IPFS
Si recuerda, como mencionamos en la parte 1 de nuestro tutorial, nuestra función de contrato inteligente mintNFT
aplica un parámetro tokenURI que debe resolverse en un documento JSON que describe los metadatos del NFT, que es realmente lo que le da vida al NFT, permitiéndole tener propiedades configurables, como nombre, descripción e imagen, entre otros atributos.
Interplanetary File System (IPFS) es un protocolo de red descentralizado y de red entre pares para guardar y compartir datos en un sistema de archivos distribuido.
Usaremos Pinata, una conveniente API y kit de herramientas de IPFS, para almacenar nuestros activos y metadatos del NFT y así garantizar que nuestro NFT esté verdaderamente descentralizado. Si no tiene una cuenta en Pinata, puede crearla gratuitamente aquí(opens in a new tab) y completar los pasos para verificar su correo electrónico.
Una vez que haya creado una cuenta:
Navegue hasta la página de «Files» (Archivos) y haga clic en botón azul «Upload» (Subir) en la parte superior izquierda de la página.
Subir una imagen a Pinata: esta será la imagen del activo para su NFT. Dele a su activo el nombre que desee.
Una vez subido, verá la info dentro de la tabla en la página ''Files''. También verá una columna CID. Puede copiar el CID haciendo clic en el botón copiar junto a él. Puede ver el activo subido en
https://gateway.pinata.cloud/ipfs/<CID>
. Para ejemplo, puede ver la imagen que usamos en IPFS aquí(opens in a new tab).
He aquí un resumen de los pasos descritos anteriormente para aquellos que tienen memoria visual:
Ahora, vamos a subir otro documento más a Pinata. Pero antes de hacer eso, necesitamos ¡crearlo!
En su directorio raíz, cree un nuevo archivo llamado nft-metadata.json
y añada el siguiente código 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}16Mostrar todoCopiar
Cambie libremente los datos en el json. Puede quitar o añadir la sección de atributos. Más importante, asegúrese de que el campo de la imagen apunte a la localización de su imagen IPFS - de otra manera, su NFT incluirá una foto (¡muy linda!) de un perrito.
Una vez que haya terminado de editar el archivo JSON, guárdelo y súbalo a Pinata, siguiendo los mismos pasos que utilizamos para subir la imagen.
Paso 5: Crear una instancia de su contrato
Seguidamente, para interactuar con nuestro contrato, necesitamos crear una instancia de él en nuestro código. Para hacerlo, necesitaremos nuestra dirección de contrato, que podemos obtener de la implementación o Etherscan(opens in a new tab) buscando la dirección que usó para implementar el contrato.
En el ejemplo anterior, la dirección de nuestro contrato es 0x81c587EB0fE773404c42c1d2666b5f557C470eED.
A continuación, utilizaremos el método de contrato Web3(opens in a new tab) para crear nuestro contrato usando ABI y la dirección. En su archivo mint-nft.js
, añada lo siguiente:
1const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"23const nftContract = new web3.eth.Contract(contract.abi, contractAddress)4Copiar
Paso 6: Actualizar el archivo .env
Ahora, para crear y enviar transacciones en la cadena de Ethereum, usaremos la dirección de su cuenta pública de Ethereum para obtener la cuenta nonce (que explicaremos a continuación).
Añada su clave pública al archivo .env
, si ha hecho la parte 1 del tutorial, nuestro archivo .env
debería verse así:
1API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"2PRIVATE_KEY = "your-private-account-address"3PUBLIC_KEY = "your-public-account-address"4Copiar
Paso 7: Crear su transacción
Primero, vamos a definir una función llamada mintNFT(tokenData)
y crear nuestra transacción haciendo lo siguiente:
Tome su PRIVATE_KEY y su PUBLIC_KEY del archivo
.env
.Después, necesitaremos averiguar la cuenta nonce. Las especificaciones nonce se usan para rastrear el número de transacciones enviadas desde su dirección - las cuales necesitaremos por cuestiones de seguridad y para prevenir ataques repetidos(opens in a new tab). Para obtener el número de transacciones enviadas desde su dirección, usamos getTransactionCount(opens in a new tab).
Finalmente estableceremos nuestra transacción con la siguiente información:
'from': PUBLIC_KEY
: El origen de nuestra transacción es nuestra dirección pública'to': contractAddress
: El contrato con el que queremos interactuar y enviar la transacción'nonce': nonce
: La cuenta nonce con el número de transacciones enviadas desde nuestra dirección'gas': estimatedGas
: El gas estimado que necesitamos para completar la transacción'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()
: El cálculo que deseamos realizar en esta transacción, que en este caso es acuñar un NFT
Su mint-nft.js
debería verse así:
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 }25Mostrar todoCopiar
Paso 8: Firmar la transacción
Ahora que ya hemos creado nuestra transacción, necesitamos firmarla para poder enviarla. Aquí es donde usaremos nuestra clave privada.
web3.eth.sendSignedTransaction
nos dará el hash de transacción, el cual usaremos para asegurarnos de que nuestra transacción ha sido minada y no descartada por la red. Notará que en la sección de firma de la transacción, hemos añadido algunas comprobaciones de errores, así sabremos si nuestra transacción se ha enviado correctamente.
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}50Mostrar todoCopiar
Paso 9: Ejecutar mintNFT
y después ejecutar el nodo mint-nft.js
¿Recuerda el metadata.json
que cargó en Pinata? Obtenga su código hash de Pinata y pase el siguiente parámetro a la función mintNFT
https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
Así es cómo se puede obtener el código hash:
Cómo obtener el código hash de sus metadatos en Pinata
Asegúrese de que el código hash que copió enlaza con su metadata.json cargando
https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
en una ventana separada. La página debería tener un aspecto similar a la siguiente captura de pantalla:
(opens in a new tab)
Su página debería mostrar los metadatos json
Conjuntamente, su código debería tener un aspecto similar a este:
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("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")52Mostrar todoCopiar
Ahora, ejecute node scripts/mint-nft.js
para implementar su NFT. Después de un par de segundos, debería aparecer una respuesta como esta en su terminal:
1The hash of your transaction is: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e0023Check Alchemy's Mempool to view the status of your transaction!4
A continuación, visite su zona de espera de Alchemy(opens in a new tab) para ver el estado de su transacción (ya sea que esté pendiente, haya sido minada o desechada por la red). Si su transacción ha sido descartada, también es de ayuda comprobarRopsten Etherscan(opens in a new tab) y buscar el hash de su transacción.
(opens in a new tab)
Ver el hash de transacción de su NFT en Etherscan
¡Y eso es todo! Ahora ha implementado y acuñado un NFT en la cadena de bloques de Ethereum
¡Usando el mint-nft.js
puede acuñar tantos NFT como desee (¡y su cartera le permita!) Solo asegúrese de pasar un nuevo tokenURI que describa los metadatos del NFT (de lo contrario, terminará haciendo un montón de idénticos con ID diferentes).
¡Seguramente le gustaría mostrar su NFT en su cartera, por tanto no se pierda la parte 3: Cómo ver su NFT en su cartera!
Última edición: , Invalid DateTime