Usualmente escribo mucho código para mis artículos o incluso presentaciones en vivo (algo que se conoce como livecoding), sin embargo, pensé que para esta oportunidad es preferible concentrarse más en los conceptos que en los detalles técnicos. De igual manera, los lectores más exigentes podrán encontrar líneas de código para replicar resultados que presento en este ensayo.
Mi objetivo es poder comunicar nuevas ideas a personas que no están muy familiarizadas con las tecnologías descentralizadas, en particular, con los NFTs.
La definición formal de un NFT es Non-Fungible-Token. Esto tal vez no signifique mucho ahora pero exploraremos estos términos, así como ideas y tecnologías asociadas, y espero que al final de este artículo haya logrado comunicar los conceptos principales.
Hablemos sobre algo diferente: los idiomas. ¿Quién es dueño de un idioma? ¿Quién está encargado de desarrollar un idioma? A pesar de que existen algunas instituciones "oficiales" detrás de las reglas de un idioma, lo que ocurre en la práctica es que la comunidad de quienes lo usan es la que le da forma al idioma. Podríamos decir que la comunidad es dueña del idioma de una manera descentralizada porque todos aprendemos un idioma de manera independiente y, cuando un usuario muere, el idioma sigue vivo y es replicado por el resto de usuarios. Estos últimos son los que naturalmente construyen nuevas palabras, significados y memes (en su definición más amplia) que afectan cómo nos comunicamos y el valor que le damos a las palabras y signos.
Algo muy similar ocurre con las tecnologías descentralizadas como el blockchain, la cual es la arquitectura detrás de las criptomonedas y los NFTs. En general, el fundamento filosófico de estas tecnologías es que no haya una entidad central controlándola. Para los idiomas existe una red descentralizada de usuarios que los utilizan como método de comunicación. En un blockchain existe una red descentralizada de computadoras comunicándose entre ellas. Estas computadoras le pertenecen a personas, a cualquiera que desee volverse parte de la red, de la misma forma que una persona decide aprender un nuevo idioma para formar parte de la comunidad de usuarios de ese mecanismo de comunicación.
¿Qué Información Comunican las Computadoras en un Blockchain?
Las computadoras en un blockchain comunican pedazos de data estructurada; información que nosotros como humanos le asignamos un valor.
Por ejemplo, esto es un pedazo de información de Bitcoin¹ (un bloque de Bitcoin):
Esto básicamente contiene información sobre algunos bitcoins en la red, como las condiciones para hacer uso de ellos (esto se puede interpretar como quién es dueño de los bitcoins). Esta información vive en todas las computadoras que forman parte de la red de Bitcoin. Si alguna de estas computadoras se daña, la red prácticamente no se ve afectada porque existen miles de otras máquinas conectadas a la red que contienen la misma información.
Tokens y la Abstracción del Valor
Bitcoin es solo un programa que tiene fundamentalmente un único propósito; transferir valor en el espacio y tiempo. Esto lo logra mediante el registro histórico de los dueños de los bitcoins en la red² y compartiendo este registro con todas las computadoras conectadas. Su propósito está tan bien definido que el programa de Bitcoin tiene muchas limitaciones³ como parte del diseño original ya que no necesita hacer más. Un programa, mientras más funcionalidades tiene, está más sujeto a errores y vulnerabilidades.
Quiero resaltar que, aunque bitcoin muchas veces es descrito como una "moneda digital" (lo cual es cierto basado en la explicación previa), las monedas fíat son también, en su mayoría, digitales. Solo un bajo porcentaje de las monedas existen en estado físico.
En el 2013 (4 años después de iniciarse la red de Bitcoin) otro blockchain fue creado con la intención de extender las capacidades de comunicación y representación de valor. Esto fue el blockchain de Ethereum. Lo que hicieron fue expandir la capacidad de computación del blockchain a un propósito general. Introdujeron el concepto de smart contracts que son programas que pueden básicamente hacer lo que sea si tienen el código apropiado. Todos estos programas se ejecutan en las computadoras que forman parte de la red de Ethereum.
Con esto vino la idea de los tokens. Así como las criptomonedas al estilo de bitcoin representan valor, los tokens también representan valor pero en un nivel de abstracción un poco más elevado.
Estos son algunos tokens de la red de Ethereum:
Lo importante es entender que los tokens son solo un tipo particular de smart contract y los smart contracts son solo programas y en general podemos pensar en las criptomonedas como el token nativo de un blockchain.
Existen distintos tipos de tokens diferenciados por la utilidad o el uso que se les puede dar (utility token, security token, asset token, etc). Lo más relevante es que, en principio, los tokens pueden representar cualquier tipo de valor e incluso fracciones del mismo.
Tomemos como ejemplo el token de Golem Network. Golem Network es una red de computación distribuida. Es algo similar a Amazon Web Services (una gran porción del internet depende de AWS como parte de su arquitectura. AWS le da funcionalidad a webs muy sencillas como blogs personales así como a servicios gigantes estilo Netflix, Twitch, entre otros) pero en vez de ser controlada por una sola entidad (Amazon), tiene una naturaleza descentralizada ya que, así como Bitcoin o Ethereum, cualquier persona puede conectar su computadora para volverse parte de la red y contribuir con el poder computacional de su máquina, logrando de esta forma una especie de "crowdsourcing" de poder computacional. De esta manera los integrantes de la red (nodos) pueden monetizar los recursos computacionales extras⁴ de los cuales disponen, así como Airbnb permite monetizar espacios no utilizados de una vivienda.
En el caso de AWS, si un usuario desea utilizar sus servicios de cloud computing, le tiene que pagar a Amazon por el tiempo de computación que utiliza. El modelo de Golem Network es similar, la diferencia es que en vez de pagarle a una entidad central por usar sus servidores, la red conecta al usuario con algún nodo que esté dispuesto a ofertar su poder computacional. De esta forma, las computadoras "negocian" los términos del acuerdo y una vez aceptados, se ejecutan los procesos computacionales y el usuario le paga al proveedor con Golem tokens.
Estos tokens son fungibles, eso significa que todos los tokens de Golem Network son iguales, así como dos billetes de 1 dólar son iguales, equivalentes.
Uno puede tokenizar prácticamente cualquier cosa. Por ejemplo, una arquitecta o un ingeniero podrían tokenizar su trabajo mediante la emisión de tokens que les dé acceso a los propietarios de los mismos a sus servicios de consultoría, diseño, etc. De la misma forma, uno podría tokenizar una vaca creando un "VacaToken" que obtendrá un valor en el mercado. Digamos que 1000 VacaTokens equivalen a una vaca. Alguien que posee 500 tokens no significa que va a poder adquirir media vaca (asumiendo que la vaca tiene que estar viva durante la transacción), pero sí que posee una fracción del valor de una vaca y puede comerciar con esto o completar la cantidad que le falta para adquirir una vaca entera.
En un mundo donde todo está tokenizado, uno podría por ejemplo comprar un pasaje de avión (tokenizado) con tokens que representan vacas. En cierta forma estos tokens actúan como una moneda fungible. Tengamos eso en mente para explorar la idea de tokens no-fungibles.
El Primer NFT
Volvamos al 2014. En esa época, Jennifer y Kevin McCoy eran un par de artistas que unieron fuerzas con el emprendedor Anil Dash con el objetivo de crear algo nuevo (y en un solo día) para la conferencia Seven on Seven en Nueva York, un evento que buscaba conectar artistas con la tecnología.
Ellos tuvieron la idea de desarrollar una manera de certificar la propiedad de una obra digital usando un blockchain (usaron uno llamado NameCoin) y registraron un video que Jennifer produjo. Para finalizar el prototipo, Anil Dash compró ese registro por 4 dólares que llevaba en su bolsillo.
Lo que esencialmente ocurrió aquí es que agregaron al blockchain una representación de la propiedad de la obra digital y luego un humano pagó por ella. Sin embargo, tenían un problema y ese era cómo almacenar el archivo del video mismo. Los blockchains no están diseñados para almacenar tanta data porque tienen limitaciones nativas (como el tamaño de los bloques o las transacciones) y, aunque existen workarounds, resulta muy costoso almacenar mucha data. Es por ello que una buena práctica en el desarrollo en blockchain es minimizar el tamaño de las transacciones.
Para resolver este inconveniente, lo que hicieron fue solo almacenar un link hacia el video. El archivo del video se encontraba en un servidor tradicional (centralizado). Tengamos este detalle en cuenta para profundizar en cómo funcionan los NFTs.
Desarrollando un Estándar
Avancemos al año 2017. En ese entonces, el equipo de Larva Labs desarrolló el proyecto CryptoPunks en el blockchain de Ethereum. Éste consistía de 10mil personajes, llamados CryptoPunks, creados programáticamente y que poseen diferentes atributos como el color de piel, cabello, accesorios, entre otros.
Lo particular de este conjunto de personajes es que cada uno es único. Es decir, a pesar de que algunos personajes comparten ciertos atributos, no existen dos CryptoPunks iguales, es decir, con todos los mismos atributos.
El equipo de Larva Labs pensó en crear un token para cada CryptoPunk, sin embargo, en ese entonces los tokens que se utilizaban en Ethereum eran fungibles. Ellos necesitaban una manera de tokenizar activos únicos, no-fungibles.
Recordemos que un token es un smart contract y un smart contract es un programa. Los tokens fungibles de Ethereum siguen un estándar llamado ERC-20. Este estándar, creado en noviembre del 2015, detalla el diseño mínimo que debe cumplir el código de un smart contract para funcionar como un token fungible.
A pesar de que pueden existir muchas otras formas de escribir un smart contract para que funcione como un token, es importante que se logre un consenso sobre un diseño común de cómo desarrollarlos para que así, las aplicaciones que los utilizan puedan ser más sencillas ya que solo necesitan soportar una forma de código, en contraste con múltiples implementaciones. Este beneficio lo podemos ver en un día común cuando usamos estándares de, por ejemplo, archivos de imágenes como JPEG, GIF, PNG o archivos de música MP3, que son soportados por cualquier computadora o dispositivo móvil.
De vuelta al problema que enfrentaba el equipo de Larva Labs sobre cómo representar un token único, lo que ellos decidieron fue modificar el estándar ERC-20 lo suficiente como para representar un activo no-fungible. Esto inspiró un tiempo después a desarrollar el estándar ERC-721 que contiene funcionalidades para representar apropiadamente tokens no-fungibles.
Existía otro problema (con el cual ya estamos familiarizados) y ese era el almacenar las imágenes. Como ahora sabemos, guardar data en un blockchain es poco eficiente y caro, por lo que Larva Labs siguió un camino similar al del NFT de los McCoy Y Dash. Ellos almacenaron en el blockchain un número que corresponde a la posición de cada Cryptopunk en una imagen compuesta que contiene a todos. ¿Cómo se ve esto? Las operaciones que se ejecutan en el blockchain se llaman transacciones y son identificadas por un número único (un hash). Esta es una de las transacciones que creó 50 de los CryptoPunks:
BlockchainTransactionData["f8d783602dac6c024fa807cd05ff38b8fd96e57804e8fa4cb93ac27c4dfeeb4e","EventList",BlockchainBase->"Ethereum"]
No necesitamos entender todo lo que está sucediendo acá. Basta ver la última columna (Data) y darse cuenta que lo que vemos ahí son números, solo que no están representados como usualmente los utilizamos (base decimal) sino que están en base hexadecimal. Con un simple pedazo de código podemos convertirlos a base decimal y encontramos esto:
FromDigits[#["Data"],16]&/@tx
Estos números corresponden a IDs de los Cryptopunks desde el 3053 hasta el 3102. Las imágenes de los Cryptopunks están almacenadas en servidores centralizados (al mismo estilo que las páginas web tradicionales). Con otro poco de la magia de la programación podemos extraer las imágenes de estos 50 Cryptopunks del servidor que las aloja:
FromDigiImageAssemble[Partition[Import/@(StringJoin[{"https://cryptopunks.app/public/images/cryptopunks/punk",#,".png"}]&/@(ToString/@Range[3053,3102])),10]]
La moraleja de esta historia es que las operaciones que crearon a los Cryptopunks en el blockchain almacenaron solo la metadata correspondiente al ID del Cryptopunk, más no las imágenes mismas que se encuentran almacenadas en un servidor centralizado (fuera del blockchain) y a las cuales hemos podido acceder, primero, leyendo la data del blockchain y luego con esa información solicitando al servidor central de los Cryptopunks las imágenes correspondientes.
Luego de desarrollarse el estándar ERC-721, los NFTs en Ethereum adoptaron ese diseño y es por ello que son compatibles con muchas plataformas de venta (NFT marketplaces) y wallets (billeteras digitales). La idea de almacenar en el blockchain un enlace hacia la imagen o archivo asociado al NFT se volvió una práctica muy común. En un intento por descentralizar más esa solución, una práctica típica es almacenar los archivos en el InterPlanetary File System (IPFS), el cual es una red descentralizada que puede almacenar archivos y fue desarrollada por Protocol Labs. Sin embargo, el diseño original de IPFS no tiene como objetivo proveer la persistencia descentralizada de los archivos sino mejorar el direccionamiento hacia ellos⁶, por esto opino que IPFS no se está utilizando adecuadamente pero reconozco que el acceso a la red es fácil y práctico. Esto será tema de discusión en otra publicación.
Arte On-Chain
Otro proyecto muy interesante de Larva Labs es la colección de Autoglyphs. Nuevamente el equipo encontró una solución creativa al problema de guardar información en el blockchain. Ellos pensaron que, en vez de guardar un link hacia las imágenes, podían almacenar breves instrucciones sobre cómo recrearlas. La data que se almacena dentro de un blockchain se le denomina "on-chain".
Esta solución fue inspirada por la técnica del artista Sol LeWitt cuya obra consistía en instrucciones que el público podía interpretar y ejecutar para lograr dibujar un mural.
Estos son algunos de los Autoglyphs de la colección:
Si decodificamos la data almacenada en el blockchain de, por ejemplo, el Autoglyph #1, obtenemos esto:
.|.|.O..-.-.-.-.-.|.|.|.O.O.O.O..O.O.O.O.|.|.|.-.-.-.-.-..O.|.|.
|-.|.O|.O-.|..|.O-.O..|..-.O-.|..|.-O.-..|..O.-O.|..|.-O.|O.|.-|
..|-..|-.OO-..|...|..O-..O|..O-..-O..|O..-O..|...|..-OO.-|..-|..
||-...OO|....OO--...O|--...||-....-||...--|O...--OO....|OO...-||
..........O.OOOOO||-||--.-............-.--||-||OOOOO.O..........
OO.......-|||OO.......-|-|OOO......OOO|-|-.......OO|||-.......OO
.||O..--O..-||O..-|O..-||...-|O..O|-...||-..O|-..O||-..O--..O||.
..-O..-O.-O..|..|..-O.--O.-O..|..|..O-.O--.O-..|..|..O-.O-..O-..
-O.|..O.-.-..|.-O.|.-O.|.|..O.-..-.O..|.|.O-.|.O-.|..-.-.O..|.O-
.-O..-.-.|.|.-.|.|.O.O.|.O.O..-..-..O.O.|.O.O.|.|.-.|.|.-.-..O-.
-.O.O|.O-.|..-.O-.O.O|.O-.|-.-.OO.-.-|.-O.|O.O.-O.-..|.-O.|O.O.-
.|-..|-..|..|-..|-.O|..O|..O-..OO..-O..|O..|O.-|..-|..|..-|..-|.
-...O||....||.....||....O|-...OOOO...-|O....||.....||....||O...-
...OOO|||---.---.........OOOO||||||OOOO.........---.---|||OOO...
-||OOOO......--|-|OO.O.......-||||-.......O.OO|-|--......OOOO||-
...-O...-|O..-||O...|O...-|O..-||-..O|-...O|...O||-..O|-...O-...
-O.-O..|O.-|..-O.-O..|..-O..|O.--.O|..O-..|..O-.O-..|-.O|..O-.O-
.-..|.-..|.-..|.-..|....|....|....|....|....|..-.|..-.|..-.|..-.
|.|.|.|.|.O.|.O.O.O.O.|.O.O.O-O..O-O.O.O.|.O.O.O.O.|.O.|.|.|.|.|
.O..-.O-.O.O|.O..|..-.|-.|..-.O..O.-..|.-|.-..|..O.|O.O.-O.-..O.
|..O|..O-.O|...|..O-..|-..|..O|..|O..|..-|..-O..|...|O.-O..|O..|
..O||...OO|...OO|....O|-...O||....||O...-|O....|OO...|OO...||O..
||------..........||||||---..........---||||||..........------||
...--||-||OO.......---||||OOO......OOO||||---.......OO||-||--...
O....-|O..-|O...-|O...-|...-|O....O|-...|-...O|-...O|-..O|-....O
.-O.-|..|O..|O.-O..|..-|..|O.-O..O-.O|..|-..|..O-.O|..O|..|-.O-.
O.|..O.-..|.-O.|..O.|.-O.|.-O.|..|.O-.|.O-.|.O..|.O-.|..-.O..|.O
.O.|.O.O.O-O.O.O.....O.O-O-O........O-O-O.O.....O.O.O-O.O.O.|.O.
O-.|.O-.O..-.O..|.O-.|.O|.O..|.OO.|..O.|O.|.-O.|..O.-..O.-O.|.-O
..O-..|...-..|-.O|-.O|..O-..|..OO..|..-O..|O.-|O.-|..-...|..-O..
O|-...O|--..O||-..OO|....O|....OO....|O....|OO..-||O..--|O...-|O
..........OOO|||-...........OOOOOOOO...........-|||OOO..........
..........OOO|||-...........OOOOOOOO...........-|||OOO..........
O|-...O|--..O||-..OO|....O|....OO....|O....|OO..-||O..--|O...-|O
..O-..|...-..|-.O|-.O|..O-..|..OO..|..-O..|O.-|O.-|..-...|..-O..
O-.|.O-.O..-.O..|.O-.|.O|.O..|.OO.|..O.|O.|.-O.|..O.-..O.-O.|.-O
.O.|.O.O.O-O.O.O.....O.O-O-O........O-O-O.O.....O.O.O-O.O.O.|.O.
O.|..O.-..|.-O.|..O.|.-O.|.-O.|..|.O-.|.O-.|.O..|.O-.|..-.O..|.O
.-O.-|..|O..|O.-O..|..-|..|O.-O..O-.O|..|-..|..O-.O|..O|..|-.O-.
O....-|O..-|O...-|O...-|...-|O....O|-...|-...O|-...O|-..O|-....O
...--||-||OO.......---||||OOO......OOO||||---.......OO||-||--...
||------..........||||||---..........---||||||..........------||
..O||...OO|...OO|....O|-...O||....||O...-|O....|OO...|OO...||O..
|..O|..O-.O|...|..O-..|-..|..O|..|O..|..-|..-O..|...|O.-O..|O..|
.O..-.O-.O.O|.O..|..-.|-.|..-.O..O.-..|.-|.-..|..O.|O.O.-O.-..O.
|.|.|.|.|.O.|.O.O.O.O.|.O.O.O-O..O-O.O.O.|.O.O.O.O.|.O.|.|.|.|.|
.-..|.-..|.-..|.-..|....|....|....|....|....|..-.|..-.|..-.|..-.
-O.-O..|O.-|..-O.-O..|..-O..|O.--.O|..O-..|..O-.O-..|-.O|..O-.O-
...-O...-|O..-||O...|O...-|O..-||-..O|-...O|...O||-..O|-...O-...
-||OOOO......--|-|OO.O.......-||||-.......O.OO|-|--......OOOO||-
...OOO|||---.---.........OOOO||||||OOOO.........---.---|||OOO...
-...O||....||.....||....O|-...OOOO...-|O....||.....||....||O...-
.|-..|-..|..|-..|-.O|..O|..O-..OO..-O..|O..|O.-|..-|..|..-|..-|.
-.O.O|.O-.|..-.O-.O.O|.O-.|-.-.OO.-.-|.-O.|O.O.-O.-..|.-O.|O.O.-
.-O..-.-.|.|.-.|.|.O.O.|.O.O..-..-..O.O.|.O.O.|.|.-.|.|.-.-..O-.
-O.|..O.-.-..|.-O.|.-O.|.|..O.-..-.O..|.|.O-.|.O-.|..-.-.O..|.O-
..-O..-O.-O..|..|..-O.--O.-O..|..|..O-.O--.O-..|..|..O-.O-..O-..
.||O..--O..-||O..-|O..-||...-|O..O|-...||-..O|-..O||-..O--..O||.
OO.......-|||OO.......-|-|OOO......OOO|-|-.......OO|||-.......OO
..........O.OOOOO||-||--.-............-.--||-||OOOOO.O..........
||-...OO|....OO--...O|--...||-....-||...--|O...--OO....|OO...-||
..|-..|-.OO-..|...|..O-..O|..O-..-O..|O..-O..|...|..-OO.-|..-|..
|-.|.O|.O-.|..|.O-.O..|..-.O-.|..|.-O.-..|..O.-O.|..|.-O.|O.|.-|
.|.|.O..-.-.-.-.-.|.|.|.O.O.O.O..O.O.O.O.|.|.|.-.-.-.-.-..O.|.|.
A primera vista no parece tener sentido, sin embargo, al leer el código fuente del smart contract de los Autoglyphs encontramos estas instrucciones:
Las cuales indican cómo interpretar los símbolos almacenados en el blockchain y generar una imagen como esta:
Esto nos abre posibilidades interesantes como la de escribir un programa que interprete las instrucciones a su manera y genere nuevas versiones de los Autoglyphs. De hecho, lo que hice fue crear un bot de Twitter ⁵ que elige Autoglyphs de forma aleatoria y los interpreta a colores (además de dedicarle el tweet a algún seguidor, también aleatorio):
La data on-chain ha sido utilizada de otras formas creativas por otros proyectos de NFTs.
Esta exploración a través de conceptos y la historia de los NFTs nos debe haber dado una idea general de cómo funciona esta tecnología.
En un siguiente artículo exploraremos NFTs en otros blockchains, sus aplicaciones más allá del arte digital, su importancia para el desarrollo del metaverso y otros conceptos que están en constante evolución y desarrollo.
Notas
¹ Bitcoin (B mayúscula) hace referencia al protocolo. bitcoin (b minúscula) se utiliza para referirse a la criptomoneda.
² Como se mencionó en un párrafo anterior, esto técnicamente no es correcto ya que lo que Bitcoin realmente almacena son las condiciones criptográficas para acceder a los bitcoins lo cual, para efectos prácticos y gracias a la magia criptográfica, lo podemos interpretar como quién es dueño de los bitcoins.
³ Bitcoin no fue diseñado para ser capaz de realizar computación universal, sin embargo, existen discusiones teóricas sobre esta limitación.
⁴ La idea de "crowd computing" se remonta al siglo XVIII a través de la distribución de hojas de cálculo de astronomía para que voluntarios contribuyan a la creación de mapas estelares. Es interesante el paralelo con uno de los proyectos más grandes de crowd computing de la época moderna para fines científicos. SETI@Home es un proyecto del Berkeley SETI Research Center que permite a los voluntarios instalarlo en sus computadoras para donar parte de su poder computacional con el objetivo de analizar secciones del cielo y buscar señales de inteligencia extraterrestre en las ondas de radio de ese sector espacial.
⁵ Estos son algunos de los tweets generados por mi bot:
⁶ La persistencia descentralizada de archivos la intenta resolver otro proyecto de Protocol Labs llamado Filecoin.