ERC20: O que é, como funciona e como criar seu token na prática
O padrão ERC‑20 é a espinha dorsal da maioria dos tokens que circulam no ecossistema Ethereum. Desde a sua introdução em 2015, ele permite que desenvolvedores criem ativos digitais interoperáveis, facilitando trocas, integrações com exchanges e o desenvolvimento de aplicações descentralizadas (dApps). Neste artigo, vamos explorar em profundidade o que é o ERC‑20, seu histórico, a arquitetura técnica, vantagens, limitações e, passo a passo, como você pode criar seu próprio token usando Solidity.
Principais Pontos
- ERC‑20 é um padrão de smart contract que define funções básicas para tokens fungíveis.
- Foi proposto por Fabian Vogelsteller e Vitalik Buterin em 2015.
- Facilita a interoperabilidade entre wallets, exchanges e dApps.
- Possui funções essenciais:
totalSupply,balanceOf,transfer,approve,allowanceetransferFrom. - Limitações incluem falta de controle de eventos de queima e ausência de extensões nativas para funcionalidades avançadas.
O que é o ERC‑20?
ERC‑20 (Ethereum Request for Comments 20) é um standard interface para tokens fungíveis criados na blockchain Ethereum. Um token fungível tem unidades intercambiáveis – assim como reais ou dólares – ao contrário de tokens não‑fungíveis (NFTs) que são únicos. O padrão define um conjunto de funções e eventos que um contrato inteligente deve implementar para ser reconhecido como um token ERC‑20 pelos principais softwares da rede.
Histórico e origem
Em novembro de 2015, o desenvolvedor Fabian Vogelsteller enviou a proposta ERC‑20 ao Ethereum Improvement Proposal (EIP) 20. A ideia era padronizar a forma como os tokens eram criados e gerenciados, evitando a necessidade de escrever códigos diferentes para cada novo ativo. A proposta foi rapidamente aceita, e o primeiro token a adotar o padrão foi o MKR, seguido pelo OMG. Desde então, milhares de tokens – como USDT, USDC, LINK e UNI – utilizam o ERC‑20.
Como funciona o padrão ERC‑20
O contrato ERC‑20 deve implementar seis funções obrigatórias e três eventos opcionais. Cada função tem um propósito específico:
Funções obrigatórias
- totalSupply(): retorna o número total de tokens em circulação.
- balanceOf(address account): devolve o saldo de tokens de um endereço específico.
- transfer(address recipient, uint256 amount): move tokens da conta que chama a função para outra conta.
- allowance(address owner, address spender): indica quanto o
spenderestá autorizado a gastar em nome doowner. - approve(address spender, uint256 amount): concede ao
spenderpermissão para gastar atéamounttokens. - transferFrom(address sender, address recipient, uint256 amount): permite que o
spendertransfira tokens desenderpararecipientusando a autorização prévia.
Eventos opcionais
- Transfer(address indexed from, address indexed to, uint256 value): disparado sempre que tokens são transferidos.
- Approval(address indexed owner, address indexed spender, uint256 value): disparado quando
approveé chamada.
Essas funções garantem que todas as carteiras (wallets), exchanges e dApps possam interagir com qualquer token ERC‑20 de forma padronizada, sem precisar de adaptações específicas.
Arquitetura técnica detalhada
Um contrato ERC‑20 típico contém três componentes principais:
- Mapeamento de saldos:
mapping(address => uint256) private _balances;armazena o número de tokens de cada endereço. - Mapeamento de autorizações:
mapping(address => mapping(address => uint256)) private _allowances;controla quanto cada endereço pode gastar em nome de outro. - Variável de totalSupply:
uint256 private _totalSupply;registra a quantidade total de tokens emitidos.
Além disso, o contrato deve implementar verificações de segurança, como overflow (usando SafeMath ou a verificação nativa do Solidity ^0.8.0) e proteção contra ataques de reentrancy nas funções de transferência.
Principais usos e tokens populares
Tokens ERC‑20 são usados em diversos cenários:
- Stablecoins: USDT, USDC, BUSD – moedas digitais atreladas ao dólar.
- Governança: UNI (Uniswap), COMP (Compound) – dão direitos de voto em protocolos DeFi.
- Utility tokens: LINK (Chainlink) – pagam por serviços de oráculo.
- Fundraising: ICOs e IEOs utilizam ERC‑20 para distribuir tokens aos investidores.
Esses ativos são negociados em quase todas as exchanges centralizadas (CEX) e descentralizadas (DEX) que suportam Ethereum.
Vantagens do padrão ERC‑20
- Interoperabilidade: qualquer wallet ou DEX que suporte ERC‑20 pode lidar com o token sem customizações.
- Facilidade de desenvolvimento: bibliotecas como OpenZeppelin fornecem implementações prontas.
- Liquidez: a ampla adoção cria mercados profundos e pares de negociação.
- Transparência: todas as transações são públicas e auditáveis na blockchain.
Limitações e críticas ao ERC‑20
- Falta de suporte nativo a queima (burn): é preciso implementar funções adicionais.
- Não há mecanismo de pausa (pause) embutido: contratos vulneráveis podem ser pausados apenas por extensões.
- Problemas de aprovação dupla: ataques de race condition podem ocorrer se o usuário não zerar a aprovação antes de mudar o valor.
- Escalabilidade: transações de token competem por gás com outras operações da rede Ethereum.
Comparação com outros padrões (ERC‑721, ERC‑1155)
Enquanto ERC‑20 define tokens fungíveis, ERC‑721 trata de tokens não‑fungíveis (NFTs) e ERC‑1155 combina ambos, permitindo que um único contrato gerencie múltiplos tipos de ativos. A escolha do padrão depende do caso de uso: se você precisa de unidades indistintas, ERC‑20 é o caminho; se cada unidade tem atributos únicos, opte por ERC‑721 ou ERC‑1155.
Como criar seu próprio token ERC‑20
A seguir, um tutorial passo a passo usando Remix e a biblioteca OpenZeppelin:
Passo 1: Configurar o ambiente
- Acesse
https://remix.ethereum.orge crie um novo arquivoMyToken.sol. - No painel esquerdo, selecione a aba Solidity Compiler e escolha a versão ^0.8.20.
Passo 2: Importar a implementação padrão
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply * 10 ** decimals());
}
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
}
Passo 3: Compilar e implantar
- Clique em Compile MyToken.sol. Se não houver erros, vá para a aba Deploy & Run Transactions.
- Selecione a conta que será a owner e insira o
initialSupply(ex.:1000000para 1 milhão). - Clique em Deploy. O contrato será publicado na rede de teste selecionada (por exemplo, Sepolia).
Passo 4: Verificar o contrato
Após a implantação, use o endereço gerado para consultar o contrato no Etherscan. As funções mint e burn já estão disponíveis, proporcionando controle de suprimento.
Segurança e melhores práticas
Mesmo com a robustez de OpenZeppelin, é essencial adotar boas práticas de segurança:
- Utilize Solidity >=0.8.0: elimina a necessidade de SafeMath, pois o compilador já verifica overflow.
- Proteja funções críticas com o modificador
onlyOwnerou um sistema de governança. - Implemente a estratégia de aprovação dupla: antes de mudar o valor de
allowance, primeiro defina para zero. - Teste extensivamente usando frameworks como Hardhat ou Truffle.
- Audite o código com empresas especializadas ou use ferramentas automáticas como Slither.
Ferramentas e recursos úteis
Para quem deseja aprofundar-se no desenvolvimento de tokens ERC‑20, recomendamos:
- Remix IDE – ambiente online rápido para prototipagem.
- Hardhat – framework avançado para testes e deploys.
- OpenZeppelin Contracts – biblioteca padrão de contratos seguros.
- Guia de Ethereum – para entender a camada subjacente.
- Guia token ERC‑20 – tutorial detalhado com exemplos reais.
FAQ – Perguntas Frequentes
| Pergunta | Resposta |
|---|---|
| É possível mudar o nome de um token ERC‑20 depois de criado? | Sim, porém requer que o contrato inclua funções de atualização e que a maioria das wallets reconheça o novo nome via metadados. |
Qual a diferença entre transfer e transferFrom? |
transfer move tokens diretamente do remetente que chama a função. transferFrom permite que um terceiro (spender) transfira tokens em nome do proprietário, usando a autorização prévia estabelecida por approve. |
| Tokens ERC‑20 consomem muito gás? | Em média, uma transferência padrão custa cerca de 21.000 a 30.000 gas, o que equivale a aproximadamente R$0,30 a R$0,50 em taxas na rede principal (dependendo do preço do ETH). |
Conclusão
O padrão ERC‑20 consolidou-se como o alicerce dos tokens fungíveis no ecossistema Ethereum, proporcionando interoperabilidade, liquidez e facilidade de desenvolvimento. Apesar de suas limitações – como a ausência de funções nativas de queima ou pausa – ele continua evoluindo através de extensões e boas práticas adotadas pela comunidade. Ao compreender a arquitetura técnica, as funções essenciais e as medidas de segurança, desenvolvedores brasileiros podem criar tokens robustos, integrar-se a exchanges e participar ativamente da revolução descentralizada. Se você está começando ou já tem experiência intermediária, dominar o ERC‑20 é um passo fundamental para projetar soluções inovadoras no universo cripto.