Contenido
Ethereum, fundada por Vitalik Buterin en 2014, se posicionaría como una plataforma de
código abierto para el lanzamiento de aplicaciones descentralizadas (
Dapps). Gran parte de la motivación de Buterin para crear una nueva
blockchain derivaría de la falta de flexibilidad del protocolo
Bitcoin.
Desde su lanzamiento, la blockchain de Ethereum atraería desarrolladores, empresas y emprendedores, alumbrando una creciente industria de usuarios mediante el lanzamiento de
smart contracts y aplicaciones distribuidas.
En este artículo, analizaremos el estándar
ERC-20, un marco importante para la creación de
tokens. Aunque específico de la red Ethereum, dicho marco ha inspirado estándares de otras blockchains, como por ejemplo el
BEP-2 de Binance Chain.
En Ethereum, los ERC son Ethereum Request for Comments. Documentos técnicos que perfilan estándares para programar en Ethereum. No deben confundirse con los Ethereum Improvement Proposals (EIPs), que, de manera similar a los BIPs de Bitcoin, sugieren mejoras del propio protocolo. El objetivo de los ERCs es, en cambio, establecer convenciones que faciliten la interacción de aplicaciones y contratos.
Propuesto por Vitalik Buterin y Fabian Vogelsteller en 2015, el estándar ERC-20 propone un formato relativamente simple para tokens alojados en Ethereum. Siguiendo el esquema, los desarrolladores no necesitan reinventar la rueda. Por el contrario, pueden construir a partir de una base compartida por toda la industria.
Cabe señalar que el estándar ERC-20 sería desarrollado en un EIP (específicamente, el EIP-20). El desarrollo tendría lugar un par de años después de la propuesta original, como resultado de su amplio uso. Sin embargo, incluso años más tarde, el término “ERC-20” perdura.
A diferencia de ETH (la criptomoneda nativa de Ethereum), los tokens ERC-20 no son contenidos por cuentas. Sino que sólo existen dentro de un contrato, que es como una base de datos autónoma. Éste especifica las reglas de los tokens (es decir, nombre, símbolo, divisibilidad) y mantiene una lista que coteja los balances de los usuarios con sus direcciones de Ethereum.
Para mover tokens, los usuarios deberán enviar una transacción al contrato, pidiendo colocar parte de su balance en otro lugar. Por ejemplo, si Alice desea enviar 5.000 BinanceAcademyTokens a Bob, deberá llamar a una función dentro del smart contract de BinanceAcademyToken para solicitárselo.
La llamada de Alice está contenida dentro de lo que parece ser una transacción ordinaria de Ethereum que paga 0 ETH al contrato del token. La llamada se incluye en un campo adicional de la transacción, que especifica lo que Alice desea hacer –en este caso, transferir tokens a Bob.
A pesar de que no envía ether, Alice deberá pagar de todas formas una comisión denominada en dicha criptomoneda para que su transacción sea incluida en un
bloque. Si no dispone de ETH, necesitará adquirirlo antes de poder transferir los tokens.
Aquí tenemos un ejemplo del mundo real sobre lo comentado arriba, sacado de Etherscan: alguien realiza una llamada al contrato de BUSD. Puedes ver cómo los tokens fueron transferidos, y que una comisión fue pagada, a pesar de que el campo "Value" (valor) muestre que se enviaron 0 ETH.
Ahora que nos hemos puesto al día, realizaremos un análisis más detenido para comprender mejor la estructura de un contrato ERC-20 típico.
Para cumplir con el estándar ERC-20, tu contrato ha de incluir seis funciones obligatorias: totalSupply, balanceOf, transfer, transferFrom, approve y allowance. Además, puedes especificar funciones opcionales, como por ejemplo name, symbol y decimal. Es posible que por el nombre te quede claro lo que esas funciones hacen. Si no es así, no te preocupes: a continuación lo desglosamos.
Debajo tienes las funciones tal como se muestran en el lenguaje Solidity, específicamente creado para Ethereum.
totalSupply
function totalSupply() public view returns (uint256)
Cuando es llamada por un usuario, la función superior retorna la
oferta total de tokens que el contrato contiene.
balanceOf
function balanceOf(address _owner) public view returns (uint256 balance)
A diferencia de totalSupply, balanceOf apunta a un parámetro (una dirección). Cuando se llama, dicha función retorna el balance de tokens que dicha dirección posee. Recuerda que en Ethereum las cuentas son públicas, por lo que podrás solicitar el balance de cualquier usuario siempre y cuando conozcas la dirección.
transfer
function transfer(address _to, uint256 _value) public returns (bool success)
transfer transfiere tokens de un usuario a otro de manera idónea. En esta, proporcionas la dirección a la que quieres hacer el envío y la cantidad a transferir.
Cuando es llamada, la función transfer activa lo que se conoce como un event (un evento de transferencia, en este caso), que básicamente le dice a la blockchain que incluya una referencia a la misma.
transferFrom
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
La función transferFrom es una alternativa cómoda a transfer que permite un poco más de programabilidad en las aplicaciones descentralizadas. Igual que transfer, se emplea para mover tokens, pero éstos no han de pertenecer necesariamente a la persona que llama al contrato.
En otras palabras, puedes autorizar a alguien –o a otro contrato– para que transfiera fondos en tu nombre. Un caso de uso potencial involucra el pago por servicios basados en suscripciones, cuando no deseas realizar manualmente dicho pago cada día/semana/mes. En su lugar, simplemente permites que el programa se ocupe de ello.
Esta función activa el mismo evento que transfer.
approve
function approve(address _spender, uint256 _value) public returns (bool success)
approve es otra función útil desde un punto de vista de la programabilidad. Con dicha función, puedes limitar el número de tokens que un smart contract puede retirar de tu balance. Sin ella, corres el riesgo de un mal funcionamiento del contrato (o de que sea explotado) y robe todos tus fondos.
Pongamos el ejemplo del modelo de suscripción nuevamente. Supongamos que tienes una enorme cantidad de BinanceAcademyTokens, y deseas establecer pagos recurrentes a una
Dapp de streaming. Como estás muy ocupado leyendo contenidos de
Binance Academy día y noche, no quieres destinar tiempo cada semana a crear una transacción manualmente.
Tienes un balance de BinanceAcademyTokens inmenso, que supera con creces lo que se necesita para pagar la suscripción. Para evitar que la Dapp drene todos tus fondos, puedes establecer un límite con approve. Supongamos que tu suscripción cuesta un BinanceAcademyToken por semana. Si capas el valor aprobado a veinte tokens, tu suscripción podrá ser pagada de manera automática durante cinco meses.
En el peor caso, si la Dapp intenta retirar todos tus fondos o si se encuentra un bug, sólo podrías perder veinte tokens. Puede que no sea una solución ideal, pero sin duda es mejor que perder todo tu capital.
Cuando es llamada, approve activa el evento de aprobación. Igual que con el evento de transferencia, anota datos en la blockchain.
allowance
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
La función
allowance puede ser empleada junto con
approve. Cuando le has otorgado permiso a un contrato para que gestione tus
tokens, puedes utilizar esta función para comprobar cuántos de ellos puede retirar todavía. Por ejemplo, si tu suscripción ha utilizado doce de los veinte tokens que has aprobado, llamar a la función
allowance debería retornar un valor total de ocho.
Las funciones opcionales
Las funciones previamente abordadas son obligatorias. Por el contrario, name, symbol y decimal no tienen por qué inlcuirse, aunque pueden hacer que tu contrato ERC-20 luzca mejor. Estas funciones te permiten, respectivamente, añadir un nombre en lenguaje humano, establecer un símbolo (es decir ETH, BTC, BNB), así como especificar en cuántas posiciones decimales pueden dividirse los tokens. Por ejemplo, los tokens que se emplean como divisas pueden beneficiarse de una mayor divisibilidad que aquellos que representan una participación en una propiedad.
Consulta
este ejemplo en GitHub para ver estos elementos en un contrato real.
Al juntar todas las funciones anteriores, obtenemos un contrato ERC-20. Podemos consultar el
suministro total, verificar saldos, transferir fondos y otorgar permisos a otras
DApps para que administren tokens por nosotros.
Una gran parte del atractivo de los tokens ERC-20 es su flexibilidad. Las convenciones establecidas no restringen el desarrollo, por lo que las partes pueden implementar funciones adicionales y establecer parámetros específicos para satisfacer sus necesidades.
Stablecoins
Stablecoins (tokens vinculados a
monedas fiduciarias) a menudo usan el estándar de token ERC-20. La transacción del contrato BUSD que mencionamos anteriormente es un ejemplo, y la mayoría de las principales stablecoins también están disponibles en este formato.
Para una stablecoin con respaldo fiduciario típico, un emisor tiene reservas de euros, dólares, etc. Luego, por cada unidad en su reserva, emite un token. Esto significa que si se guardaran $10,000 en una bóveda, el emisor podría crear 10,000 tokens, cada uno canjeable por $1.
Esto es bastante fácil de implementar en Ethereum, técnicamente hablando. Un emisor simplemente lanza un contrato con 10,000 tokens. Luego, los distribuirán a los usuarios con la promesa de que luego podrán canjear los tokens por una cantidad proporcional de moneda fiduciaria.
Los usuarios pueden hacer varias cosas con sus tokens: pueden comprar bienes y servicios o usarlos en DApps. Alternativamente, podrían solicitar que el emisor los cambie de inmediato. En ese caso, el emisor
quema los tokens devueltos (haciéndolos inutilizables) y retiran la cantidad correcta de dinero fiduciario de sus reservas.
El contrato que rige este sistema, como se mencionó anteriormente, es relativamente simplista. Sin embargo, el lanzamiento de una stablecoin requiere mucho trabajo en factores externos como la logística, el cumplimiento normativo, etc.
Security tokens
Los
Security tokens son similares a las stablecoins. A nivel de contrato, ambos podrían incluso ser idénticos, ya que funcionan de la misma manera. La distinción ocurre a nivel del emisor. Los Security tokens representan valores, como acciones, bonos o activos físicos. A menudo (aunque no siempre es el caso), otorgan al titular algún tipo de participación en un negocio o bien.
Utility tokens
Los utility tokens son quizás los tipos de tokens más comunes que se encuentran en la actualidad. A diferencia de las dos ofertas anteriores, no están respaldadas por nada. Si los tokens respaldados por activos son como acciones en una compañía aérea, los tokens de servicios públicos son como programas de viajero frecuente: cumplen una función, pero no tienen valor externo. Los utility tokens pueden adaptarse a una gran variedad de casos de uso, y sirven como
moneda de juego, combustible para aplicaciones descentralizadas, puntos de fidelidad y mucho más.
Puedes minar ether (ETH), pero los tokens no se pueden minar; decimos que se acuñan cuando se crean nuevos. Cuando se lanza un contrato, los desarrolladores distribuyen el suministro de acuerdo a sus planes y hoja de ruta.
Por lo general, esto se realiza a través de una
oferta inicial de monedas (ICO), una
oferta inicial de exchange (IEO) o una oferta de Security token (STO). Puedes encontrar variaciones de estos acrónimos, pero estos conceptos son bastante similares. Los inversores envían ether a la dirección del contrato y, a cambio, reciben nuevos tokens. El dinero recaudado se utiliza para financiar un mayor desarrollo del proyecto. Los usuarios esperan poder usar sus tokens (ya sea de inmediato o en una fecha posterior) o revenderlos para obtener ganancias a medida que se desarrolla el proyecto.
No es necesario automatizar la distribución de tokens. Muchos eventos de financiación colectiva permiten a los usuarios pagar con una variedad de monedas digitales diferentes (como BNB, BTC, ETH y USDT). Los respectivos saldos se asignan a las direcciones proporcionadas por los usuarios.
Pros de los tokens ERC-20
Fungible
Los tokens ERC-20 son
fungibles: cada unidad es intercambiable con otra. Si tuviera un BinanceAcademyToken, no importaría qué token específico tuviera. Podrías cambiarlo por el de otra persona y seguirían siendo funcionalmente idénticos, como el dinero en efectivo o el oro.
Esto es ideal si tu token pretende ser una moneda de algún tipo. No querrías unidades individuales con rasgos distinguibles, lo que las haría no fungibles. Esto podría hacer que algunos tokens se vuelvan más o menos valiosos que otros, socavando su propósito.
Flexible
Como exploramos en la sección anterior, los tokens ERC-20 son altamente personalizables y se pueden adaptar a muchas aplicaciones diferentes. Por ejemplo, se pueden utilizar como moneda de juego, en programas de puntos de fidelidad, como objetos de
coleccionables digitales o incluso para representar obras de arte y derechos de propiedad.
Popular
La popularidad de ERC-20 en la industria de las criptomonedas es una razón muy convincente para usarlo como modelo. Hay una gran cantidad de exchanges, monederos y contratos inteligentes que ya son compatibles con los tokens recién lanzados. Además, la documentación y el soporte para desarrolladores son abundantes
Contras de los tokens ERC-20
Escalabilidad
Como ocurre con muchas redes de criptomonedas, Ethereum no es inmune a los dolores de crecimiento. En su forma actual, no se escala bien: intentar enviar una transacción en las horas pico genera comisiones altas y retrasos. Si lanzas un token ERC-20 y la red se congestiona, su usabilidad podría verse afectada.
Este no es un problema exclusivo de Ethereum. Más bien, es una compensación necesaria en sistemas distribuidos y seguros. La comunidad planea abordar estos problemas en la migración a
Ethereum 2.0, que implementará actualizaciones como
Ethereum Plasma y
Ethereum Casper.
Fraudes
Si bien no es un problema con la tecnología en sí, la facilidad con la que se puede lanzar un token podría considerarse una desventaja en algunos aspectos. Se necesita un esfuerzo mínimo para crear un simple token ERC-20, lo que significa que cualquiera puede hacerlo, para bien o para mal.
Como tal, debes tener cuidado con lo que estás invirtiendo. Hay una serie de
esquemas Pirámide y Ponzi disfrazados de proyectos blockchain. Haz tu propia investigación antes de invertir para llegar a tus propias conclusiones sobre si una oportunidad es legítima.
ERC-20 fue el primer estándar de token de Ethereum (y, hasta la fecha, el más popular), pero de ninguna manera es el único. A lo largo de los años, han surgido muchos otros, ya sea proponiendo mejoras en el ERC-20 o intentando lograr objetivos completamente diferentes.
Algunos de los estándares menos comunes son los que se usan en
tokens no fungibles (NFTs). A veces, tu caso de uso se beneficia de tener tokens únicos con diferentes atributos. Si quisieras tokenizar una obra de arte única en su tipo, un activo de juego, etc., uno de estos tipos de contrato podría ser más atractivo.
El estándar
ERC-721, por ejemplo, se utilizó para la inmensamente popular DApp CryptoKitties. Dicho contrato proporciona una
API para que los usuarios creen sus propios tokens no fungibles y codifiquen
metadatos (imágenes, descripciones, etc.).
El estándar ERC-1155 podría verse como una mejora tanto en ERC-721 como en ERC-20. Describe un estándar que admite tokens fungibles y no fungibles en el mismo contrato.
Otras opciones como ERC-223 o ERC-621 tienen como objetivo mejorar la usabilidad. El primero implementa salvaguardas para evitar transferencias accidentales de tokens. Este último agrega funciones adicionales para aumentar y disminuir el suministro de tokens.
El estándar ERC-20 ha dominado el espacio de los activos criptográficos durante años, y no es difícil ver por qué. Con relativa facilidad, cualquiera puede implementar un contrato simple para adaptarse a una amplia gama de casos de uso (utility tokens, stablecoins, etc.). Dicho esto, ERC-20 carece de algunas de las características que cobran vida con otros estándares. Queda por ver si los tipos posteriores de contratos ocuparán su lugar.