Solidez – Variables especiales

Existen variables y funciones especiales en Solidity que existen en el espacio de nombres global y se utilizan principalmente para proporcionar información sobre la string de bloques o las funciones de utilidad. Son de dos tipos:

1) Propiedades de bloque y transacción:

Bloquear

Propiedades de transacción

block.coinbase (dirección a pagar) Dirección actual del minero del bloque
bloque.dificultad (uint) Dificultad del bloque actual
valor.mensaje (uint) Número de wei enviados con el mensaje
bloque.número (uint): Número de bloque actual
blockhash(uint blockNumber) devuelve (bytes32) Da hash del bloque dado y solo funcionará para el
bloque 256 más reciente debido a la escalabilidad.
bloque.marca de tiempo:  Marca de tiempo del bloque actual como segundos desde la época de Unix
gasleft() devuelve (uint256): gas restante
msg.sender (dirección a pagar) Remitente del mensaje (llamada actual)
mensaje.sig (bytes4) Primeros cuatro bytes de los datos de llamada (es decir, identificador de función)
ahora (uint) Marca de tiempo del bloque actual (alias para block.timestamp)
tx.gasprice (uint) Precio del gas de la transacción
bloque.gaslimit (uint) Límite de gas del bloque actual
tx.origin (dirección de pago) Remitente de la transacción (string de llamada completa)
msg.data (bytes de datos de llamada) Datos completos de la llamada

Nota:

  • Los valores de todos los miembros de msg pueden cambiar para cada llamada de función externa.
  • block.timestamp , now y blockhash como fuente de aleatoriedad no son seguros. Los mineros pueden influir en la marca de tiempo y el blockhash.

2) Funciones de codificación y decodificación ABI:

Función

Propiedades

abi.decode(bytes datos codificados en memoria, (…)) devuelve (…) Decodifica los datos dados, mientras que los tipos se dan entre paréntesis como segundo argumento.
abi.encode(…) devuelve (bytes de memoria) Codifica los argumentos dados
abi.encodePacked(…) devuelve (bytes de memoria) Realiza la codificación empaquetada de los argumentos.
abi.encodeWithSelector(bytes4 selector, …) devuelve (bytes de memoria) Codifica los argumentos dados a partir del segundo y antepone el selector de cuatro bytes dado
abi.encodeWithSignature(firma de memoria de string, …) devuelve (memoria de bytes) Equivalente a abi.encodeWithSelector(bytes4(keccak256(bytes(firma))), …)`

Ejemplo n.º 1: en el siguiente ejemplo, se crea un contrato para demostrar que msg.sender es una forma segura de almacenar el número de registro. 

Solidity

// Solidity program to 
// demonstrate msg.sender
pragma solidity ^0.6.6;
  
// Creating a smart contract
contract GeeksForGeeksRandom 
{
    // Creating a mapping
    mapping (address => uint) rollNo;
      
    // Defining a function to use 
    // msg.sender to store roll no.
    function setRollNO(uint _myNumber) public 
    {
        // Update our 'rollNo' mapping 
        // to store '_myNumber' under 
        // 'msg.sender'
        rollNo[msg.sender] = _myNumber;
    }
      
    // Defining a function to
    // return the roll no.
    function whatIsMyRollNumber()
             public view returns (uint) 
    {
        // Retrieve the value stored 
        // in the sender's address
        // Will be `0` if the sender 
        // hasn't called `setRollNO` yet
        return rollNo[msg.sender];
    }
}

Producción:

msg.sender

Ejemplo#2: En el siguiente ejemplo, se crea un contrato con una función que muestra la variable abi.encode.

Solidity

// Solidity program to 
// demonstrate abi.encoding
pragma solidity ^0.6.6;
  
// Creating a contract
contract GeeksForGeeks 
{    
    // Defining a function 
    // to use abi.encode()
    //It does padding to bytes
    function encode(string memory g) 
             public pure returns(bytes memory)
    {
        return abi.encode(g);
    }
      
    // encodepacked returns values in 
    // a packed way without padding
    function encodepacked(string memory g)
             public pure returns(bytes memory)
    {
         return abi.encodePacked(g);
    }
}

Aporte:

Geeks

Producción:

abi.encode()

Ejemplo#3: En el siguiente ejemplo, se crea un contrato para demostrar las variables especiales block.number y blockhash.

Solidity

// Solidity program to 
// demonstrate block.number
// and blockhash
pragma solidity ^0.4.0;
  
// Creating a contract
contract GeeksForGeeks 
{   
    // Declaring state variables
      
    // BlockNumber
    uint  BNumber; 
      
    // Hash of current block
    bytes32  BHashPresent; 
      
    // Hash of Previous Block
    bytes32  BHashPrevious; 
  
    // Defining a function to 
    // return hasdh value of 
    // the current block
    function PresentHash()
             public returns(bytes32)
    {
        BNumber = block.number;
        return BHashPresent = 
               block.blockhash(BNumber);
    }
      
    // Defining a function to 
    // return the hash value of
    // the previous block
    function PreviousHash() 
             public returns(bytes32)
    {
        BNumber = block.number;
        return BHashPrevious = 
               block.blockhash(BNumber - 1);
    }  
}

Producción:

block.number and blockhash

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 *