Variáveis Globais em Solidity

Variáveis Globais em Solidity

As variáveis globais em Solidity fornecem informações úteis sobre o contexto atual do contrato, como detalhes da transação, do bloco, e do ambiente de execução. Aqui está um resumo das principais variáveis globais:

Transação e Mensagem

  • msg.sender: Endereço do remetente da chamada atual (quem está enviando a transação).

  • msg.value: Quantidade de wei (a menor unidade de ether) enviada com a chamada.

  • msg.data: Dados completos enviados na chamada (útil para contratos que lidam com chamadas não padrão).

  • msg.sig: Primeiro quatro bytes dos dados enviados na chamada (a assinatura da função chamada).

  • msg.gas: Quantidade de gás restante na chamada (depreciado na versão 0.4.21 e removido nas versões posteriores).

Bloco

  • block.number: Número do bloco atual.

  • block.timestamp: Timestamp do bloco atual (em segundos desde a epoch).

  • block.difficulty: Dificuldade do bloco atual.

  • block.coinbase: Endereço do minerador que criou o bloco atual.

  • block.gaslimit: Limite de gás do bloco atual.

  • block.chainid: ID da cadeia de blocos (útil para redes que suportam múltiplas cadeias).

Ambiente

  • tx.origin: Endereço do remetente original da transação (não apenas o remetente da chamada atual).

  • tx.gasprice: Preço do gás da transação atual.

Exemplos de Uso

Verificação de Sender

pragma solidity ^0.8.0;

contract Example {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    function doSomething() public onlyOwner {
        // Função que só o proprietário pode chamar
    }
}

Registro de Transações

pragma solidity ^0.8.0;

contract TransactionLogger {
    event TransactionDetails(address sender, uint value, bytes data);

    function logTransaction() public payable {
        emit TransactionDetails(msg.sender, msg.value, msg.data);
    }
}

Uso de Block Timestamp

pragma solidity ^0.8.0;

contract Timed {
    uint public startTime;

    constructor() {
        startTime = block.timestamp;
    }

    function timeElapsed() public view returns (uint) {
        return block.timestamp - startTime;
    }
}