blockchain

TOKEN ERC: estándares más comunes e implementación

Ahora que conocemos un poco más sobre los tokens, vamos a profundizar en otro concepto muy importante en Ethereum que son los ERCs, Ethereum Request for Comments.

Los ERCs, Ethereum Request for Comments, son propuestas generadas por la comunidad o los propios desarrolladores de Ethereum con el fin de impulsar esta plataforma de blockchain, generando interoperabilidad en el ecosistema y facilitando a las aplicaciones que hacen uso de tokens la integración de estos por medio de estándares. A su vez, los ERCs no son más que un tipo de EIP (Ethereum Improvement Proposal) en el nivel de aplicación, que para llegar a convertirse en estándares han de pasar primero por fases de consulta y revisión hasta ser aprobados.

Si tienes más curiosidad sobre esto, puedes ver todas las propuestas de mejora de Ethereum (EIP) en el enlace: https://eips.ethereum.org/

A continuación vamos a tratar los principales estándares de token ERCs existentes a día de hoy:

Token ERC-20

Actualmente, aunque su funcionalidad sea básica, es el estándar más utilizado y con mayor relevancia debido a su gran interoperabilidad en el entorno.

Proporciona los métodos de transferencia de tokens (transfer), aprobación o autorización de uso de tus tokens a otra dirección de Ethereum (aprove), transferencia de tokens autorizada desde otra dirección de Ethereum (transferFrom), consulta de balance actual (balanceOf) y consulta de la cantidad de tokens posible a utilizar de parte de otra dirección Ethereum (allowance). Además, existen dos tipos de eventos (Transfer y Approval) que se activan cuando se realiza una transferencia o una aprobación.

Para caracterizar el token se debe asignar valor a una serie de atributos en forma de variable. El único parámetro obligatorio es el número de total de tokens disponible (totalSupply), los demás como el nombre (name), el símbolo (sym) y el número de decimales (decimals) son opcionales, aunque importantes si quieres dar un mayor detalle a tu token y distinguirlo de los demás. El número de decimales ofrece la capacidad subdividir una unidad de token en 18 decimales.

Pero, ¿donde se guarda el balance de cada usuario que sea poseedor de ese token? Buena pregunta. Para guardar los balances se usa una variable de tipo ‘mapping’, que relaciona una dirección de Ethereum con su correspondiente balance de tokens: (mapping (Address => uint256) balances)

Con todo esto, un token ERC20 tendría la siguiente estructura:

token

En el explorador ‘Etherscan’ se puede consultar el número de token existentes desplegados en la red principal de Ethereum, así como su valor y más información. En el momento de escribir este artículo existían 125.699 tokens ERC20. Probablemente cuando vuelvas a mirar este número haya crecido bastante, ya que cada día se despliegan nuevos.

token

Referencias: EIP 20: https://eips.ethereum.org/EIPS/eip-20
Etherscan: https://etherscan.io/tokens

Token ERC-721

El ERC721 es el estándar de token NO fungible por excelencia (denominados NFT, Non Fungible Tokens). El concepto de “NO fungibilidad” viene a decir que es único y no puede ser reemplazado por otro. Otra característica resultado de lo anterior es su indivisibilidad, ya que se mantiene como unidad singular, a diferencia del ERC20. Es por tanto un token no consumible, pero si intercambiable. Puede representar cualquier cosa, desde la propiedad de una obra de arte hasta un préstamo o una multa de tráfico. Un ejemplo de token NO fungible podría ser la propiedad de una casa, ya que es algo único e indivisible que cuando lo transfieres a otra persona pasa a ser parte de su propiedad y tu dejarías de poseerla. El ejemplo de token fungible sería el dinero, donde una unidad monetaria (por ejemplo, una moneda de 1€) es igual y tiene el mismo valor que otra unidad monetaria (otra moneda de 1€).

Cada token ERC721 está identificado por un ID único no modificable (uint256, entero de 256 bytes), y una dirección de Ethereum. Implementa los métodos, atributos y eventos del ERC20 ( name, symbol, totalSupply, balanceOf ) con el objetivo de tener compatibilidad entre aplicaciones, aunque no haga el mismo uso de ellos. Por ejemplo, en el caso del atributo decimales (decimals), debe corresponder con un 0, ya que como hemos mencionado es un estándar indivisible. Además, proporciona nuevos métodos como el de transferencia segura de token (safeTransferFrom), verificando previamente que la dirección que realiza la transferencia es la del propietario del token; de propiedad (ownerOf), para consultar la dirección a la que pertenece el token; o de toma de propiedad del token (takeOwnership), desde una dirección autorizada.

Otras implementaciones posibles a realizar pueden ser las de rechazar transferencias si el contrato esta pausado, crear una lista de direcciones seguras o autorizadas, rechazar transferencias no seguras, cargar el coste de la transacción a ambas partes, etc.

Por el momento, su uso es inferior al ERC20, aunque hay que reconocer que su futuro resulta muy prometedor. En el explorador ‘Etherscan’ se puede ver que existen 262 tokens ERC721 desplegados en la red principal de Ethereum.

El ejemplo de aplicación más popular que da uso a este estándar ERC721 es CryptoKitties. Se trata de una aplicación descentralizada que permite adquirir, coleccionar e intercambiar gatitos, entre otras cosas. Aunque parezca un juego tonto, el planteamiento es realmente valioso, ya que por primera vez eres propietario de un activo digital único que puedes intercambiar con otras persona de manera descentralizada.

token

Referencias: EIP 721: https://eips.ethereum.org/EIPS/eip-721
Etherscan: https://etherscan.io/tokens-nft
CryptoKitties https://www.cryptokitties.co/
Anatomy of ERC721: https://medium.com/crypto-currently/the-anatomy-of-erc721-e9db77abfc24

Otros posibles estándares de token ERC

Además de los principales estándares ERC20 y ERC721, existen otros que se encuentran en fase borrador a la espera de ser aprobados o rechazados. Vamos a ver un resumen de los mas interesantes:

Token ERC-777 – New Advanced Token Standard

Es una mejora del ERC20 que incorpora funcionalidades más avanzada como:

Implementa una función de envío: send(to, amount, data), en lugar de la usual función de transferencia: transfer(to, amount).

Permite controlar y rechazar tokens enviados/recibidos registrando funciones “gancho”: tokensToSend(operator, from, to, amount, data, operatorData), tokensRecieved(operator, from, to, amount, data, operatorData). Es útil por ejemplo para dar la opción al remitente o al destinatario de intervenir en la transferencia e incluso rechazarla.

Incorpora la figura de “operadores autorizados”. Permite autorizar o revocar direcciones de Smart Contrats o de usuarios a mover tokens en nombre del propietario y crear funcionalidades adicionales al token: autorhizeOperator(operator), revokeOperator(operator).

Referencia: https://eips.ethereum.org/EIPS/eip-777

Token ERC-823 – Token Exchange Standard

Mejora del ERC20 que incorpora un servicio de intercambio facilitando los pagos cruzados de tokens. Permite al poseedor de un token ERC20 intercambiarlo con otro ERC20 usando un token de intercambio para realizar las transferencias: exchangeToken( targetContract, amount). Implementa variables de tipo “mapping” para relacionar: dirección y cantidad del token intercambiado (exchangedWith); dirección de la persona que inicia el intercambio y la cantidad (exchangedBy); y cantidad de tokens recibidos y la dirección de quien lo emitió (exchangesReceived).

Referencia: https://eips.ethereum.org/EIPS/eip-823

Token ERC-918 – Mineable Token Standard

Estándar de token minable que usa el algoritmo de “Proof of Work” para su propia distribución. Los tokens se distribuyen siguiendo el modelo IMO, “Initial Mining Offering”, como si de una ICO se tratara. Implementa una función mint() que actúa como un grifo controlando el ritmo de distribución de token y minimizando costes.

Referencia: https://eips.ethereum.org/EIPS/eip-918

Token ERC-998 – Composable Non-Fungible Token Standard

Mejora del estándar ERC721 que permite a un token poseer o ser poseído por tokens ERC721 y ERC20, de forma que pueden tener “child tokens” o “parent tokens” respectivamente. Permite formar árboles de propiedad en base a la relación entre cada token como si de un árbol genealógico se tratara.

Referencia: https://eips.ethereum.org/EIPS/eip-998

Token ERC-1080 – Recoverable Token Standard

Extensión de estándar ERC20 que soporta la devolución, prevención de robo y recuperación de tokens. Se han de implementar funciones del tipo: claimLost(Address lostAccount) , reportStolen(), chargeBack(uint256 pendingTransferNumber). Todas ellas deben devolver como respuesta el éxito o fracaso de la operación (tipo boolean).

Referencia: https://eips.ethereum.org/EIPS/eip-1080

Cómo implementar mi propio tokens para aplicaciones

Crear un token es muy sencillo, basta con utilizar alguna plantilla que implemente cualquier estándar ERC y caracterizarlo a tu manera, pero crearlo para que sea eficiente y seguro no lo es tanto. En general, todos los estándares son solo un patrón o esquema a seguir que es necesario dar forma, y ahí es donde surge el problema. Por ejemplo, dentro de la función transfer(), podrías desarrollar una lógica maliciosa para que, por cada transferencia, se aumentase en tu favor una cantidad X de tokens. También podrías implementar un token de forma correcta pero vulnerable, llegando a perder todos los balances o incluso provocar la destrucción del token.

Por todo esto, es recomendable ayudarse de recursos como Truffle o OpenZeppelin para el desarrollo de Smart Contracts seguros. En el repositorio de GitHub de OpenZeppelin encontrarás ejemplos de token implementados y listos para ser utilizados.

Referencia: Truffle: https://truffleframework.com/
OpenZeppelin https://openzeppelin.org/
GitHub (OpenZeppelin) https://bit.ly/2pMK4Vj

Conclusión

El mundo del token está todavía en una etapa de madurez y crecimiento. Falta un largo camino por recorrer para llegar a digitalizar todo lo que nos rodea. Lo que no podemos negar es que el Token va a suponer un cambio de paradigma en la forma de intercambiar, transferir y dar valor a los activos.

RELACIONADOS