Skip to content

Creación de NFT y casos de uso en Web3 (parte II)

Share on twitter
Share on linkedin
Share on email
Share on whatsapp
Creación de NFT y casos de uso en Web3 (parte II)

En el post anterior, Creación de NFT y casos de uso en Web3 (parte I), aprendimos algunas cosas sobre los NFTs y la Web3. Cómo instalar el wallet Metamask, cómo crear una dirección en la blockchain Gnosis o en su testnet Chiado, y cómo conseguir una pequeña cantidad de criptomoneda nativa (xDai) a través de un faucet para poder crear smart contracts.

Hoy vamos a utilizar estos xDai para desplegar un smart contract en la blockchain que nos servirá para crear y distribuir nuestros propios NFTs.

Los smart contracts son pequeños programas que se ejecutan en los nodos de las blockchains basadas en Ethereum (como es el caso de Gnosis). En realidad, estos programas podrían escribirse en casi cualquier lenguaje, pero en este ejemplo vamos a utilizar Solidity. Este es un lenguaje similar a JavaScript, fácil de aprender y específicamente creado para ejecutarse de forma muy eficiente en la Máquina Virtual de Ethereum (EVM). Si quieres profundizar en los smart contracts y en Solidity, esta documentación te será muy útil.

Instalación del entorno de desarrollo

Vamos a empezar por instalar HardHat, un entorno de desarrollo para Ethereum que permite crear contratos con Solidity, compilarlos, y desplegarlos en una blockchain, ya sea local o pública.

Web de Hardhat, entorno de desarrollo para smart contracts en Solidity
Web de Hardhat, entorno de desarrollo para smart contracts en Solidity

Para poder continuar tienes que tener instalado el gestor de paquetes npm (puedes ver aquí como hacerlo). Después, puedes crear el directorio para el proyecto y ejecutar los comandos de instalación:

mkdir gnosis-nft
cd gnosis-nft && npm init && npm install hardhat && npx hardhat
npm install @nomicfoundation/hardhat-toolbox

Una vez descargados los paquetes y dependencias de hardhat, se iniciará un wizard para crear el proyecto. Puedes aceptar los valores por defecto, y al final, selecciona «Create an empty hardhat.config.js»:

hardhat.config.js

Escribiendo el smart contract NFT

El smart contract que necesitamos debe implementar la interface ERC721, cuyos métodos nos permitirán transferir un NFC de un wallet a otro, obtener el balance de un wallet, etc. Podríamos hacer esta implementación desde cero, pero es más sencillo utilizar una librería ya existente, como la de Open Zeppelin. En la web de documentación tenemos además un wizard que nos permitirá crear un contrato con unos pocos clicks.

Instalamos la librería y creamos un directorio para el contrato y otro para los scripts de despliegue:

npm install @openzeppelin/contracts
mkdir contracts && mkdir scripts

Accedemos al wizard de Open Zeppelin desde un navegador y seleccionamos «ERC721» como tipo de contrato. Seleccionamos los checks de «Mintable», «Auto Increment Ids» y «URI Storage». Rellenamos los campos «Name» y «Symbol» (Por defecto aparece «MyToken» y «MKT» respectivamente), y veremos el código del contrato listo para descargar. Pulsamos el botón «Download», seleccionamos «Single file», y elegimos como lugar de descarga el directorio «contracts» que hemos creado previamente:

Smart contract para crear NFTs
Smart contract para crear NFTs

Compilación y despliegue del smart contract

Desde el directorio raiz del proyecto («gnosis-nft»), compilamos el contrato:

npx hardhat compile
Compiled 14 Solidity files successfully

Y ya está listo para desplegar! ¿Recuerdas el directorio «scripts» que creamos anteriormente? pues con tu editor de texto favorito vamos a crear un fichero «deploy.js» dentro de gnosis-nft/scripts. Sería así:

async function main() {
    const [deployer] = await ethers.getSigners();
    console.log("Desplegando contrato con la cuenta:", deployer.address);
    console.log("Balance:", (await deployer.getBalance()).toString());
  
    const Token = await ethers.getContractFactory("MiNFT"); // El mismo nombre declarado en el .sol 
    const token = await Token.deploy();
  
    console.log("Dirección del Token NFT:", token.address);
}
  
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
});

Para poder utilizar los xDai que obtuvimos del faucet, tenemos que modificar el fichero hardhat.config.js, de forma que quede así:

/** @type import('hardhat/config').HardhatUserConfig */
require("@nomicfoundation/hardhat-toolbox");

const fs = require("fs");

module.exports = {
  solidity: "0.8.17",
  defaultNetwork : 'gnosis',
  networks: {
    
    gnosis: {
      url: 'https://rpc.gnosischain.com/',
      gasPrice: 'auto',
      gas: 'auto',
      accounts: [getPrivateKey()],
    }
  }
};
function getPrivateKey() {
  try {
    return fs.readFileSync("./private_key.txt").toString().trim();
  } catch (e) {
    console.log(e);
      console.log(
        "Error: No se encontró el fichero con la clave privada de la cuenta de despliegue."
      );
  }
  return "";
};

Como puedes ver en el código, se utiliza un fichero «private_key.txt». Enseguida vemos como crearlo. También puedes ver que en el json están las claves «defaultNetwork», «gnosis» y «url». En mi caso está configurado para usar la mainnet, pero si quieres utilizar la testnet Chiado, cambia defaultNetwork para que tenga el valor «chiado», cambia la clave «gnosis» por «chiado» y pon como valor de «url» la cadena «https://rpc.chiadochain.net«.

Para crear el fichero «private_key.txt» tenemos que exportar la clave privada de nuestro wallet en Metamask. En el navegador en el que instalamos este plugin (ver Creación de NFT y casos de uso en Web3 (parte I)), abrimos Metamask, y en el menú seleccionamos «Detalles de la cuenta» y «Exportar clave privada». Nos pedirá el password y ya podremos copiar la clave privada. Es importante que nunca envíes una clave privada o la publiques en ningún sitio (blog, captura de pantalla, github, etc.), ya que con ella cualquiera podría acceder a todos los tokens y criptomonedas que tengas en el wallet.

Exportando la clave del wallet en Metamask
Exportando la clave del wallet en Metamask

Crea un fichero de texto llamado «private_key.txt» en el directorio raíz del proyecto, y pega la clave privada dentro. Ahora ya podemos desplegar el contrato en la blockchain:

npx hardhat run scripts/deploy.js –network gnosis
(node:66393) ExperimentalWarning: stream/web is an experimental feature. This feature could change at any time
(Use `node –trace-warnings …` to show where the warning was created)
Desplegando contrato con la cuenta: 0x1234567890123456789012345678901234567890
Dirección del Token NFT: 0xABABABABAFEFEFEFEFABABABABADEDEABABABABA

Bueno, pues ya hemos creado nuestro NFT! podéis verlo en la blockchain buscando la dirección del Token en el explorador de bloques de Chiado (o en el de Gnosis si lo has creado en la mainnet). Es importante que guardes la dirección del Token para poder hacer operaciones con el contrato.

En la próxima entrega veremos cómo asignarlo a una cuenta de wallet (minting), cómo añadirle metadatos, como una nombre, una descripción y una imagen, y cómo poder usarlo como llave de acceso a una aplicación web. ¡Espero que os haya gustado el post!.

Share the article

Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on email
Email
Share on whatsapp
WhatsApp

A new generation of technological services and products for our customers