La función de respaldo de solidez se ejecuta si ninguna de las otras funciones coincide con el identificador de función o si no se proporcionaron datos con la llamada de función. Solo se puede asignar una función sin nombre a un contrato y se ejecuta cada vez que el contrato recibe Ether simple sin ningún dato. Para recibir Ether y agregarlo al saldo total del contrato, la función de respaldo debe marcarse como pagadera. Si no existe tal función, el contrato no puede recibir Ether a través de transacciones regulares y generará una excepción.
Propiedades de una función de reserva:
- No tiene nombre ni argumentos.
- Si no está marcado como pagadero , el contrato arrojará una excepción si recibe éter simple sin datos.
- No se puede devolver nada.
- Se puede definir una vez por contrato.
- También se ejecuta si la persona que llama pretendía llamar a una función que no está disponible
- Es obligatorio marcarlo externo.
- Está limitado a 2300 gas cuando lo llama otra función. Es para hacer que esta llamada de función sea lo más económica posible.
Ejemplo: En el siguiente ejemplo, el contrato se crea para demostrar diferentes condiciones para diferentes funciones de respaldo.
Solidity
pragma solidity ^0.4.0; // Creating a contract contract GeeksForGeeks { // Declaring the state variable uint x; // Mapping of addresses to their balances mapping(address => uint) balance; // Creating a constructor constructor() public { // Set x to default // value of 10 x=10; } // Creating a function function SetX(uint _x) public returns(bool) { // Set x to the // value sent x=_x; return true; } // This fallback function // will keep all the Ether function() public payable { balance[msg.sender] += msg.value; } } // Creating the sender contract contract Sender { function transfer() public payable { // Address of GeeksForGeeks contract address _receiver = 0xbcc0185441de06F0452D45AEd6Ad8b98017796fb; // Transfers 100 Eth to above contract _receiver.transfer(100); } }
Producción:
Explicación:
1. Contract GeeksForGeeks: tiene una variable x que se establece en el valor predeterminado 10 en el constructor() . El contrato tiene una función llamada SetX(uint _x) que establece el valor de la función en el parámetro deseado enviado durante la llamada a la función. La siguiente declaración crea un mapa de dirección a valor llamado saldo que asigna las direcciones a su saldo.
mapping(address => uint) balance;
2. Contrato Remitente: Este es un contrato completamente independiente y sin relación. Envía un valor en Ether al contrato GeeksForGeeks. El contrato no conoce el mecanismo del contrato GeeksForGeeks. Enviar una transacción sin ningún mensaje y solo Ether puede causar un error.
Las siguientes declaraciones declaran una variable _receiver del tipo de dirección. Almacena explícitamente la dirección del contrato GeeksForGeeks. Luego usa address.transfer(value) para transferir Ether al contrato.
address _receiver = 0xbcc0185441de06F0452D45AEd6Ad8b98017796fb; //Address of GeeksForGeeks contract _receiver.transfer(100);
3. Función() pública pagadera:
La siguiente función es una función alternativa . Se declara exigible lo que le permite aceptar valor de transferencia. Se llama en dos casos
- Un contrato recibe solo Ether y ningún dato.
- Ninguna llamada de función coincidió aunque la cuenta recibió datos.
Esto nos ayuda a proteger la función para que no arroje un error. En este programa, el contrato GeeksForGeeks recibe solo Ether y la función de respaldo usa el valor recibido para agregar al saldo relacionado con la dirección de envío.
function() public payable { balance[msg.sender] += msg.value; }
Publicación traducida automáticamente
Artículo escrito por ciberexplosion y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA