Solidez: función de retroceso

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:

  1. No tiene nombre ni argumentos.
  2. Si no está marcado como pagadero , el contrato arrojará una excepción si recibe éter simple sin datos.
  3. No se puede devolver nada.
  4. Se puede definir una vez por contrato.
  5. También se ejecuta si la persona que llama pretendía llamar a una función que no está disponible
  6. Es obligatorio marcarlo externo.
  7. 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:

Fallback function

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

  1. Un contrato recibe solo Ether y ningún dato.
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *