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:
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:
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:
Publicación traducida automáticamente
Artículo escrito por ciberexplosion y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA