Creando un Token ERC-721

1
1644

Índice

  1. Introducción
  2. Creando NFT sin programar
  3. Creando NFT programando
  4. Creando el Smart Contract en Remix
  5. Desplegando el Smart Contract mediante Injected Web3
  6. Minteando el NFT
  7. Conclusión

Introducción

Cómo crear un token no fungible (NTF) ERC-721 sin programar y programando.

Este es un tutorial de una cadena que estoy escribiendo sobre criptomonedas. A programar sólo se aprende programando así que os invito a cacharrear. 

Aquí podéis ver la cadena de tutoriales.

Cómo comprar e invertir criptomonedas en Binance: https://www.adictosaltrabajo.com/2022/01/14/como-comprar-e-invertir-criptomonedas-en-binance/

Entendiendo las criptomonedas: https://www.adictosaltrabajo.com/2022/01/24/entendiendo-las-criptomonedas/

Votación con contratos inteligentes en Remix: https://www.adictosaltrabajo.com/2022/01/31/votacion-con-contratos-inteligentes-en-remix/

Usando la wallet MetaMask y la red local Ganache: https://www.adictosaltrabajo.com/2022/02/09/usando-la-wallet-metamask-y-la-red-local-ganache/

Compilación y despliegue de contratos inteligentes con Truffle y Ganache: https://www.adictosaltrabajo.com/2022/02/16/compilacion-y-despliegue-de-contratos-inteligentes-con-truffle-y-ganache/

Creando tokens Ethereum: https://www.adictosaltrabajo.com/2022/03/14/creando-tokens-ethereum/

En este caso voy a partir como base de este tutorial, de otro que está estupendo: https://www.quicknode.com/guides/solidity/how-to-create-and-deploy-an-erc-721-nft 

Captura de pantalla de tutorial usado de base https://www.quicknode.com/guides/solidity/how-to-create-and-deploy-an-erc-721-nft

Como este mundo cambia mucho normalmente tenemos problemas de instalación (no suele funcionar nada tal cual suelen venir las instrucciones, sobre todo por las versiones de los productos) espero que complemente al original con instrucciones.

Antes de empezar recordemos que los tokens que hemos creado antes (los ERC-20) son fungibles o no distinguibles (ver tutorial https://www.adictosaltrabajo.com/2022/03/14/creando-tokens-ethereum/) . Es decir, que si he creado 100 tokens ERC-20 son todos iguales, con el mismo valor.

Ahora bien, podemos crear unos tokens que estén asociados a algo (como a una imagen, un cuadro o a un personaje de un videojuego) que los hace únicos. De hecho también podemos crear una colección de 20 tokens únicos de una imagen (numerados) y posibles coleccionistas podrían considerar que tendrán su valor en el futuro (como cuando se hace un número limitado de litografías y no solamente una). 

Estos tokens no fungibles o NFTs pueden tener su sentido en muchas cosas, os pongo escenarios:

– Imaginad que alguien pinta un cuadro y lo deja en deposito en una galería por 1 año. Si se le asocia a un NFT (por alguien que garantice que el propietario del NTF es el propietario del cuadro) y se pone a la venta ese NTF podría cambiar de manos 20 veces (y el propietario llevarse incluso un porcentaje en cada cambio de manos). Al final del periodo podría el último dueño reclamar el cuadro. Considerar el impacto de esto a nivel de oportunidades o de impuestos (parece además un posible modo de blanqueo de capitales a complicar la vida a las autoridades).

– Podrías comprar un terreno en un metaverso y construir en él una edificio chulo y venderlo. Estoy seguro que habrá negocio para arquitectos y diseñadores porque empresas quieran tener sedes virtuales flipantes. Se pueden comprar y vender como Tokens esos elementos virtuales o incluso inmuebles en el mundo real.

– En el mundo de los videojuegos hay mil posibilidades. Imagínate que en un juego compras un personaje y les vas añadiendo complementos, armas, etc. Si el jugador llega a un nivel muy alto podría alguien querer ahorrarse muchos niveles y comprar ese muñeco. Un token puede disociar la cuenta de login (correo) del propio personaje usado por un jugador.

– Puedes comprar/crear un token con una imagen asociada y que sea tu avatar en distintas redes sociales (esto ya se puede hacer en algunas). Podría ser una solución para que las redes sociales paguen derechos de autor a dueños de contenidos cuando se usen en sus sistemas.

– Hay gente que simplemente colecciona (como los cromos a los que culturas les dan tanto valor). Por ejemplo alguien quiere comprar el primer tweet de la historia (que se vendió por 2,9 millones de dólares) porque piensa que en el futuro valdrá mucho más (o incluso para ganar relevancia mundial simplemente por la representatividad mediática del gasto). Se pude hacer prácticamente todo coleccionable.

Como podéis ver, esto parece que tiene recorrido.

También estará la gente que se cree que se va a hacer rica por crear un token, que está al alcance de todo el mundo. Si pintas 20 dibujos y los quieres vender como un token posiblemente te comas los mocos si no eres ya tremendamente famoso y/o no tienes una estrategia a largo plazo de marketing digital (a menos que sea una genialidad que se venda solo). Lo más normal es que la gente simplemente pierda dinero porque os voy a recordar que cada cosa que haces con criptomonedas gasta gas (quemas parte de tu moneda) lo que significa que quien siempre gana es la red ;-). Tiene pinta de que serán como las “eléctricas del futuro” ya que el que pone la red gana la pasta cuantos más trastos conectas.

Creando NFT sin programar

Os invito a visitar https://opensea.io/ que te permite, sin programación, crear tokens no fungibles. Puede ser un primer paso para entender el negocio detrás de esto.

Tal vez podrías crear unos tokens de unas fotos tuyas de pequeño y, cuando seas super famoso, la gente se interese por ellas y te hagas más rico por su compra y venta (derecho a usarlas lícitamente, entiendo), sin hacer nada. 

Captura de pantalla de la home de OpenSea.io

Me he conectado con MetaMask (con usuario asociado a red de pruebas) para ver las opciones de creación.

Os invito a mirar las condiciones de servicio y algunas cosas como las tarifas. Una cosa tremendamente interesante es ver que el creador sigue ganando en cada venta que se produzca, cosa difícil en el mundo real (por ejemplo, con un cuadro).

https://support.opensea.io/hc/en-us/articles/360063498333

Captura de las condiciones de OpenSea de comisión por servicio y de creador.

Vemos las pantallas de creación.

Ejemplo de pantalla de OpenSea de creación de un NFT.

Podéis ver incluso las cotizaciones en tiempo real que tienen algunos elementos (que parece una locura).

Captura de pantalla de OpenSea con los precios de Tokens como CryptoPunks.

Creando NFT programando

Bueno, lo que me ocupa principalmente ahora es aprender a programar un contrato inteligente para la creación de tokens no fungibles ERC-721, veamos los pasos.

Para poder trabajar necesitamos un monedero (MetaMask por ejemplo) y necesitamos usar un Faucet de la red de pruebas para conseguir el saldo para pagar el gas necesario para desplegar los contratos inteligentes. Podéis ir al tutorial donde lo explicábamos https://www.adictosaltrabajo.com/2022/02/09/usando-la-wallet-metamask-y-la-red-local-ganache/

Ahora tenemos que a instalar IPFS en el ordenador. Lo utilizaremos de infraestructura para los ficheros asociados a nuestro token. Vamos al enlace https://docs.ipfs.io/install/command-line/. Descargamos la distribución oficial.

NI DECIR TIENE QUE ESTOY COMPARTIENDO LAS PANTALLAS DE PRUEBAS DE IPFS, CÓDIGOS DE TOKENS, ETC. PERO NO LO HAGAIS COMO NORMA PARA EVITAR RIESGOS DE SEGURIDAD. No es buena idea compartir tus identificadores, IPs, etc.

Captura de pantalla de la página de descarga de IPFS.

Ejecutamos los comandos para la instalación:

https://dist.ipfs.io/go-ipfs/v0.12.0/go-ipfs_v0.12.0_darwin-amd64.tar.gz
tar -xvzf go-ipfs_v0.12.0_darwin-amd64.tar.gz
cd go-ipfs
bash install.sh
ipfs --version

Y vemos que (sorprendentemente) funciona todo estupendamente. Si lees la documentación veréis que no es necesario dar privilegios de administrador (sudo). 

Captura de pantalla de las consola con los resultados de la ejecución.

Voy a inicializar el nodo con el comando:

ipfs init

Captura de pantalla de la ejecución del arranque de IPFS.

En este caso no lo voy a instalar como un demonio para controlar la ejecución/arranque. 

Voy a instalar también la version desktop para ver mejor qué es lo que está pasando. En el siguiente enlace bajamos la última versión .dmg (instalador de Mac).

https://github.com/ipfs/ipfs-desktop/releases

Captura de pantalla de las versiones disponibles de descarga de IPFS Desktop, actualmente la 0.20.2.

Cuando lo arrancamos conecta un nuestro nodo en local.

Captura de pantalla de IPFS Desktop.

Voy a subir unas fotos que he hecho. En el momento que lo subas se distribuirá por el mundo, así que ojito lo que subís a estas redes de ficheros distribuidos.

Captura de pantalla de carpeta del escritorio donde tengo las fotos que quiero compartir.

Podemos ver ahora las fotos compartidas.

Captura de pantalla de la imágenes subidas a IPFS, donde se visualiza su nombre y un identificador único.

Ahora podemos navegar y ver la vista rápida de las imágenes. He cambiado las imágenes de nombre para que tengan un nombre secuencial de 01.JPG a 10.JPG.

Captura de imagen de la vista rápida de una imagen de un almendro en flor hecha por mí.

En IPFS desktop vamos a activar en modo tutor para ver los comandos de línea equivalentes a las cosas que hacemos gráficamente.

Captura de la opción de activación de IPFS Desktop.

Podemos ver un ejemplo del comando get.

Captura de pantalla del comando equivalente a un botón pulsado, en este caso la recuperación con ipfs get.

Podemos pulsar el botón derecho sobre cualquier fichero y dar a la opción de Compartir Enlace. Con este enlace desde cualquier navegador podemos recuperar el fichero en el almacenamiento distribuido.

Captura de pantalla de la opción de compartir enlace.

Se genera un fichero con el siguiente formato: https://ipfs.io/ipfs/QmaxaxUqQL7WQ1GUT5b8ECKigruhUa9hMYyu3YX7wxCWZ4?filename=01.JPG

Pero lo que realmente nos interesa más tener no solo un fichero con una imagen sino otra información adicional. Podemos crear un fichero JSON que tenga más campos y ser ese fichero el que realmente tenga la información (par:valor). 

Creamos el fichero foto01.json y los subimos también a IPFS para obtener su enlace externo.

Este es el fichero json: 

{
    "name": “Almendro en Flor de rcanales",
    "description": “Imagen del campo con un almendro en Flor.",
    "image": "https://ipfs.io/ipfs/QmaxaxUqQL7WQ1GUT5b8ECKigruhUa9hMYyu3YX7wxCWZ4?filename=01.JPG",
}
Captura de pantalla del fichero json en la carpeta de IPFS Desktop.

Importamos el fichero json en IPFS y sacamos el enlace externo.

Este es el enlace externo que hemos obtenido.

https://ipfs.io/ipfs/QmbXBAggXbx8PAuNsuKsL3PqrYn8j1wFcnko4MZbH2vBhh?filename=foto01.json

Ahora ya seguimos las instrucciones en Remix para crear el token. 

Usamos el proyecto https://github.com/nibbstack/erc721/tree/master/src/contracts/tokens como referencia y solo necesitamos un código mínimo. Esto nos vale de momento pero tenemos que pensar siempre las implicaciones de lo que hacemos. Si heredamos código de un tercero puede tener más código y funcionalidad del necesario o no estar optimizado y pagar demasiado gas. Imagina que hicieras un portal como OpenSea, en ese caso tendríamos que cuidar esto hasta el infinito.

Este es el código.

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
 
import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol";
 
contract ntfrcanales is NFTokenMetadata, Ownable {
 
  constructor() {
    nftName = "rcanales NFT";
    nftSymbol = "RCMNFT";
  }
 
  function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner {
    super._mint(_to, _tokenId);
    super._setTokenUri(_tokenId, _uri);
  }
}
Captura de pantalla del tutorial usado como referencia en https://www.quicknode.com/guides/solidity/how-to-create-and-deploy-an-erc-721-nft

Podemos visualizar el proyecto que se importará con:

import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol";

Podemos navegar por el repositorio para documentarnos.

Captura de pantalla de los ficheros de contrato del repositorio https://github.com/nibbstack/erc721/tree/master/src/contracts/tokens

Creando el Smart Contract en Remix

Creamos nuestro fichero en Remix y podemos borrar todos los demás ficheros de proyectos anteriores.

Captura de pantalla de Remix con nuestro fichero de contrato.

Podemos comprobar en el fichero de código que la versión de compilación es la 0.8.0 pragma solidity 0.8.0;

Captura de pantalla de la opción de selección de la versión de compilación 0.8.0 de Solidity en Remix.

Desplegando el Smart Contract mediante Injected Web3

Ahora que tenemos compilado el contrato podemos desplegarlo. Vamos a usar Injected Web3 para usar un monedero MataMask para inyectar el contexto de nuestra cuenta.

Captura de pantalla de las opciones de despliegue de MetaMask con Injected Web3.

Nos tendremos que logar en nuestra cuenta de MetaMask, si no lo estamos, y elegir nuestra cuenta. Debemos comprobar el saldo que tenemos conectados a la red Ropsten.

Al pulsar Deploy en Remix para una comprobación del gas necesario. En mi caso, al hacerlo un día por la noche, y de aparente mucha carga, nos salta la advertencia de que es posible que no tengamos gas disponible.

Captura de pantalla del mensaje de error de fallo en la estimación de gas.

Si continuamos podemos ver en MetaMask la advertencia de saldo insuficiente. En este caso es tremendamente extraño porque nos dice que el coste es disparatado. De echo haciendo al día siguiente el coste era 100 veces menor.

Captura de pantalla de la estimación de coste en gas.

Si hacemos un cálculo rápido podemos ver lo disparatado del coste de mandar el contrato. A un coste de 0.5 Ether, que está a 2.775 dólares .. cualquiera se atreve a hacer nada. Por suerte estamos en una red de pruebas pero esto nos da la pista de que tenemos que ser cuidadosos antes de pulsar el botón para confirmar una operación en el entorno de criptomonedas.

Captura de pantalla del cambio en dólares de ETH a 2.775,40 dólares.

En algunos casos nos puede interesar elegir la prioridad de ejecución de contratos para rebajar un poco el coste.

Captura de pantalla de las opciones de gasto de gas.

Si tenemos suficiente gas ya podemos desplegar el contrato y comprobaremos que nos aparecen las distintas funciones disponibles. De momento recordamos que solamente hemos construido un contrato donde hemos establecido el nombre y símbolo del token.

Captura de pantalla de Remix con el contrato ya desplegado.

Podemos pulsar la opción de ver en Etherscan y comprobar nuestra ejecución del contrato.

Captura de pantalla de Etherscan 0x98b7ed7ccd69414d8f09ef12588010978c36a60e

Minteando el NFT

Ahora tenemos que irnos a la opción de mint donde asignamos a un usuario un token, con un id de token y la uri del fichero json en la red IPFS.

Captura de pantalla de la opción de mint del contrato desplegado del NFT.

Ahora, pulsamos la opción de «transact» para asociar la información.

Captura de pantalla de MetaMask con la ejecución de la función mint.

Como hemos hecho en otras ocasiones, para poder ver el token en nuestro monedero MetaMask, necesitamos ir a la opción de importación con el código del contrato.

Captura de pantalla de la información de Token en MetaMask.

Podemos comprobar que se importa correctamente el token.

Captura de pantalla de la comprobación de la importación del token.

Podemos ir a la información de Etherscan

https://ropsten.etherscan.io/token/0x98b7ed7ccd69414d8f09ef12588010978c36a60e

Captura de pantalla de Etherscan.

Y podemos ahora recuperar a partir del id del Token (inicialmente 1) los demás datos asociados, incluidos la URI del json.

Captura de pantalla de todas las opciones del contrato donde recuperamos de la red los datos guardados al asignar tokens.

Y verificamos que el fichero json es correcto.

Captura de pantalla del resultado del fichero IPFS recuperado.

Conclusión

Como podemos comprobar ya tenemos el circulo cerrado. Creamos el contrato, creamos los tokens y recuperamos la información asociada a los tokens.

Obviamente ya sólo nos quedaría construir un interfaz de las funciones en la aplicación Web con Java Script.

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad