Conteúdo
A
Ethereum foi fundada por Vitalik Buterin em 2014, com a proposta de plataforma
open-source (de código aberto) para lançamento de aplicativos descentralizados (
DApps). Muitas das motivações de Buterin para a criação de uma nova
blockchain vieram da falta de flexibilidade do protocolo
Bitcoin.
Desde o seu lançamento, a blockchain Ethereum atraiu desenvolvedores, empresas e empreendedores, gerando uma indústria crescente de usuários lançando
contratos inteligentes e aplicativos distribuídos.
Neste artigo, discutiremos sobre o padrão
ERC-20, uma estrutura importante para a criação de
tokens. Embora seja específico para a rede Ethereum, essa estrutura também inspirou outros padrões de blockchain, como o
BEP-2 da Binance Chain.
Na Ethereum, a sigla ERC significa Ethereum Request for Comments. São documentos técnicos que descrevem os padrões de programação na Ethereum. Não devem ser confundidos com Ethereum Improvement Proposals (EIPs), que, como os BIPs do Bitcoin, sugerem melhorias para o próprio protocolo. Em vez disso, o objetivo dos ERCs é estabelecer convenções que facilitem a interação entre aplicativos e contratos.
Criado por Vitalik Buterin e Fabian Vogelsteller em 2015, o padrão ERC-20 propõe um formato relativamente simples para tokens com base na Ethereum. Ao seguir o esboço, desenvolvedores não precisam reinventar a roda. Eles podem simplesmente construir a partir de uma base já usada em toda a indústria.
É importante notar que o padrão ERC-20 foi desenvolvido em um EIP (mais especificamente, um EIP-20). Isso aconteceu alguns anos após a proposta original devido à sua difusão. No entanto, mesmo alguns anos depois, o nome “ERC-20” foi mantido.
Ao contrário do ETH (criptomoeda nativa da Ethereum), os tokens ERC-20 não são mantidos em contas. Os tokens existem apenas dentro de um contrato, que é como um banco de dados independente. Ele define as regras para os tokens (ou seja, define nome, símbolo, divisibilidade) e mantém uma lista que mapeia os saldos dos usuários e seus endereços Ethereum.
Para mover tokens, os usuários devem enviar uma transação ao contrato solicitando que aloque parte de seu saldo para outro lugar. Por exemplo, se Alice deseja enviar 5.000 BinanceAcademyTokens para Bob, ela chama uma função dentro do contrato inteligente BinanceAcademyToken solicitando que isso seja feito.
A solicitação de Alice está contida no que aparenta ser uma transação normal da Ethereum, que paga 0 ETH para o contrato de token. A solicitação é incluída em um campo adicional na transação, que especifica o que Alice deseja – neste caso, transferir tokens para Bob.
Mesmo que Alice não esteja enviando Ether, ela ainda deve pagar uma taxa, em Ether, para incluir sua transação em um
bloco. Caso ela não tenha ETH, ela precisará comprar ou receber alguns antes de efetuar a transferência de tokens.
No Etherscan, podemos ver um exemplo real do que mencionamos acima: alguém faz uma solicitação para o contrato BUSD. Podemos ver que os tokens foram transferidos e uma taxa foi paga, embora o campo Valor mostre que 0 ETH foi enviado.
Agora que sabemos o básico, vamos entender melhor a estrutura de um contrato ERC-20.
Para ser compatível com ERC-20, seu contrato precisa incluir seis funções obrigatórias: totalSupply, balanceOf, transfer, transferFrom, approve e allowance. Além disso, você pode especificar funções opcionais, como name, symbol e decimal. Para você, talvez esteja claro o que essas funções fazem a partir de seus nomes. Se não estiver, não se preocupe – explicaremos sobre cada uma elas.
Abaixo, temos algumas das funções que aparecem na linguagem Solidity, criada especificamente para a Ethereum.
totalSupply
function totalSupply() public view returns (uint256)
Quando chamada por um usuário, a função acima retorna o
fornecimento total de tokens do contrato.
balanceOf
function balanceOf(address _owner) public view returns (uint256 balance)
Ao contrário da função totalSupply, a balanceOf recebe um parâmetro (um endereço). Quando chamada, ela retorna o saldo de tokens dos endereços correspondentes. Lembre-se, as contas da rede Ethereum são públicas, portanto você pode consultar o saldo de qualquer usuário desde que saiba o endereço.
transfer
function transfer(address _to, uint256 _value) public returns (bool success)
A função transfer transfere tokens de um usuário a outro. Você fornece o valor e o endereço para o qual deseja transferir.
Quando chamada, a função transfer executa o que chamamos de event (neste caso, um evento de transferência), que basicamente diz à blockchain para incluir uma referência a ele no registro.
transferFrom
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
A função transferFrom é uma alternativa útil da função transfer, que proporciona maior programabilidade em aplicativos descentralizados. Assim como a transfer, é usada para mover tokens, mas esses tokens não precisam necessariamente pertencer à pessoa que está "chamando" o contrato.
Em outras palavras, você pode autorizar alguém – ou outro contrato – para efetuar a transferência de fundos em seu nome. Uma possibilidade envolve o pagamento de serviços baseados em uma inscrição ou assinatura, em que você não deseja enviar, manualmente, um pagamento todos os dias/semanas/meses. Em vez disso, você paga por um programa que faz isso por você.
Essa função aciona o mesmo "event" que citamos na função transfer.
approve
function approve(address _spender, uint256 _value) public returns (bool success)
approve é outra função muito útil do ponto de vista da programação. Com esta função, você pode limitar o número de tokens que um contrato inteligente pode retirar de seu saldo. Sem ela, você corre o risco de sofrer com um mau funcionamento do contrato ou de ter todos os seus fundos roubados.
Vamos considerar novamente nosso exemplo de serviços por assinatura. Suponha que você tenha uma grande quantidade de BinanceAcademyTokens e deseja configurar pagamentos recorrentes semanais para um
DApp de streaming. Como você está ocupado lendo o conteúdo da
Binance Academy dia e noite, não quer perder tempo toda semana para criar, manualmente, uma transação.
Seu saldo de BinanceAcademyTokens é bem maior do que o necessário para pagar pela assinatura. Para evitar que o DApp use todo o seu saldo, você pode definir um limite com a função approve. Suponha que sua assinatura custe um BinanceAcademyToken por semana. Se você limitar o valor aprovado em vinte tokens, poderá pagar sua assinatura automaticamente por cinco meses.
Na pior das hipóteses, se o DApp tentar sacar todos os seus fundos ou se um bug for encontrado, você perderá no máximo vinte tokens. Pode não ser o ideal, mas é melhor do que correr o risco de perder todo o seu patrimônio.
Quando chamada, a função approve aciona o evento approval (aprovação). Como o evento transfer, ela registra dados na blockchain.
allowance
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
A função
allowance pode ser usada em conjunto com a
approve. Depois de dar permissão a um contrato para gerenciar seus
tokens, você pode usá-lo para verificar a quantidade de tokens disponíveis. Por exemplo, se sua assinatura usou doze dos seus vinte tokens aprovados, chamar a função
allowance deve retornar o valor oito.
Funções opcionais
As funções discutidas anteriormente são obrigatórias. Por outro lado, as funções name, symbol e decimal não precisam ser incluídas, mas podem ser usadas para melhorar seu contrato ERC-20. Respectivamente, elas permitem adicionar um nome legível, definir um símbolo (ou seja, ETH, BTC, BNB) e especificar em quantas casas decimais os tokens são divisíveis. Por exemplo, tokens usados como moedas podem se beneficiar de uma maior divisibilidade do que tokens que representam a propriedade de um imóvel.
Consulte
este exemplo do GitHub para visualizar esses elementos em um contrato real.
Ao reunir todas as funções acima, temos um contrato ERC-20. Podemos consultar o
fornecimento total, verificar saldos, transferir fundos e dar permissões a outros
DApps para gerenciamento de tokens.
Uma característica muito atrativa dos tokens ERC-20 é sua flexibilidade. As convenções estabelecidas não restringem o desenvolvimento, portanto os participantes podem implementar recursos adicionais e definir parâmetros específicos para atender às suas necessidades.
Stablecoins
Stablecoins (tokens atrelados a
moedas fiduciárias) costumam usar o padrão de token ERC-20. A transação para o contrato BUSD que mencionamos anteriormente é um exemplo e a maioria das principais stablecoins também estão disponíveis neste formato.
Para stablecoins atreladas a uma moeda fiduciária, o emissor mantém reservas de euros, dólares, etc. E para cada unidade em sua reserva, ele emite um token. Isso significa que se o emissor tiver $10.000 trancados em um cofre, ele pode criar 10.000 tokens, cada um com o valor estável de $1.
Isso é bastante fácil de implementar na rede Ethereum, tecnicamente falando. Um emissor simplesmente lança um contrato com 10.000 tokens. Em seguida, o emissor distribui os tokens aos usuários, com a promessa de que posteriormente poderão resgatar os tokens por uma quantia proporcional em moeda fiduciária.
Os usuários podem usar seus tokens de diversas formas – eles podem comprar bens e serviços ou usá-los em DApps. Além disso, eles podem, a qualquer momento, solicitar ao emissor que efetue o câmbio com moeda fiduciária. Nesse caso, o emissor
queima os tokens devolvidos (tornando-os inutilizáveis) e retira a quantidade correspondente de moeda fiduciária de suas reservas.
O contrato que rege esse sistema, conforme mencionado, é relativamente simples. No entanto, o lançamento de uma stablecoin requer muito trabalho em termos de logística, conformidade regulatória, etc.
Tokens de segurança
Os
tokens de segurança são semelhantes às stablecoins. A nível de contrato, os dois podem ser até idênticos, pois funcionam da mesma maneira. A distinção ocorre a nível de emissão. Os tokens de segurança representam valores mobiliários, como ações, títulos ou ativos físicos. Freqüentemente (embora nem sempre seja o caso), eles concedem ao detentor do token, algum tipo de participação em um negócio ou bem.
Tokens de utilidade
Tokens de utilidade são talvez os tipos mais comuns de tokens atualmente. Ao contrário das duas propostas anteriores, eles não são atrelados a nada. Fazendo uma analogia, se os tokens atrelados a ativos forem ações de uma companhia aérea, os tokens de utilidade atuam como os programas de fidelidade de passageiros: eles têm uma função, mas não têm valor externo. Tokens de utilidade podem atender a diversos casos de uso, servindo como
moeda de jogos, "combustível" para aplicativos descentralizados, pontos de fidelidade e muito mais.
É possível minerar ether (ETH), mas os tokens não podem ser minerados – dizemos que eles são cunhados quando novos tokens são criados. Quando um contrato é lançado, os desenvolvedores distribuem o fornecimento de acordo com seus planos e roteiro.
Normalmente, isso é feito através de uma
Initial Coin Offering (ICO),
Initial Exchange Offering (IEO) ou Security Token Offering (STO). Você pode encontrar variações dessas siglas, mas os conceitos são semelhantes. Investidores enviam ether para o endereço do contrato e em troca, recebem novos tokens. O dinheiro arrecadado é usado para financiar o desenvolvimento do projeto. Os usuários poderão usar seus tokens (imediatamente ou em uma data posterior) ou revendê-los com lucro à medida que o projeto se desenvolve.
A distribuição de tokens não precisa ser automatizada. Muitos eventos de crowdfunding permitem que os usuários paguem com diversas moedas digitais (como BNB, BTC, ETH e USDT). Os respectivos saldos são então alocados aos endereços fornecidos pelos usuários.
Prós dos tokens ERC-20
Fungibilidade
Tokens ERC-20 são
fungíveis – cada unidade é intercambiável com a outra. Supondo que você tenha um BinanceAcademyToken, não importa qual token específico você tem. Você poderia trocá-lo com o de outra pessoa e eles ainda seriam funcionalmente idênticos, assim como dinheiro ou ouro.
Essa propriedade é ideal para tokens usados como algum tipo moeda. Para esse tipo de token, não é interessante que unidades individuais tenham características distintas, o que os tornaria não fungíveis. A não fungibilidade pode fazer com que alguns tokens se tornem mais – ou menos – valiosos do que outros do mesmo tipo, prejudicando seu propósito.
Flexibilidade
Conforme discutido na seção anterior, os tokens ERC-20 são customizáveis e podem ser adaptados para diferentes aplicações. Por exemplo, eles podem ser usados como moeda em jogos, em programas de pontos de fidelidade, como
colecionáveis digitais ou até mesmo para representar obras de arte e direitos de propriedade.
Popularidade
A popularidade dos tokens ERC-20 na indústria de criptomoedas é um motivo muito convincente para usá-los como modelo. Existe uma infinidade de corretoras, carteiras e contratos inteligentes já compatíveis com tokens recém-lançados. Além disso, o suporte e a documentação de desenvolvedores são abundantes.
Contras dos tokens ERC-20
Escalabilidade
Como acontece com muitas redes de criptomoedas, a Ethereum não é imune às "dores" do crescimento. Em sua forma atual, ela não apresenta boa escalabilidade – o envio de uma transação em horários de pico implica em atrasos e altas taxas. Se você lançar um token ERC-20 e a rede estiver congestionada, sua usabilidade pode ser afetada.
Este não é um problema exclusivo da Ethereum. É um trade-off, ou seja, uma troca necessária, em sistemas distribuídos e seguros. A comunidade da Ethereum planeja resolver esses problemas na migração para a
Ethereum 2.0, que implementará atualizações como
Ethereum Plasma e
Ethereum Casper.
Fraudes
Embora não seja um problema com a tecnologia em si, a facilidade com que um token pode ser lançado pode ser considerada uma desvantagem em alguns aspectos. É necessário um pequeno esforço para criar um token ERC-20 simples, o que significa que qualquer um poderia fazê-lo – para o bem ou para o mal.
Sendo assim, você deve ter cuidado com seus investimentos. Existem vários
esquemas de Pirâmide e Ponzi disfarçados de projetos blockchain.
Faça pesquisas antes de investir e tire suas próprias conclusões em relação à legitimidade de uma oportunidade.
O ERC-20 foi o primeiro (e até o momento, o mais popular) padrão de token Ethereum, mas não é o único. Com o passar dos anos, muitos outros surgiram, propondo melhorias em relação ao ERC-20 ou apresentando propostas totalmente diferentes.
Alguns padrões menos comuns são os usados em
tokens não fungíveis (NFTs). Às vezes, seu caso de uso se beneficia de ter tokens exclusivos, com atributos diferentes. Se você quiser, por exemplo, tokenizar uma rara obra de arte ou um recurso em um jogo, pode ser uma boa ideia usar um desses tipos de contrato.
O padrão
ERC-721, por exemplo, foi usado para o super popular CryptoKitties DApp. Esse contrato fornece uma
API para que os usuários possam criar seus próprios tokens não fungíveis e codificar
metadados (imagens, descrições, etc.).
O padrão ERC-1155 pode ser visto como uma melhoria dos padrões ERC-721 e ERC-20. Esse padrão oferece suporte a tokens fungíveis e não fungíveis no mesmo contrato.
Outras opções, como ERC-223 ou ERC-621, visam melhorar a usabilidade. O primeiro implementa proteções para evitar transferências acidentais de tokens. Já o ERC-621, adiciona funções extras para aumentar ou diminuir o fornecimento de tokens.
O padrão ERC-20 dominou o meio dos criptoativos por anos e não é difícil de entender o porquê. Com relativa facilidade, qualquer pessoa pode implantar um contrato simples para atender a uma ampla variedade de casos de uso (tokens de utilidade, stablecoins, etc.). Entretanto, o ERC-20 não possui alguns dos recursos fornecidos por outros padrões. Resta saber se os novos tipos de contratos tomarão seu lugar.