Creando NFTs desde JavaScript con CryptoLions SimpleAssets contract

Marcos DK
eosbarcelona
Published in
5 min readAug 6, 2020

En la entrega anterior vimos cómo acceder a los métodos del contract SimpleAssets de CryptoLions. En esta ocasión vamos a dar un paso más allá y vamos a comenzar a acceder a los métodos que nos permitirán añadir y modificar información en la blockchain en forma de tokens; en este ejercicio, concretamente, tokens NFT.

SimpleAssets contract: Action “create”

Si vamos a dedicarnos en serio a la creación de tokens, ya sean NFT, FT o NTT, conviene que nos registremos como autores que, si bien no es necesario, puede ayudarnos a la hora de aparecer en los listados de los markets.

Desde el explorador de bloques https://wax.bloks.io el interfaz para crear un token NFT (Cuenta “simpleassets, </>contract, Actions, create), se nos muestra tal que así:

  • author: Nombre de la cuenta que va a crear el token.
  • category: Categoría que asignamos al token. Ayuda a indexar los tokens en los markets (en minúsculas).
  • owner: Cuenta que recibirá el token creado
  • idata: Datos inmutables; no cambiarán.
  • mdata: Datos que pueden modificarse aún cuando el token esté en posesión de terceros.
  • requireclaim: Si el token se entregará a owner directamente o si este tendrá que reclamarlo.

Tanto idata como mdata son campos que contienen una lista de elementos en formato JSON. Un ejemplo de contenido de estos campos podría ser

{“name”:”Mi primer NFT”,“img”:”https://servidor.net/foto.jpg”}

Creación de NFT desde JavaScript

El código del ejercicio puede descargarse desde Github: https://github.com/3dkrender/simpleassets_nivel01

Para el ejercicio del artículo anterior solo necesitamos acceder a la blockchain para leer información pero, en este caso, vamos a escribir datos en la cadena, por lo que deberemos crear un canal de comunicación con la misma.

No toda la información suministrada en el ejemplo es necesaria para crear el canal pero he añadido ‘dotenv’ para poder gestionar las claves de nuestras cuentas de una manera más privada. Esta es una librería que nos permite crear variables de entorno a las que podremos acceder después desde nuestro código de forma segura y privada.

signatureProvider contiene el proveedor autorizado para firmar las transacciones. Este método requiere una o varias claves en un array (normalmente las claves “active”). Podríamos crear el proveedor de la siguiente manera:

const signatureProvider = new JsSignatureProvider(['5j***************']);

Siendo ‘5j***********’ la clave activa que utilizaremos para firmar las transacciones. Para tener un código más limpio y “privado” he creado un archivo llamado .env.keys (atención al primer punto) con el siguiente contenido (sustituir por la clave auténtica):

privateKey = '5K***********************'

Gracias a la instrucción:

require('dotenv').config({ path: './.env.keys' });

podemos acceder a las variables definidas en el archivo y no tener que escribir directamente las claves en el código fuente principal.

Necesitamos un canal de comunicación con la blockchain por lo que, de nuevo, volveremos a escoger el servidor de WaxSweden para ello. Pero , además, en esta ocasión vamos a conectarnos a su API para poder hacer uso de sus funciones a través de llamadas RPC.

El primer método de la API que vamos a utilizar es el método “api.transact” (más información aquí: https://github.com/EOSIO/eosjs)

En la primera parte de la acción especificamos el nombre del contract que vamos a utilizar (simpleassets), la acción del contract (create) y la autorización necesaria para ejecutar la acción (nombre de cuenta y tipo de clave para firmar).

En segundo lugar, en el objeto “data” incluimos toda la información del token que vamos a crear.

En el código de ejemplo, autor es una variable local que contiene el nombre de la cuenta que generará el NFT.

Para crear los datos JSON de los campos idata y mdata podemos emplear la función de JavaScript JSON.stringify, lo cual nos facilita mucho las cosas a la hora de tener un código limpio y amigable.

La información para crear el token solo es un ejemplo. Por supuesto, el lector puede probar a crear sus propios campos de datos en el apartado general del token, en mdata y en idata.

Es importante que la imagen principal del token, aquella que se mostrará en los exploradores de bloques y en los markets, se incluya en un campo llamado “img”, que puede estar tanto en mdata como en idata. De igual modo, el nombre del token está contenido en un campo llamado “name”. Esta nomenclatura está aceptada por casi todos los markets y ayudará a un correcto listado y visualización del token.

Como nos pasó en el ejemplo del último artículo, debido al sistema asíncrono de JavaScript es conveniente utilizar promesas o algún sistema similar para esperar por el resultado.

El propio método api.transact utiliza promesas, por lo que podemos aprovechar para recoger el resultado tanto en caso de éxito como de fracaso en la operación.

A excepción del autor, en este ejercicio todos los datos del NFT están contenidos dentro de la propia llamada para su creación pero podemos utilizar variables para reaprovechar el método y crear tokens variados a través de los parámetros de llamada a la función.

Desde nuestro archivo principal index.js llamaremos a la función de la siguiente manera:

donde <nombre-de-usuario> será la cuenta WAX del autor y cuya clave activa está en el archivo .env.keys

Si todo ha salido bien, podremos ver el resultado de console.log(resolve) muy similar a esto:

y en el market de SimpleMarket también podremos ver nuestro nuevo token:

Eliminar un token NFT

Si solo estamos haciendo pruebas o si nos hemos confundido en algún punto, podemos eliminar el token que hemos creado. Para eso utilizaremos la acción ‘burn’ del contract simpleassets. Muy importante que nos fijemos en el ID de nuestro token ya que lo vamos a necesitar para borrarlo (quemarlo),

Hemos definido la función burnNFT que recibirá 3 parámetros:

  • owner: Propietario actual del token (puede ser una cuenta diferente al autor).
  • nfts: Array con los IDs numéricos de todos los tokens que queremos eliminar (quemar). Si solo queremos borrar un token, será un array de un elemento.
  • memo: Texto del memo de la transacción.

La primera parte de los datos de la transacción es practicamente igual que para crear el token. En lugar de llamar a la action “create”, llamaremos a la action “burn”.

La segunda parte, la que se refiere a la información del token o los tokens a borrar, es bastante sencilla de entender: propietario actual, array de IDs y memo.

La función para borrar el token desde el archivo index.js sería:

El proceso de quemado de un token puede requerir de un poco de tiempo, quizás un par de minutos, antes de que podamos comprobar en un explorador o en el market que el token ha sido realmente eliminado.

--

--

Marcos DK
eosbarcelona

Programador y creador de contenidos digitales. Profesor de informática, game dev y líder de 3DK Render, WAX Guild.