ETH Kipu
  • Ethereum Developer Pack
  • Módulo 1
    • Intro a Smart Contracts
      • Fundamentos de Blockchain
        • Antecedentes
        • Bitcoin
        • Qué es Blockchain
        • Conceptos Clave en Blockchain
        • Cómo funciona la Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • El nuevo Internet
        • Web 3
        • Elementos Fundamentales
        • Impacto de Ethereum en Diversos Sectores
      • Wallets
        • Componentes de una wallet
        • Tipos de Wallet
        • Códigos mnemónicos
      • Ethereum 101
        • Smart Contracts
        • Cuentas
          • Tipos de cuentas
          • Contenido de cuentas
        • Transacciones
          • Componentes
          • Ciclo de vida
        • Gas
        • Solidity
        • EVM
          • La máquina de estados
          • Opcodes
          • Cómo funciona la EVM
          • Clientes de ejecución
          • DApps
      • Blockchain Explorer
        • Funciones de un blockchain explorer
        • Beneficios de utilizar un blockchain explorer
      • Remix
        • Características de Remix
        • Workspaces o espacios de trabajo
        • Cargar y compilar un contrato
        • Desplegar en la máquina virtual de Remix (Remix VM)
        • Interactuando con funciones
        • Desplegar en una red pública
      • Crea tu primer Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Datos
      • Funciones
      • Variables
        • Ejercicio 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Ejercicio 3
      • Convenciones de nomenclatura
      • Tipos de almacenamiento para variables
      • Estructuras de Control
        • Ejercicio 4
      • Modificadores
      • Eventos
        • Ejercicio 5
      • Tipos de Referencia
        • Arrays
          • Ejercicio 6
        • Mappings
          • Ejercicio 7
        • Structs
          • Ejercicio 8
      • Address Payable
      • Cómo reciben Ether los contratos y funciones
      • Transferencias de Ether
      • Conceptos Avanzados
        • Codificación ABI
        • Hashing
        • This
        • Herencia
        • Abstract
        • Interface
        • Llamadas entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • Estándares, Librerías y Patrones
      • Buenas Prácticas de Diseño
      • Patrones de Diseño
      • EIP y ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crea un Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Toolkit para desarrollo en Ethereum
      • Requisitos para el módulo 4
        • Terminal
        • Git y Github
        • Node.js y npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Ejercicio
        • Hardhat
          • Despliegue de un contrato en Hardhat
          • Despliegue de un contrato en una red pública
        • Scaffold-ETH
          • Características
          • Cómo instalar Scaffold-ETH
  • Módulo 5
    • Seguridad, Pruebas y Auditoría
      • Pruebas
        • Importancia de realizar pruebas
        • Métodos para probar contratos inteligentes
          • Pruebas automatizadas
          • Pruebas manuales
        • Conceptos importantes en testing
        • Herramientas para testing
        • Testing con Hardhat
        • Recursos adicionales
      • Seguridad
        • Una mentalidad distinta de diseño
        • Principales vulnerabilidades en smart contracts
          • 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 (Ruptura de invariantes)
          • Mishandling of ETH (Mal manejo de ETH)
          • Denial of Service (DoS - Denegación de Servicio)
          • Integer overflow and underflow (desbordamiento y subdesbordamiento de enteros)
          • Phishing y Typosquatting
        • Recursos adicionales
      • Auditoría de smart contracts
        • Proceso de Auditoría
        • Herramientas
        • Cómo prepararse para una auditoría
        • El test Rekt
        • Retos
        • Recursos adicionales
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  • Transfer
  • Send
  • Call

Was this helpful?

  1. Módulo 2
  2. Fundamentos de Solidity

Transferencias de Ether

Solidity proporciona varias formas de enviar Ether de un contrato a una dirección externa, cada una con sus propias implicaciones en términos de seguridad, gas y comportamiento en caso de fallo. Estas son transfer, send, y llamadas de bajo nivel (call).

Transfer

El método transfer es una forma segura de enviar Ether ya que automáticamente revierte toda la transacción si la transferencia falla por cualquier motivo. Es la manera recomendada de enviar Ether cuando se desea que la transacción entera falle en caso de que no se pueda completar la transferencia de Ether.

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

Si la transferencia falla, la ejecución se detiene y se revierte.

Send

El método send es similar a transfer, pero en lugar de revertir automáticamente, devuelve un valor booleano (true o false) indicando el éxito o fracaso de la operación. Esto permite al contrato manejar el fallo de la transferencia de una manera más flexible.

address payable receiver = payable(0x123...);
bool sent = receiver.send(amount);
if (!sent) {
    // Manejar el fallo
}

send es menos usado debido a la necesidad de manejar manualmente el caso de fallo, pero puede ser útil cuando se quiere una lógica de manejo de errores específica.

Call

El método call es aún más flexible y se recomienda en las versiones más recientes de Solidity para enviar Ether. call devuelve un booleano indicando el éxito o fracaso, y permite especificar datos adicionales para la llamada, lo que lo hace compatible con la ejecución de funciones en el contrato receptor de Ether. Sin embargo, esta flexibilidad viene con la responsabilidad de manejar correctamente la seguridad.

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

Es importante tener precauciones de seguridad al usar call para transferir Ether, especialmente para evitar reentrancias, un tipo de vulnerabilidad donde un atacante puede forzar al contrato a ejecutar ciertas funciones de manera recursiva.

Consideraciones de seguridad

  • Prevención de Reentrancia: Al transferir Ether, especialmente usando call, es crucial proteger el contrato contra ataques de reentrancia. Patrones como el chequeo-efectos-interacción y el uso de modificadores de reentrancia pueden ayudar a mitigar este riesgo.

  • Verificar el Éxito de la Transferencia: Siempre se debe verificar el resultado de una transferencia de Ether y manejar adecuadamente el caso de fallo, especialmente cuando se usan send y call.

  • Gas para Llamadas Externas: Al enviar Ether, se proporciona una cantidad fija de gas (2300 gas al usar transfer o send) que es suficiente para eventos de registro pero no para ejecutar código en el contrato receptor. Con call, es posible especificar una cantidad mayor de gas, lo cual debe hacerse con cuidado.

Ejemplo

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

contract ReceiveEther {
    

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    // Fallback function is called when msg.data is not empty
    fallback() external payable {}

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

contract SendEther {
    function sendViaTransfer(address payable _to) public payable {
        // This function is no longer recommended for sending Ether.
        _to.transfer(msg.value);
    }

    function sendViaSend(address payable _to) public payable {
        // Send returns a boolean value indicating success or failure.
        // This function is not recommended for sending Ether.
        bool sent = _to.send(msg.value);
        require(sent, "Failed to send Ether");
    }

    function sendViaCall(address payable _to) public payable {
        // Call returns a boolean value indicating success or failure.
        // This is the current recommended method to use.
        (bool sent, bytes memory data) = _to.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }
}
PreviousCómo reciben Ether los contratos y funcionesNextConceptos Avanzados

Last updated 8 months ago

Was this helpful?