🇧🇷
Ethereum Developer Pack - PT
  • Ethereum Developer Pack - PT
  • Módulo 1
    • Introdução a Smart Contracts
      • Fundamentos de Blockchain
        • Histórico
        • Bitcoin
        • O que é Blockchain
        • Conceitos-chave em Blockchain
        • Como funciona a Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • A nova Internet
        • Web 3
        • Elementos Fundamentais
        • Impacto do Ethereum em Diversos Setores
      • Wallets
        • Componentes de uma wallet
        • Tipos de Wallet
        • Códigos Mnemônicos
      • Ethereum 101
        • Smart Contracts
        • Contas
          • Tipos de contas
          • Conteúdo das contas
        • Transações
          • Componentes
          • Ciclo de vida
        • Gás
        • Solidity
        • EVM
          • A máquina de estados
          • Opcodes
          • Como funciona a EVM
          • Clientes de execução
          • DApps
      • Blockchain Explorer
        • Funções de um blockchain explorer
        • Beneficios de utilizar um blockchain explorer
      • Remix
        • Características do Remix
        • Workspaces ou espaços de trabalho
        • Carregar e compilar um contrato
        • Implantar na máquina virtual do Remix (Remix VM)
        • Interagindo com funções
        • Deployar em uma rede pública
      • Crie seu primeiro Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Dados
      • Funções
      • Variáveis
        • Exercício 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Exercício 3
      • Convenções de nomenclatura
      • Tipos de armazenamento para variáveis
      • Estruturas de Controle
        • Exercício 4
      • Modificadores
      • Eventos
        • Exercício 5
      • Tipos de Referencia
        • Arrays
          • Exercício 6
        • Mappings
          • Exercício 7
        • Structs
          • Exercício 8
      • Address Payable
      • Como os contratos e funções recebem Ether.
      • Transferências de Ether
      • Conceitos Avançados
        • Codificação de ABI
        • Hashing
        • This
        • Herança
        • Abstract
        • Interface
        • Chamada entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • ERCs, Bibliotecas e Padrões de Desenvolvimento
      • Boas Práticas de Desenvolvimento
      • Padrões de Desenvolvimento
      • EIP & ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crie um Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Kit de ferramentas para desenvolvimento na Ethereum
      • Requisitos para o módulo 4
        • Terminal
        • Git e Github
        • Node.js e npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Exercício
        • Hardhat
          • Implantação de um contrato no Hardhat
          • Implantação de um contrato em uma rede pública
        • Scaffold-ETH
          • Características do Scaffold-ETHCaracterísticas
          • Como instalar o Scaffold-ETH
  • Módulo 5
    • Segurança, Testes e Auditorias
      • Testes
        • Importância de realizar testes
        • Métodos para testar contratos inteligentes
          • Testes automatizados
          • Testes manuais
        • Conceitos importantes em testes
        • Ferramentas para testes
        • Testes com Hardhat
        • Recursos adicionais
      • Segurança
        • Uma mentalidade diferente de design
        • Principais vulnerabilidades em contratos inteligentes
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Quebra de Invariantes)
          • Mishandling of ETH (Má gestão de ETH)
          • Denial of Service (DoS - Negação de Serviço)
          • Integer overflow and underflow (Overflow e Underflow de inteiros)
          • Phishing y Typosquatting
        • Recursos adicionais
      • Auditoria de smart contracts
        • Processo de Auditoria
        • Ferramentas
        • Como se preparar para uma auditoria
        • O teste Rekt
        • Desafios
        • Recursos adicionais
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  • Transfer
  • Send
  • Call
  1. Módulo 2
  2. Fundamentos de Solidity

Transferências de Ether

Solidity oferece várias formas de enviar Ether de um contrato para um endereço externo, cada uma com suas próprias implicações em termos de segurança, gás e comportamento em caso de falha. Essas formas são transfer, send e chamadas de baixo nível (call).

Transfer

O método transfer é uma forma segura de enviar Ether, pois reverte automaticamente toda a transação se a transferência falhar por qualquer motivo. É a maneira recomendada de enviar Ether quando se deseja que toda a transação falhe caso a transferência de Ether não possa ser concluída.

address payable receiver = payable(0x123...);

receiver.transfer(amount);

Se a transferência falhar, a execução é interrompida e revertida.

Send

O método send é semelhante ao transfer, mas em vez de reverter automaticamente, retorna um valor booleano (true ou false) indicando o sucesso ou falha da operação. Isso permite que o contrato lide com a falha de transferência de uma maneira mais flexível.

address payable receiver = payable(0x123...);

bool sent = receiver.send(amount);

if (!sent) {
// Lidar com a falha
}

O send é menos utilizado devido à necessidade de lidar manualmente com o caso de falha, mas pode ser útil quando se deseja uma lógica específica para tratar erros.

Call

O método call é ainda mais flexível e é recomendado nas versões mais recentes do Solidity para enviar Ether. call retorna um valor booleano indicando sucesso ou falha e permite especificar dados adicionais para a chamada, tornando-o compatível com a execução de funções no contrato receptor de Ether. No entanto, essa flexibilidade traz a responsabilidade de lidar corretamente com a segurança.

(address payable receiver).call{value: amount}("");

É importante tomar precauções de segurança ao usar call para transferir Ether, especialmente para evitar reentrância, um tipo de vulnerabilidade em que um atacante pode forçar o contrato a executar certas funções de forma recursiva.

Considerações de Segurança

  • Prevenção de Reentrância: Ao transferir Ether, especialmente usando call, é crucial proteger o contrato contra ataques de reentrância. Padrões como o de checagem-efeitos-interação e o uso de modificadores de reentrância podem ajudar a mitigar esse risco.

  • Verificar o Sucesso da Transferência: Sempre verifique o resultado de uma transferência de Ether e trate adequadamente o caso de falha, especialmente ao usar send e call.

  • Gás para Chamadas Externas: Ao enviar Ether, é fornecida uma quantidade fixa de gás (2300 de gás ao usar transfer ou send), o que é suficiente para eventos de log, mas não para executar código no contrato receptor. Com call, é possível especificar uma quantidade maior de gás, mas isso deve ser feito com cuidado.

Exemplo

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

contract ReceiveEther {
    

    // Função para receber Ether. msg.data deve estar vazio.
    receive() external payable {}

    // Função Fallback é chamada quando msg.data não é vazio.
    fallback() external payable {}

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}

contract SendEther {
    function sendViaTransfer(address payable _to) public payable {
        // Essa função não é mais recomendada para enviar Ether.
        _to.transfer(msg.value);
    }

    function sendViaSend(address payable _to) public payable {
        // Função retorna uma booleana indicando successo ou falha.
        // Essa função não é mais recomendada para enviar Ether.
        bool sent = _to.send(msg.value);
        require(sent, "Failed to send Ether");
    }

    function sendViaCall(address payable _to) public payable {
        // Função retorna uma booleana indicando successo ou falha.
        // Esse é o método recomendado para enviar Ether.
        (bool sent, bytes memory data) = _to.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }
}
PreviousComo os contratos e funções recebem Ether.NextConceitos Avançados

Last updated 5 months ago