WEB3DEV

Cover image for ERC-20: O Padrão que Alimenta a Revolução da Blockchain
Paulo Gio
Paulo Gio

Posted on

ERC-20: O Padrão que Alimenta a Revolução da Blockchain

A plataforma Ethereum fornece um ecossistema rico para o desenvolvimento e implantação de contratos inteligentes, facilitando a criação de aplicações descentralizadas (dApps). Entre os padrões criados na blockchain Ethereum, o padrão ERC-20 é de particular importância. Ele descreve uma interface comum que permite a interoperabilidade entre tokens. Neste artigo, exploraremos em detalhes o padrão ERC-20, ilustrando seu funcionamento através de exemplos de código.

Sumário

Introdução ao ERC-20

A sigla ERC corresponde a "Ethereum Request for Comment". Trata-se do procedimento formal para apresentação de propostas que visam aprimorar o sistema Ethereum, as chamadas "Ethereum Improvement Proposals" ou EIPs. O número 20 é o identificador exclusivo para uma proposta que estabelece um padrão universal para os tokens.

O padrão ERC-20 é uma prescrição de regras que todos os tokens baseados na rede Ethereum precisam obedecer. Estas regras delimitam um conjunto específico de funções e eventos que devem ser incorporados ao contrato inteligente de cada token. Essas funções e eventos incluem, por exemplo, como as transações de tokens são aprovadas e como os usuários podem acessar dados sobre o token.

Essa padronização proposta pelo ERC-20 trouxe uma série de benefícios para o ecossistema Ethereum. A principal vantagem é a facilidade de interação entre diferentes contratos inteligentes e tokens. Uma vez que todos seguem a mesma estrutura básica, é possível desenvolver uma gama de aplicações que podem interagir de maneira confiável com qualquer token, sem precisar entender as peculiaridades de cada token individualmente.

Além disso, o padrão ERC-20 contribuiu para o boom de Ofertas Iniciais de Moedas (ICOs), uma vez que tornou mais fácil para os desenvolvedores emitir novos tokens e para os investidores adquiri-los e negociá-los. A padronização também facilitou a integração de tokens ERC-20 em exchanges e carteiras digitais, impulsionando ainda mais a adoção e uso desses ativos digitais.

Análise da Interface ERC-20

Vamos começar a nossa análise técnica explorando a interface ERC-20. Em Solidity, uma linguagem de programação usada para escrever contratos inteligentes na Ethereum, a interface é definida da seguinte maneira:

pragma solidity ^0.8.0;

interface ERC20Interface {
    function totalSupply() external view returns (uint);
    function balanceOf(address tokenOwner) external view returns (uint balance);
    function allowance(address tokenOwner, address spender) external view returns (uint remaining);
    function transfer(address to, uint tokens) external returns (bool success);
    function approve(address spender, uint tokens) external returns (bool success);
    function transferFrom(address from, address to, uint tokens) external returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
Enter fullscreen mode Exit fullscreen mode

Vamos examinar cada uma das funções e eventos dessa interface.

totalSupply()

Essa função retorna a quantidade total de tokens que estão em circulação. Esta função é somente de leitura, ou seja, não pode alterar o estado do contrato inteligente.

balanceOf()

A função balanceOf retorna a quantidade de tokens detida por uma conta específica (ou seja, um endereço Ethereum). Assim como totalSupply, essa função também é somente de leitura.

allowance()

A função allowance é usada para verificar a quantidade de tokens que um proprietário permitiu que uma outra conta transferisse em seu nome. Essa função é especialmente útil para contratos inteligentes que interagem com tokens ERC-20.

transfer()

A função transfer permite que um endereço transfira uma quantidade específica de tokens diretamente para outro endereço. Se a transferência for bem-sucedida, a função retornará true, e um evento Transfer será emitido.

approve()

A função approve permite que um endereço de conta (o titular do token) aprove outro endereço (geralmente um contrato inteligente) para retirar tokens de sua conta. Se a aprovação for bem-sucedida, a função retornará true, e um evento Approval será emitido.

transferFrom()

A função transferFrom permite que um endereço de conta transfira tokens em nome de outra conta, desde que tenha uma permissão suficiente. Se a transferência for bem-sucedida, a função retornará true, e um evento Transfer será emitido.

Eventos: Transfer e Approval

Os eventos são usados pelos contratos inteligentes para emitir alterações de estado que podem ser 'ouvidas' por ouvintes fora da blockchain. No caso dos tokens ERC-20, estes dois eventos devem ser emitidos quando ocorre uma transferência ou aprovação de tokens.

Implementação Básica do Contrato ERC-20

Agora que entendemos a interface ERC-20, vamos prosseguir com uma implementação básica do contrato ERC-20.

pragma solidity ^0.8.0;

// Definindo o contrato do token
contract MeuToken {
    // Nome público do token
    string public name;
    // Símbolo público do token
    string public symbol;
    // Número de casas decimais do token
    uint8 public decimals;
    // Oferta total de tokens
    uint256 public totalSupply;

    // Mapeamento para armazenar o saldo de cada proprietário
    mapping (address => uint256) public balanceOf;
    // Mapeamento para armazenar o valor que um endereço pode gastar em nome de outro
    mapping (address => mapping (address => uint256)) public allowance;

    // Evento que é acionado quando tokens são transferidos
    event Transfer(address indexed from, address indexed to, uint256 value);
    // Evento que é acionado quando uma permissão de gasto é aprovada
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // Construtor do contrato
    constructor(string memory tokenName, string memory tokenSymbol, uint8 decimalUnits, uint256 initialSupply) {
        // Definindo o nome do token
        name = tokenName;
        // Definindo o símbolo do token
        symbol = tokenSymbol;
        // Definindo o número de casas decimais
        decimals = decimalUnits;
        // Definindo a oferta total inicial
        totalSupply = initialSupply;
        // Atribuindo a oferta total inicial ao criador do contrato
        balanceOf[msg.sender] = initialSupply;
    }

    // Função para transferir tokens de um endereço para outro
    function transfer(address _to, uint256 _value) public returns (bool success) {
        // Exige que o remetente tenha saldo suficiente
        require(balanceOf[msg.sender] >= _value);
        // Subtrai o valor do saldo do remetente
        balanceOf[msg.sender] -= _value;
        // Adiciona o valor ao saldo do destinatário
        balanceOf[_to] += _value;
        // Emite o evento de transferência
        emit Transfer(msg.sender, _to, _value);
        // Retorna verdadeiro se a transferência for bem sucedida
        return true;
    }

    // Função para aprovar um endereço a gastar tokens em seu nome
    function approve(address _spender, uint256 _value) public returns (bool success) {
        // Define a permissão de gasto
        allowance[msg.sender][_spender] = _value;
        // Emite o evento de aprovação
        emit Approval(msg.sender, _spender, _value);
        // Retorna verdadeiro se a aprovação for bem sucedida
        return true;
    }

    // Função para transferir tokens de um endereço para outro em nome de alguém
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        // Exige que o remetente (_from) tenha saldo suficiente
        require(_value <= balanceOf[_from]);
        // Exige que o remetente tenha permissão suficiente para gastar
        require(_value <= allowance[_from][msg.sender]);

        // Subtrai o valor do saldo do remetente
        balanceOf[_from] -= _value;
        // Adiciona o valor ao saldo do destinatário
        balanceOf[_to] += _value;
        // Reduz a permissão de gasto
        allowance[_from][msg.sender] -= _value;
        // Emite o evento de transferência
        emit Transfer(_from, _to, _value);
        // Retorna verdadeiro se a transferência for bem sucedida
        return true;
    }
}
Enter fullscreen mode Exit fullscreen mode

Ao examinar o contrato, vemos que ele é estruturado da seguinte maneira:

Variáveis Públicas: Existem quatro variáveis públicas que definem as características básicas do token: name (nome do token), symbol (símbolo do token), decimals (número de casas decimais do token) e totalSupply (oferta total de tokens). Essas são propriedades básicas de qualquer token ERC-20.

Mapeamentos: O contrato usa dois mapeamentos (estruturas de dados semelhantes a um hashmap ou dicionário em outras linguagens) para rastrear a propriedade dos tokens. balanceOf é usado para rastrear o saldo de tokens de cada endereço. allowance é usado para rastrear quanto um endereço pode gastar em nome de outro.

Eventos: Os eventos Transfer e Approval são emitidos quando tokens são transferidos ou uma permissão de gasto é aprovada, respectivamente. Isso permite que as transações sejam rastreadas na blockchain.

Construtor: O construtor é chamado uma vez, quando o contrato é implantado pela primeira vez. Ele configura as propriedades básicas do token e atribui o suprimento inicial ao criador do contrato.

Funções: O contrato define três funções principais: transfer, approve e transferFrom. transfer permite que um endereço envie tokens para outro endereço. approve permite que um endereço aprove outro endereço para gastar um certo número de tokens em seu nome. transferFrom permite que um endereço aprovado transfira tokens em nome de outro endereço.

Todos esses aspectos cumprem as especificações do padrão ERC-20, permitindo que este token interaja com outros contratos e carteiras que suportam o padrão. Cada função também tem verificações require para garantir que as ações não possam ser realizadas se as condições não forem atendidas (por exemplo, você não pode transferir mais tokens do que você possui).

Aqui estão algumas coisas importantes para lembrar ao trabalhar com contratos de token ERC-20:

Sempre teste seu contrato antes de implantá-lo: Embora este exemplo seja bastante simples, contratos mais complexos podem ter erros sutis que podem levar a perdas financeiras. Sempre teste seu contrato em um ambiente seguro (como em uma rede de testes da Ethereum. Ex: Sepolia) antes de implantá-lo na rede principal.

Entenda as implicações de segurança: A programação de contratos inteligentes é semelhante à programação de segurança. Se um invasor puder encontrar uma vulnerabilidade em seu contrato, ele poderá ser capaz de roubar ou destruir tokens. Certifique-se de entender as melhores práticas de segurança de contratos inteligentes e considere a obtenção de uma auditoria de segurança de um especialista.

Esteja ciente dos custos do gás: Cada operação em um contrato inteligente custa uma certa quantidade de gás, que é pago em Ether (ETH). As operações de leitura (como verificar o saldo de uma conta) são geralmente baratas, mas as operações de gravação (como transferir tokens) podem ser mais caras. Tenha isso em mente ao projetar a interface do usuário do seu token.

Contratos de token ERC-20 como este são a base para uma grande parte do ecossistema de criptomoedas atual. Seja você um desenvolvedor criando seu próprio token, um usuário tentando entender como os tokens funcionam, ou um investidor tentando avaliar a qualidade de um token, entender contratos de token ERC-20 é uma habilidade valiosa.

Conclusão

A padronização trazida pelo ERC-20 tem sido fundamental para o crescimento acelerado e a diversidade de projetos baseados em blockchain, principalmente no universo das Finanças Descentralizadas (DeFi). Esta padronização não apenas simplificou o processo de criação e troca de tokens na rede Ethereum, mas também garantiu uma consistência fundamental que permite a interoperabilidade entre diferentes tokens e aplicações.

Isso significa que um token ERC-20, independentemente de sua funcionalidade específica ou propósito, pode ser facilmente integrado, negociado ou utilizado em qualquer aplicação compatível com ERC-20 na rede Ethereum. Este nível de interconexão e padronização possibilitou a criação de um ecossistema vibrante e integrado, onde os usuários têm a liberdade e a flexibilidade para interagir com uma variedade de aplicações e serviços usando uma gama de tokens ERC-20.

Portanto, para desenvolvedores que buscam criar e lançar suas próprias aplicações na rede Ethereum, o domínio do padrão ERC-20 e a compreensão de suas funcionalidades e implementações tornam-se habilidades essenciais. Ao entender o ERC-20, os desenvolvedores podem garantir que seus tokens sejam compatíveis com uma ampla gama de carteiras, exchanges e outros contratos inteligentes, aumentando a utilidade, liquidez e, finalmente, o sucesso de seus próprios projetos.

Além disso, o conhecimento do ERC-20 permite aos desenvolvedores entender as práticas de segurança necessárias para proteger os ativos dos usuários, compreender a economia do gás para otimizar a eficiência do contrato e garantir que estão seguindo as melhores práticas para a criação de tokens e contratos inteligentes.

Em suma, o padrão ERC-20 é uma ferramenta poderosa que alimentou a revolução DeFi e continua a ser a espinha dorsal de muitos projetos inovadores em blockchain. Compreendê-lo não só abre portas para a criação de novas soluções, mas também é fundamental para contribuir e prosperar no vibrante e em constante evolução ecossistema Ethereum.

Referências

ERC-20: Token Standard - https://eips.ethereum.org/EIPS/eip-20


Participe do Grupo de Estudos em Solidity:
O Grupo de Estudos em Solidity da WEB3DEV é dedicado a desvendar os segredos da programação na blockchain, como explorar as fascinantes possibilidades das NFTs (Non-Fungible Tokens). Com uma abordagem inovadora e interativa, o grupo realiza eventos gratuitos e abertos ao público, nas terças-feiras, a partir das 20h30 no Discord, oferecendo aos participantes uma oportunidade única de aprender, compartilhar conhecimentos e interagir com especialistas no campo.

Se você é apaixonado por tecnologia, blockchain e NFTs, não perca a oportunidade de participar do Grupo de Estudos em Solidity e vivenciar a emocionante exploração do mundo da programação na blockchain e suas infinitas possibilidades. Os eventos são gratuitos e abertos a todos que desejam aprender e colaborar nesse campo em constante evolução. Junte-se a nós e faça parte dessa jornada rumo ao futuro descentralizado.

Latest comments (0)