Cómo crear un proyecto NFT desde cero y publicarlo en OpenSea

17/02/2022

Aprenderás a generar una colección de NFTs de terrenos y lotes, desarrollaremos los contratos para desplegarlos y verlos a la venta en OpenSea.

En un proyecto Blockchain existe un punto fundamental y es el desarrollo de lo que respecta a contratos inteligentes que reflejen la lógica de negocios. En este caso en particular, vamos a hablar del desarrollo de contratos inteligentes de tokens no fungibles y su despliegue en alguna blockchain en particular.

El año pasado hemos escuchado por todos lados hablar de los NFTs, pero ¿qué es un NFT? Un NFT es un token no fungible. No fungible significa que no se puede subdividir ni reemplazar por otro.

También se encuentran los tokens fungibles, estos pueden ser sustituidos por otro igual mientras el valor que representan sean el mismo. En el caso de los NFTs, esto no sucede: nos interesa uno en particular y no existe otro token que pueda reemplazarlo y tener el mismo significado para nosotros.

Supongamos el siguiente escenario: queremos lanzar a la venta una colección de NFTs que representen algún activo de nuestro interés, particularmente, lotes o terrenos en alguna plataforma que estemos desarrollando. Claramente atravesaremos, el proceso de desarrollo de un FrontEnd que nos deje conformes, algunos microservicios de BackEnd necesarios para otorgar cierta información, pero también debemos definir y desplegar contratos inteligentes que representen nuestra lógica de negocios

Es por ello que para este artículo, trataremos de dilucidar cómo generar una colección de NFTs de terrenos para vender al usuario.

Primero definimos los tipos de tokens no fungibles que vamos a lanzar. En este caso, desplegaremos un NFT que represente las tierras a vender y otro NFT que sea un cofre o “lootbox” que, al abrirlo, nos permita acceder a nuevos terrenos.

Debemos tener en cuenta que:  

Para desarrollar contratos inteligentes, no solo de NFTs sino para cualquier otro contrato, es necesario conocer acerca de ciertos patrones que sirven como estándares de desarrollo en base al tipo de contrato que se desea desarrollar y lanzar a una Blockchain.
El patrón más utilizado en el desarrollo de tokens fungibles es el ERC20, una estructura pensada para facilitar la implementación de diversas funcionalidades sobre la blockchain de Ethereum y de esa manera, facilitar el trabajo de creación a los desarrolladores.
Sin embargo, en el caso de los tokens no fungibles (NFT) los patrones a utilizar son los estándares ERC 721 y ERC 1155, definidos por una organización dedicada a la generación y propagación de estos mecanismos llamada “OpenZeppelin”. Una descripción breve de estos es:

  • ERC 721: Básicamente, cada token ERC 721 es único y representa un solo activo. Además, permite a los desarrolladores crear un nuevo ecosistema de tokens en la cadena de bloques Ethereum. El patrón tiene como objetivo crear tokens intercambiables. Un ejemplo de contrato ERC 721 es el de OpenZeppelin, que permite a los desarrolladores rastrear elementos en sus juegos.
  • ERC 1155: Cuando una persona utiliza un estándar ERC 1155 para codificar su contrato, no está considerando a su token como un activo 100% no fungible sino que trabaja con una combinación entre la existencia o no de esa fungibilidad. En un único contrato ERC 1155, un desarrollador puede definir un token no fungible como un fungible. Además, utiliza mecanismos que permiten ahorrar GAS en cada operación de “mint” o acuñación de una nueva unidad como así también de un lote de unidades.

La mayoría de los contratos NFT utilizan el estándar ERC 721 pero existe una creciente intención de utilizar ERC 1155 para los contratos. Debido a que nuestro proyecto exige que cada terreno sea una unidad de interés identificable y única para el comprador, utilizaremos el estándar ERC 721 para este propósito, considerando que utilizar una estrategia ERC 1155 sería desaprovechar las características adicionales de este último.

Como última consideración para nuestro proyecto, deseamos que una vez desplegados los contratos, estos se encuentren disponibles para su adquisición en el marketplace de OpenSea. Esta plataforma líder en el intercambio de tokens no fungibles, nos permitirá observar las características de los mismos e incluso adquirirlos mediante un intercambio de criptoactivos.

OpenSea posee un repositorio en donde un desarrollador puede acceder a un proyecto modelo tanto de ERC 721 como de ERC 1155. Haremos uso de estas facilidades para acelerar el proceso de desarrollo pero sin perder de vista el detalle de su implementación. 

    ¡Comencemos entonces con el desarrollo!

    Lo primero que haremos es clonar el repositorio de OpenSea en nuestro directorio preferido. Para ello utilizaremos la herramienta de control de versiones Git y ejecutamos:

    git clone https://github.com/ProjectOpenSea/opensea-creatures.git

    El siguiente paso sería obtener todos los paquetes necesarios del repositorio. Para ello, ejecutamos yarn. En caso de no tener instalado yarn, ejecutamos:

    npm install -g yarn

    Luego:

    yarn

    Una vez que tengamos el repositorio descargado y los paquetes disponibles, observamos su estructura. El repositorio cuenta con los siguientes archivos y directorios:

    • contracts: directorio que contiene los smart contracts del proyecto. Es aquí donde trabajaremos la lógica de negocios del proyecto e intentaremos reflejar en contratos ERC 721.
    • migrations: contiene scripts para las migraciones propias de un proyecto Truffle. Su ejecución equivale a desplegar uno o más contratos en la Blockchain elegida.
    • test: el código que se genere en esta carpeta será ejecutado como prueba de los contratos que realicemos.
    • scripts: directorio que contiene otros scripts de interés para el proyecto.
    • .env: archivo de entorno del proyecto donde podremos definir variables de entorno globales para ser consultadas por el proyecto.

    Si consultamos el directorio “contracts”, observamos que OpenSea plantea el ejemplo de desarrollo de criaturas para el estándar ERC 721 y criaturas con características más desarrolladas para el formato ERC 1155. Debido a la naturaleza de nuestro proyecto, tomaremos como referencia los primeros y comenzamos a analizar su composición.

    Esta es la codificación del contrato “Land.sol” que representa la existencia de un NFT llamado “Land” el cual refleja un terreno o lote. Observamos que hereda las características de un contrato ERC 721 “Tradable”. Este estándar creado por OpenSea asume que nuestro token no fungible tiene las características de un activo a poder intercambiar con otro usuario de la red como resultado de una negociación. Sin embargo, observaremos luego que el valor monetario que un NFT posee no es configurado en el contrato sino que es manejado de forma “Off Chain” (por fuera de la Blockchain) por OpenSea y su plataforma. Por ello, no debemos preocuparnos por definir ningún monto en este punto.

    El contrato define parámetros en su constructor que tienen que ver con su nombre, iniciales y una dirección requerida por OpenSea para desplegar el contrato llamada “proxyRegistryAddress”.

    Otra característica fundamental, no solo de este contrato sino de cualquier NFT, es la existencia de un tokenURI. Este elemento nos permite acceder a las características del NFT y consultarla generalmente, en forma de un JSON. Al consultar este JSON, observaremos todos los atributos de ese activo y es la información de la que se vale la plataforma de OpenSea para mostrar las caracteristicas del NFT desplegado.

    Por ejemplo, en el caso de nuestro NFT Land, podríamos referenciar mediante el tokenURI características propias del lote como su ID, características del suelo, una imagen asociada, entre otras.

    No es materia de este artículo desarrollar un BackEnd al que se pueda acceder para consultar esta información pero, para nuestro propósito actual, utilizamos el sistema de archivos interplanetario (IPFS) para almacenar el JSON correspondiente y poder apuntarlo desde el código.

    Otro NFT de interés para este proyecto es un cofre que permita al comprador, en determinado momento, abrirlo y acuñar nuevos terrenos o lotes. Este contrato se llama “LandLootBox.sol” y presenta las siguientes características:

    Como vemos, es un contrato ERC 721 Tradable al igual que “Land” pero posee ciertas características particulares: un número de tierras que contiene el cofre, un método para “desempaquetar” el cofre y liberar nuevas unidades de Land y la necesidad de destruir la unidad cofre una vez que es abierto por el dueño. Luego, posee un tokenURI al igual que cualquier otro NFT y métodos de consulta.

    Una vez que definimos los NFT Land y LandLootBox, sus atributos generales y sus tokenURI, depositamos nuestra atención en el desarrollo de un contrato “Factory”. Un contrato de este tipo nos sirve para ejecutar operaciones de generación de unidades del NFT a partir de ciertas opciones predefinidas.

    Por ejemplo, podemos desear que un usuario acceda a una cantidad predefinida de lotes en una sola compra o acceder a un cofre que luego pueda “desempaquetar” para acceder a sus NFTs. Para poder hacer esto, es necesario desarrollar un contrato “Factory” que se encargue de lidiar con estas opciones. El contrato “LandFactory.sol” nos permite manejar tres opciones de generación de un nuevo NFT:

    1. El comprador desea un único terreno o lote.
    2. El comprador desea acceder a cuatro lotes.
    3. El comprador desea acceder a un cofre y al abrirlo en un futuro, acceder a tres lotes nuevos.

    El contrato Factory no solo permite realizar un “mint” de cada una de estas tres opciones sino que, en el caso particular de nuestro proyecto, gestiona los tokenURI asociados a cada opción de manera particular. Se mantienen ciertos métodos y estructuras del contrato Factory original de OpenSea que le permiten a la plataforma gestionar sus operaciones.

    En este punto, tenemos desarrollados todos los contratos necesarios para gestionar esta venta de NFTs en OpenSea. Cabe destacar que existen otros contratos base en el repositorio pero no son abordados en este artículo ya que son heredados del proyecto base de OpenSea y no presentan modificaciones.

    El siguiente paso es ejecutar las migraciones del proyecto y desplegar nuestros contratos en una red de prueba como Rinkeby. Esta red es una de las múltiples blockchains de prueba de Ethereum en donde un desarrollador puede publicar sus contratos antes de lanzarlos a la red principal. Hay que asegurarse de tener fondos en la red de prueba Rinkeby, utilizando un “Faucet” o generador de fondos como el que encontramos aquí es posible solucionar este problema.

    Dentro del proyecto, generamos un archivo de variables de entorno llamado “.env” y añadimos ciertos parámetros para poder desplegar nuestros contratos:

    • INFURA_KEY / ALCHEMY_KEY: Este parámetro representa nuestra key de Infura o Alchemy. Para obtenerla, nos creamos una cuenta en alguna de estas dos plataformas, creamos un nuevo proyecto y copiamos la “kye” del proyecto para colocarla en el archivo .env. Si deseamos usar Alchemy, modificar el nombre de la variable por ALCHEMY_KEY.
    • MNEMONIC: Representa la frase de seguridad de nuestra wallet Metamask. Para conocer esta frase, debemos tener creada una wallet en Metamask y acceder a la frase de seguridad en la configuración de la misma.
    • OWNER_ADDRESS: Dirección de nuestra wallet Metamask con la cual realizaremos el deploy de los contratos.
    • NFT_CONTRACT_ADDRESS y FACTORY_CONTRACT_ADDRESS: Representan las direcciones de los contratos luego de que los hayamos desplegado. Una vez que ejecutemos las migraciones, deberemos completar estos campos con las direcciones obtenidas en el deploy.
    • DEPLOY_LANDS_SALE: Su valor es 0 debido a que, de esta forma, el proyecto OpenSea interpreta que estamos en presencia de contratos ERC 721 simples y no deseamos añadir caracteristicas adicionales.
    • NETWORK: Define la red en la que desplegamos los contratos.

    Una vez definidos estos parámetros, ejecutamos:

    yarn truffle deploy — network rinkeby

    Observamos que al finalizar este proceso, todos los contratos fueron desplegados en la red de Rinkeby y las direcciones correspondientes.

    Ahora es momento de observar nuestros artículos a la venta en OpenSea, quien automáticamente percibe el despliegue de un nuevo contrato ERC 721 y lo muestra en su plataforma. Para ello, accedemos a la plataforma de prueba de OpenSea (debido a que desplegamos nuestros contratos en Rinkeby) y accediendo con la misma wallet que usamos para el deploy observamos:

    Las tres opciones que nuestro contrato Factory ofrece (venta de una única unidad, de cuatro unidades y de un LootBox) son accesibles ahora desde OpenSea.

    Solo debemos acceder a cada una de ellas y estipular un valor de venta de cada opción. ¿Recuerdan que hablamos de que el valor monetario real de cada opción no era algo a definir en los contratos sino como algo “Off Chain” en OpenSea? Bueno, este es el momento de hacerlo. Accediendo a la opción “Sell” del artículo, podemos definir el valor del mismo y ahora podrá ser comprado por otros usuarios de la plataforma. También podemos observar las caracteristicas de cada artículo gracias al JSON al que apunta el tokenURI correspondiente a cada activo y que definimos en los contratos.

    ¡Hemos creado un proyecto NFT desde cero y estamos listos para venderlo a través de OpenSea!

    ▶ El ecosistema tecnológico crece cuando compartimos. 💻Visitá el repositorio público de este proyecto.

    Escrito por: Joaquin Perea (Blockchain Developer en IEKO)

     

     

     

    Somos IEKO