SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
06.12.2024

Lição 248: Entendendo EIP-20, EIP-721, EIP-1155

No mundo do Ethereum, diversos padrões foram estabelecidos para criar e gerenciar tokens na blockchain. Três dos padrões mais proeminentes são EIP-20, EIP-721 e EIP-1155. Esta lição fornecerá uma visão geral de cada padrão, seu propósito e como implementá-lo em Solidity.

EIP-20: Padrão de Token ERC-20

O padrão EIP-20, comumente referido como o padrão ERC-20, define um conjunto de regras para a criação de tokens fungíveis na blockchain do Ethereum. Tokens fungíveis são intercambiáveis e têm o mesmo valor; por exemplo, um token ERC-20 tem o mesmo valor que outro do mesmo tipo.

Funções Básicas do ERC-20

As principais funções de um token ERC-20 incluem:

  • transfer: Permite a transferência de tokens do remetente para outro endereço.
  • approve: Permite que um gastador retire tokens da conta do proprietário.
  • transferFrom: Transfere tokens de um endereço para outro em nome do proprietário.

Exemplo de Implementação de um Token ERC-20

Aqui está uma implementação simples de um token ERC-20:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MeuToken {
    string public nome = "MeuToken";
    string public simbolo = "MTK";
    uint8 public decimals = 18;
    uint256 public suprimentoTotal = 1000000 * (10 ** uint256(decimals));

    mapping(address => uint256) public saldoDe;
    mapping(address => mapping(address => uint256)) public autorização;

    constructor() {
        saldoDe[msg.sender] = suprimentoTotal;
    }

    function transfer(address _para, uint256 _valor) public returns (bool sucesso) {
        require(saldoDe[msg.sender] >= _valor, "Saldo insuficiente.");
        saldoDe[msg.sender] -= _valor;
        saldoDe[_para] += _valor;
        emit Transfer(msg.sender, _para, _valor);
        return true;
    }

    function approve(address _gasteiro, uint256 _valor) public returns (bool sucesso) {
        autorização[msg.sender][_gasteiro] = _valor;
        emit Approval(msg.sender, _gasteiro, _valor);
        return true;
    }

    function transferFrom(address _de, address _para, uint256 _valor) public returns (bool sucesso) {
        require(saldoDe[_de] >= _valor, "Saldo insuficiente.");
        require(autorização[_de][msg.sender] >= _valor, "Autorização excedida.");
        saldoDe[_de] -= _valor;
        saldoDe[_para] += _valor;
        autorização[_de][msg.sender] -= _valor;
        emit Transfer(_de, _para, _valor);
        return true;
    }

    event Transfer(address indexed _de, address indexed _para, uint256 _valor);
    event Approval(address indexed _proprietário, address indexed _gasteiro, uint256 _valor);
}

EIP-721: Padrão de Token ERC-721

O padrão ERC-721 define um protocolo para tokens não-fungíveis (NFTs). Ao contrário dos tokens fungíveis, os NFTs são únicos e não podem ser trocados um a um. Este padrão é amplamente utilizado para colecionáveis digitais, obras de arte e outros itens onde a singularidade é importante.

Funções Principais do ERC-721

As funções principais que costumam ser encontradas em um contrato ERC-721 incluem:

  • ownerOf: Retorna o proprietário de um token específico.
  • transferFrom: Transfere um token de um endereço para outro.
  • approve: Concede permissão a outro endereço para transferir um token.

Exemplo de Implementação de um Token ERC-721

Abaixo está uma implementação básica de um token ERC-721:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MeuNFT {
    string public nome = "MeuNFT";
    string public simbolo = "MNFT";

    mapping(uint256 => address) private _proprietarios;
    mapping(address => uint256) private _saldos;

    uint256 private _proximoIdToken;

    function criar() public {
        uint256 idToken = _proximoIdToken++;
        _proprietarios[idToken] = msg.sender;
        _saldos[msg.sender] += 1;
        emit Transfer(address(0), msg.sender, idToken);
    }

    function ownerOf(uint256 idToken) public view returns (address) {
        require(_proprietarios[idToken] != address(0), "Token não existe.");
        return _proprietarios[idToken];
    }

    function transferFrom(address de, address para, uint256 idToken) public {
        require(_proprietarios[idToken] == de, "Você não possui este token.");
        require(para != address(0), "Não pode transferir para o endereço zero.");

        _proprietarios[idToken] = para;
        _saldos[de] -= 1;
        _saldos[para] += 1;
        emit Transfer(de, para, idToken);
    }

    event Transfer(address indexed de, address indexed para, uint256 indexed idToken);
}

EIP-1155: Padrão de Token ERC-1155

O padrão ERC-1155 foi projetado para criar uma forma mais flexível e eficiente de gerenciar tokens fungíveis e não-fungíveis dentro de um único contrato. Isso permite a criação de ambientes complexos de jogos e ativos digitais.

Principais Recursos do ERC-1155

Os principais recursos do ERC-1155 incluem:

  • Transferências em lote de tokens para otimizar o uso de gás.
  • Suporte para tanto tokens fungíveis quanto não-fungíveis.
  • IDs únicos para cada tipo de token.

Exemplo de Implementação de um Token ERC-1155

Aqui está um exemplo simples de uma implementação ERC-1155:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MeuMultiToken {
    mapping(uint256 => mapping(address => uint256)) public saldos;

    function criar(uint256 id, uint256 quantidade) public {
        saldos[id][msg.sender] += quantidade;
    }

    function transfer(address para, uint256 id, uint256 quantidade) public {
        require(saldos[id][msg.sender] >= quantidade, "Saldo insuficiente.");
        saldos[id][msg.sender] -= quantidade;
        saldos[id][para] += quantidade;
    }

    function saldoOf(address proprietário, uint256 id) public view returns (uint256) {
        return saldos[id][proprietário];
    }
}

Conclusão

Em conclusão, entender EIP-20, EIP-721 e EIP-1155 é crucial para qualquer desenvolvedor de Solidity interessado no ecossistema Ethereum. Cada padrão serve a um propósito único: EIP-20 para tokens fungíveis, EIP-721 para tokens não-fungíveis e EIP-1155 para uma abordagem mais versátil na gestão de tokens. Ao aproveitar esses padrões, os desenvolvedores podem criar contratos de tokens robustos e eficientes adaptados às suas necessidades específicas.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!