html
6.4 Uso de fallback y receive en Solidity
En Solidity, las funciones fallback
y receive
son especiales y tienen roles específicos en la gestión de los contratos. Estas funciones se utilizan principalmente para recibir Ether y manejar llamadas que no coinciden con ninguna otra función en el contrato.
Receive Function
La función receive
se utiliza para recibir Ether cuando no se especifican datos en la transacción. Si un contrato no tiene una función receive
, pero tiene un fallback
, la función fallback
se ejecutará en su lugar si se recibe Ether sin datos.
Ejemplo de receive
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0 contract ReceiveExample { event ReceivedEther(address sender, uint amount) // La función receive se activa solo cuando se recibe Ether sin datos receive() external payable { emit ReceivedEther(msg.sender, msg.value) } }
En este ejemplo, la función receive
es de tipo external
y payable
, lo que significa que puede recibir Ether. Cuando se recibe Ether sin datos, la función receive
se ejecuta y emite un evento ReceivedEther
con la dirección del remitente y la cantidad de Ether recibido.
Fallback Function
La función fallback
se utiliza cuando no coinciden con ninguna otra función del contrato o cuando se reciben datos incorrectos. La función fallback
también puede ser marcada como payable
para recibir Ether.
Ejemplo de fallback
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0 contract FallbackExample { event FallbackCalled(address sender, uint amount, bytes data) // La función fallback se activa cuando no se encuentran otras coincidencias fallback() external payable { emit FallbackCalled(msg.sender, msg.value, msg.data) } }
En este ejemplo, la función fallback
es de tipo external
y payable
. Se ejecuta cuando no se encuentra una coincidencia con ninguna otra función en el contrato, o cuando se llaman con datos que no coinciden con ninguna función definida. La función emite un evento FallbackCalled
con la dirección del remitente, la cantidad de Ether recibida y los datos.
Uso combinado de receive y fallback
Podemos combinar ambas funciones en un contrato para manejar de manera más eficiente las transacciones entrantes, diferenciando entre aquellas que contienen datos y las que no.
Ejemplo combinado
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0 contract CombinedExample { event ReceivedEtherWithoutData(address sender, uint amount) event FallbackCalled(address sender, uint amount, bytes data) // La función receive se ejecuta cuando se recibe Ether sin datos receive() external payable { emit ReceivedEtherWithoutData(msg.sender, msg.value) } // La función fallback se ejecuta para llamadas que no coinciden con ninguna función definida y para llamadas con datos que no coinciden fallback() external payable { emit FallbackCalled(msg.sender, msg.value, msg.data) } }
En este ejemplo, si se envía Ether al contrato sin datos, se llamará a la función receive
. Si se llama al contrato con datos que no coinciden con ninguna otra función, la función fallback
será llamada. Ambas funciones emiten eventos diferentes, lo que permite diferenciar cómo se llamó al contrato.
Deja una respuesta