1. receive(): Es una función especial utilizada exclusivamente para recibir Ether cuando no se envían datos en la transacción.
2. fallback(): Se activa en dos situaciones:
receive()
en el contrato.
Ambas funciones son opcionales, pero un contrato que pretenda recibir Ether directamente debe incluir al menos una de ellas.
fallback
y receive
Función | Propósito | Requiere Ether | Requiere datos | Gas disponible |
---|---|---|---|---|
receive
|
Gestionar transacciones de Ether sin datos. | Sí | No | Gas limitado |
fallback
|
Gestionar llamadas a funciones inexistentes o transacciones con datos. | Opcional | Sí | Gas limitado |
fallback
y receive
receive
Se declara como una función pública y payable
.
receive() external payable {
// Lógica para manejar Ether recibido sin datos
}
fallback
Se declara como una función pública, opcionalmente payable
.
fallback() external payable {
// Lógica para manejar llamadas inexistentes o Ether con datos
}
fallback
y receive
pragma solidity ^0.8.0;
contract EjemploFallbackReceive {
event EtherRecibido(address remitente, uint256 cantidad);
event LlamadaFallback(address remitente, uint256 cantidad, bytes datos);
// Manejar transacciones sin datos
receive() external payable {
emit EtherRecibido(msg.sender, msg.value);
}
// Manejar transacciones con datos o llamadas inexistentes
fallback() external payable {
emit LlamadaFallback(msg.sender, msg.value, msg.data);
}
}
En este ejemplo:
fallback
y receive
contract Billetera {
event Deposito(address remitente, uint256 cantidad);
// Función para recibir Ether
receive() external payable {
emit Deposito(msg.sender, msg.value);
}
// Retirar Ether
function retirar() public {
payable(msg.sender).transfer(address(this).balance);
}
}
Este contrato permite recibir Ether y retirarlo, utilizando receive()
para capturar los pagos directos.
contract ManejoFallback {
event LlamadaInexistente(address remitente, uint256 cantidad, bytes datos);
fallback() external payable {
emit LlamadaInexistente(msg.sender, msg.value, msg.data);
}
}
Este contrato registra intentos de interacción con funciones inexistentes, asegurando que no se pierdan las transacciones.
contract Redireccionamiento {
address payable public destinatario;
constructor(address payable _destinatario) {
destinatario = _destinatario;
}
// Redirigir cualquier Ether recibido al destinatario
fallback() external payable {
destinatario.transfer(msg.value);
}
receive() external payable {
destinatario.transfer(msg.value);
}
}
En este contrato, todo Ether recibido se redirige automáticamente a otra dirección.
fallback
y receive
1. Evita lógica compleja: Ambas funciones tienen un límite de gas estricto, especialmente cuando son llamadas desde contratos externos.
2. Registra eventos: Siempre registra eventos para facilitar la depuración y auditoría.
3. Verifica balances: Protege el contrato contra ataques como el de reentrada.
4. Define ambos métodos si es necesario: Implementa fallback
y receive
según los casos de uso para evitar que transacciones válidas sean rechazadas.
1. Consumo de gas: Las funciones tienen un límite de gas para garantizar la ejecución rápida y barata.
2. Sin retorno de datos: Ninguna de estas funciones puede devolver valores a la llamada.
3. Prevenir mal uso: Sin un manejo adecuado, los contratos pueden aceptar Ether accidentalmente, lo que podría generar problemas de contabilidad.
Para más información sobre fallback
y receive
, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer