fbpx

¿Como crear un NFT con Cardano?

Crypto

¿Como crear un NFT con Cardano?

Durante este artículo buscaremos navegar por cada uno de los pasos necesarios para crear un NFT usando Cardano, usaremos las herramientas nativas de la red sin la necesidad de crear un contrato inteligente. Todos los scripts fueron usados en Windows 10.

¿Qué es un NFT?

Para definir a un NFT nos vamos a ir a su concepto en Wikipedia, que dice que un token criptográfico que no es mutuamente intercambiable. Sus propiedades principales es que es único, indivisible y con la capacidad de probar su escasez. Link a Wikipedia. Otras características importantes es que es transferible, para explicar este último lo más importante a entender es que no puede ser intercambiado por uno de su propia especie, tenemos como por ejemplo una pintura de arte que no puede ser intercambiada por otra pintura porque no serían equivalentes.

Tomando lo anterior en consideración vamos a navegar por los términos importantes a la hora de crear un token en Cardano:

  • Archivo de política: en este archivo se define principalmente quien puede generar el NFT y cuando puede esto ocurrir.
  • El ID de la política: es un ID único que se deriva del archivo de política. Este ID es el que principalmente usan los que publican NFT para decirle a sus consumidores que el NFT son los originales generados por ellos.
  • Archivo de Metadatos: archivo que contiene las propiedades principales del NFT, a mí me gusta dividir esto en dos categorías, acceso a recursos externos, como por ejemplo: imágenes, archivos, sistemas; y la segunda categoría son propiedades como el nombre y descripción.
  • Transacciones de entrada y salida: lista de transacción que queremos usar como entrada para crear los NFT, estas transacciones de entrada lo importante es que tengas los fondos para poder pagar por la comisión y los montos mínimos que debemos enviar a cada transacción de salida. Las transacciones de salidas es a quien queremos enviar el NFT y si queda algún cambio de la transacción a qué cuenta debemos enviar dicho dinero. Si este punto es un poco confuso lo mejor es que trates de navegar por la página que explica los diferentes conceptos técnicos del modelo que utiliza Cardano. Link para más detalles.

En la siguiente imagen podemos seguir como cada uno de estos elementos requeridos para construir una transacción, para luego firmar y enviarla a la red Cardano para que quede registrada.

Nota: estos no son los únicos elementos que necesitamos conocer para construir la transacción, pero lo iremos revisando en cada punto que tocaremos hasta construir nuestro primer NFT.

Carga del archivo a un sistema de archivo interplanetario

Desde el punto de vista técnico lo primero que tenemos que resolver es donde almacenar el archivo (Imagen, Música, Documento) del NFT, para esta práctica vamos a usar un sistema de almacenamiento distribuido (sistema de archivos interplanetarios), buscando que el objeto siempre esté disponible y que el comprador/usuario siempre tenga acceso. Para lograr esto vamos a usar las API que nos provee blockfrost. Siguiendo los siguientes pasos se puede crear una nueva cuenta y subir tu archivo y mantenerlo de forma permanente en el sistema. Es importante destacar que esta no es la única opción, pronto estaremos escribiendo cuáles son las opciones para almacenar un NFT.

El primer paso es crear tu cuenta de Blockfrost usando tu metodo de preferencia.

Luego de crear tu cuenta debes crear un nuevo proyecto en la red IPFS.

Luego de crear el proyecto es importante mantener a la mano el API Key generado.

Al tener la API Key estamos listo para irnos a la terminal y ejecutar el comando para subir el archivo que queremos convertir en un NFT, en este ejemplo subiremos una imagen con nombre: first-tree-to-capture-my-attention.jpg, el comando a ejecutar es el siguiente:

curl "<https://ipfs.blockfrost.io/api/v0/ipfs/add>" -X POST -H "project_id: ipfsCOmYgV91I0qYlY1CNykUVMlBtq7zq3Z5" -F "file=@./first-tree-to-capture-my-attention.jpg"

Luego de ejecutar este comando vamos a obtener la siguiente salida:

{"name":"first-tree-to-capture-my-attention-low.jpg","ipfs_hash":"QmP7n8STyM2sxCph8JKrC6swg3ZuKeXvcrTUjW6QVqx4fz","size":"3807480"}

En este punto es importante que mantengamos anotado el hash del archivo. Para el caso actual lo voy a mantener anotado de la siguiente forma:

ipfs-hash: QmTn3rp4T9pXAmEp9WavuFiThWE4UPzSB5VwR4LvB3VWtL

Una parte importante del proceso de almacenar el archivo es asegurarnos que no va a ser borrado, para esto lo que debemos es decirle al IPFS que el archivo nunca sea removido, para esto tenemos el comando pin (si quieres saber más del tema puedes seguir leyendo aqui). Para ejecutarlo sobre nuestro archivo ejecutamos el siguiente comando:

curl "<https://ipfs.blockfrost.io/api/v0/ipfs/pin/add/QmP7n8STyM2sxCph8JKrC6swg3ZuKeXvcrTUjW6QVqx4fz>" -X POST -H "project_id: ipfsCOmYgV91I0qYlY1CNykUVMlBtq7zq3Z5"

Para visualizar la imagen que acabamos de subir podemos usar un link con el siguiente formato:

https://infura-ipfs.io/ipfs/QmP7n8STyM2sxCph8JKrC6swg3ZuKeXvcrTUjW6QVqx4fz

Nodo de Cardano y CLI

Para la creación de un NFT usando el CLI vamos a tener que tener instalado en nuestro computador un nodo de Cardano que tiene contenido el CLI. Con la idea de hacer el proceso más sencillo vamos a seguir el proceso de usar el nodo que se instala cuando tenemos el nodo que viene con la cartera Daedalus.

En este manual no se incluye el proceso de instalacion de la cartera Daedalus, lo puedes ver aqui.

Uso del Cardano CLI instalado con la cartera Daedalus.

Lo primero que tenemos que hacer es conseguir el directorio donde está instalado Daedalus, en mi caso se instaló en el siguiente directorio:

C:\\Program Files\\Daedalus Mainnet

Lo segundo que debemos realizar es conseguir donde se está corriendo el nodo de cardano.

Usamos el siguiente comando para generar un archivo con la última lista de comandos ejecutados en el sistema operativo para conseguir donde se está ejecutando el nodo de cardano que utiliza la instancia de Daedalus:

wmic process get name, commandline > procs.txt

Dentro del archivo generado buscamos el siguiente texto: “-socket-path” y copiamos el valor que se le esta pasando, en mi caso el valor es el siguiente:

\\\\.\\pipe\\cardano-node-mainnet.29784.1

En este momento ya tenemos toda la información necesaria para configurar las variables de entorno necesarias para poder utilizar el CLI de cardano. Procedemos a seguir los siguientes pasos:

Creamos una nueva variable con el nombre de CARDANO_NODE_SOCKET_PATH y el valor que conseguimos anteriormente del — socket-path

Luego procedemos a editar la variable Path para agregar el directorio de donde se encuentra instalado la cartera Daedalus:

Al tener todo esto configurado el siguiente paso es seguir es reiniciar todas las ventanas del Command Prompt para asegurarnos que tome los cambios.

Al iniciar nuevamente el Command Pront procedemos a probar si podemos usar el nodo de Cardano.

Ejecutamos el siguiente comando:

cardano-cli query tip --mainnet

Deberíamos obtener una salida como la siguiente:

Es importante que si por alguna razón cerraste o reiniciaste el nodo de Cardano debes actualizar el valor del — socket-path en las variables de entorno. Cada vez que cierres la cartera Daedalus el nodo de Cardano se reinicia.

Creación de una dirección de Cardano

El siguiente proceso nos va a ayudar a generar un par de llaves, una llave que se utiliza para verificación y otra que se utiliza para firmar transacciones. Para esto utilizaremos nuevamente la herramienta de comando de Cardano, la siguiente línea nos permite generar la enterprise.vkey y la enterprise.skey

cardano-cli address key-gen --normal-key --verification-key-file enterprise.vkey --signing-key-file enterprise.skey

En la siguiente imagen puedes ver los dos archivos conteniendo las llaves que puedes ver en mi sistema de archivos:

Luego de tener las llaves debemos conocer que una dirección en Cardano se deriva de la llave de verificación, por lo que procedemos a generar nuestra dirección para enviar ADA, para esto usamos el siguiente comando:

cardano-cli address build --payment-verification-key-file enterprise.vkey --mainnet

Al ejecutar el comando creamos la siguiente dirección:

addr1v8ngtvgnty3xm8uh8c0cs8vmr4n3m006u2tss345x6gh39g5ksl56

Para verificar el saldo de nuestra dirección podemos usar el siguiente comando:

cardano-cli query utxo --address addr1v8ngtvgnty3xm8uh8c0cs8vmr4n3m006u2tss345x6gh39g5ksl56 --mainnet

En la dirección creada le envíe 2 ADA, como podemos confirmar con la siguiente imagen:

Creación de la política del proceso de acuñar(minting) el NFT

En esta sección estaremos creando un script para definir la política con la cual vamos a poder construir la transacción que permite acuñar el NFT, lo importante de entender es que existe dos elementos uno es el propio script(Archivo JSON) que contiene el set de reglas para poder crear el NFT, y a partir de este podremos crear el ID de la política. El proceso lo empezaremos desde la creación de las llaves para firmar y validar la política.

Creación de las llaves para autorizar y validar la creación de tokens

Con el siguiente comando podemos crear el par de llaves que usaremos en el proceso de creación de política y de firmar la transacción.

cardano-cli address key-gen --verification-key-file policy.vkey --signing-key-file policy.skey

Necesitamos hacer un hash de la llave de verificación, esto lo vamos a incluir en la política para que la red pueda verificar que esta es la única llave que puede encunar o quemar tokens.

cardano-cli address key-hash --payment-verification-key-file policy.vkey

Al correr este comando vamos a obtener una salida como esta:

La hash de nuestra llave es:

ad864a554c3deab884325b576e4099b3dac021118806faa532bdc399

Archivo de la política

Al crear el script que contiene la política los puntos que debemos considerar es colocar el hash de la llave para firmar que generamos en los pasos anteriores, y definir que política usaremos, en la mayoría de la documentación conseguí los siguientes:

  • Política de emisor único (Single-issuer policy): esta política especifica que solo la entidad o persona que posee un par de llaves puede generar tokens. Esto se debe principalmente porque la transacción debe ser firmada por la llave privada del emisor.
  • Política de acuñación de tiempo bloqueado (Time-locked minting policy): este un elemento adicional que se puede agregar a la política que especifica cuando se puede crear los tokens. En la política se especifica si se debe crear antes o después de un slot en el futuro.

Nota: es importante destacar que existen otros tipos de política, y con la introducción de contratos inteligentes se pueden crear algoritmos más complejos.

Para nuestro ejemplo vamos a usar “before”. Y para esto necesitamos determinar a partir de cuál slot no se va a poder generar otro NFT como el que estamos creando. Para esto vamos a hacer un query a la red.

cardano-cli query tip --mainnet

Con la salida que conseguimos podemos determinar que el slot actual es él: “42915619”, para que nos dé suficiente tiempo usaremos en nuestro script el siguiente número: “42995619”. Esto nos debería dar suficiente tiempo si no conseguimos ningún problema. En caso de que no logremos generarlo a tiempo vamos a tener que crear el script nuevamente.

Después de estas consideraciones el script debería quedar de la siguiente forma:

{  "type": "all",  "scripts": [    {      "keyHash": "ad864a554c3deab884325b576e4099b3dac021118806faa532bdc399",      "type": "sig"    },    {      "type": "before",      "slot": 43191595    }  ]}

Nota: si requieres más detalles de este archivo puede leer la documentación oficial de Cardano: Leer la sección que se llama Policy examples and ways to define policies.

Con esta información creamos un archivo con este contenido en nuestro sistema de archivos.

El siguiente paso seria generar nuestro policy id con el script que hemos generado. Para esto corremos la siguiente comando:

cardano-cli transaction policyid --script-file policy.script > policy.id

Al correr la transacción estaremos guardando en un archivo el policy id. En nuestro caso se generó el siguiente policy id:

4cb384d5a5924c5bc59d0a59c66dfdf82fcea265bc0aa1c9f6c15756

Creación de la Metadata del NFT

La forma que tiene Cardano de hacer un vínculo entre una metadata y el token es agregando esa metadata en la transacción que crea el token. Para lograr esto debemos definir que metadata queremos utilizar, en este caso como el NFT que estoy creando es una imagen vamos a utilizar el estándar definido por el equipo pool.pm. La fuente de donde saque el standard la puedes ver aquí. El JSON me quedaría de la siguiente forma:

{    "721": {        "4cb384d5a5924c5bc59d0a59c66dfdf82fcea265bc0aa1c9f6c15756": {            "tree001": {                "name": "tree #1",                "image": "ipfs://QmP7n8STyM2sxCph8JKrC6swg3ZuKeXvcrTUjW6QVqx4fz"            }        }    }}

En este JSON los parámetros importantes son:

  • El ID de la política: id único que se utiliza para identificar que la creación del NFT viene de la fuente correcta.
  • El nombre del asset: nombre del token, en este caso debe ser un nombre continuo como un key en el formato JSON.
  • Nombre del objeto: Este es el nombre, pero puedes usar cualquier formato.
  • El URL de la imagen: en este caso utilizaríamos el URL de la imagen que cargamos en el IPFS: https://ipfs.io/ipfs/QmTn3rp4T9pXAmEp9WavuFiThWE4UPzSB5VwR4LvB3VWtL

Para seguir desde este punto vamos a tener que tener la capacidad de poder pagar la tarifa de poder realizar transacciones en la red de Cardano, para esto debemos tener una dirección con los fondos suficientes y la llave que nos permita firmar transacciones para enviar dinero. Si ya en este punto tienes esto a la mano, no necesitar realizar los siguientes pasos en los cuales crearemos todo lo necesario para poder realizar la transacción de acunar el token.

Creación de la transacción para crear el NFT

Lo primero que necesitamos es ejecutar un query para obtener los parámetros de la red Cardano que luego nos servirá para determinar el costo de los pagos por transacción de la red.

cardano-cli  query protocol-parameters --mainnet --out-file protocol.json

Al ejecutar el comando de arriba podremos obtener el JSON que contiene la información que en los siguientes pasos utilizaremos para calcular los datos que necesitamos para la transacción.

En este punto consultamos el balance en nuestra cuenta, y él los datos de la transacción que necesitamos como input para la transacción que de creación del NFT.

De la siguiente imagen podemos conseguir lo siguiente:

Balance: 2000000 lovelance

tx-in: 10d6868fd6114c50290fd038eae723589411f61131e5e5def6f1b6ae87467d5c#0

Con toda esta información ya podemos proceder a crear una transacción para poder calcular el pago de comisión de la red. Para lograr esto debemos ejecutar el siguiente comando:

cardano-cli transaction build-raw --fee 0 --tx-in 10d6868fd6114c50290fd038eae723589411f61131e5e5def6f1b6ae87467d5c#0 --tx-out addr1v8ngtvgnty3xm8uh8c0cs8vmr4n3m006u2tss345x6gh39g5ksl56+2000000+"1 4cb384d5a5924c5bc59d0a59c66dfdf82fcea265bc0aa1c9f6c15756.tree001" --mint="1 4cb384d5a5924c5bc59d0a59c66dfdf82fcea265bc0aa1c9f6c15756.tree001" --minting-script-file policy.script --metadata-json-file nftmeta.json --invalid-hereafter=43191595 --out-file matx.raw

Con la creación de esta transacción podemos entonces calcular cuanto va a ser el coste mínimo de la transacción usando el siguiente comando:

cardano-cli transaction calculate-min-fee --tx-body-file matx.raw --tx-in-count 1 --tx-out-count 1 --witness-count 2 --mainnet --protocol-params-file protocol.json

En la siguiente imagen podemos ver el costo mínimo de la transacción:

Con esto podemos calcular cuantos es el retorno o cambio de la transacción:

Min fee: 189745

Cambio: 2000000–189745= 1810255

Con el costo de la comisión y el cambio podemos construir la transacción con los valores finales:

cardano-cli transaction build-raw --fee 189745 --tx-in 10d6868fd6114c50290fd038eae723589411f61131e5e5def6f1b6ae87467d5c#0 --tx-out addr1v8ngtvgnty3xm8uh8c0cs8vmr4n3m006u2tss345x6gh39g5ksl56+1810255+"1 4cb384d5a5924c5bc59d0a59c66dfdf82fcea265bc0aa1c9f6c15756.tree001" --mint="1 4cb384d5a5924c5bc59d0a59c66dfdf82fcea265bc0aa1c9f6c15756.tree001" --minting-script-file policy.script --metadata-json-file nftmeta.json --invalid-hereafter=43191595 --out-file matxvalid.raw

Luego de construida la firmamos con nuestra llave de pago:

ardano-cli transaction sign --signing-key-file enterprise.skey --signing-key-file policy.skey --mainnet --tx-body-file matxvalid.raw --out-file matx.signed

Con la transacción firmada procedemos a enviarla:

cardano-cli transaction submit --tx-file  matx.signed --mainnet

Luego de enviada la trasaccion debemos recibir un mensaje de que fue enviada exitosamente:

En este punto ya solo debemos esperar que la red Cardano procese la transacción, en el momento que la transacción sea procesada podremos ver nuestro NFT en https://pool.pm/tokens

Notas y Conclusiones

Los NFTs pueden ser usando es una gran cantidad de Casos de Uso, actualmente estamos viendo como hay una explosión en el mundo artístico, donde todo tipo de diseñadores se han volcado a sacar sus proyectos usando la tecnología. Personalmente pienso que esta tecnología se va a usar para una extensa variedad de Casos de Uso en todas las industrias. Esto me lleva a pensar que la cantidad de oportunidades y servicios a ofrecer usando este tipo de innovación basada en blockchain le abre las puertas a las industrias para reinventarse.

Cardano tiene todo el potencial de convertirse en una de la plataforma líderes para la creación de NFTs, Tokens y contratos inteligentes en el corto y mediano plazo.

Por mi parte seguiré profundizando en Cardano y ver que tipo de aplicación se pueden ir descubriendo.

Contacto

Si estás interesado en contactarme para discutir servicios para llevar a cabo tu proyecto usando Cardano me puedes contactar usando nuestra página de contacto.

Leave your thought here

Your email address will not be published. Required fields are marked *

Get Our Newsletter