Índice
- Introducción
- Creando NFT sin programar
- Creando NFT programando
- Creando el Smart Contract en Remix
- Desplegando el Smart Contract mediante Injected Web3
- Minteando el NFT
- 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

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.

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

Vemos las pantallas de creación.

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

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.

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

Voy a inicializar el nodo con el comando:
ipfs init

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

Cuando lo arrancamos conecta un nuestro nodo en local.

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.

Podemos ver ahora las fotos compartidas.

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.

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

Podemos ver un ejemplo del comando 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.

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:
1 2 3 4 5 |
{ "name": “Almendro en Flor de rcanales", "description": “Imagen del campo con un almendro en Flor.", "image": "https://ipfs.io/ipfs/QmaxaxUqQL7WQ1GUT5b8ECKigruhUa9hMYyu3YX7wxCWZ4?filename=01.JPG", } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 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); } } |
Podemos visualizar el proyecto que se importará con:
1 2 |
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.

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

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;

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.

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.

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.

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.

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

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.

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

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.

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

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.

Podemos comprobar que se importa correctamente el token.

Podemos ir a la información de Etherscan
https://ropsten.etherscan.io/token/0x98b7ed7ccd69414d8f09ef12588010978c36a60e

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

Y verificamos que el fichero json es correcto.

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.
Gracias por la información.