Variáveis
Nesta seção, vamos falar sobre a visibilidade das variáveis e os tipos de variáveis que existem.
Visibilidade das variáveis
Assim como as funções, as variáveis também possuem níveis de visibilidade. A visibilidade de uma variável determina como e de onde ela pode ser acessada, tanto dentro do contrato quanto em outros contratos.
Existem três níveis principais de visibilidade para as variáveis em Solidity:
Public: As variáveis marcadas como
public
são automaticamente acessíveis de fora do contrato. Solidity cria automaticamente uma função "getter" para cada variável pública, permitindo que outros contratos e chamadas externas leiam seu valor. No entanto, essas variáveis não podem ser modificadas diretamente de fora do contrato; para alterar seu valor, é necessário ter uma função dentro do contrato que faça essa modificação.uint public publicVariable;
Internal: As variáveis marcadas como
internal
são acessíveis dentro do contrato onde foram declaradas e em contratos que herdam dele. Elas não podem ser acessadas diretamente de fora do contrato, a menos que exista uma função que forneça esse acesso.uint internal internalVariable;
Private: As variáveis marcadas como
private
são as mais restritivas. Elas só podem ser acessadas e modificadas dentro do contrato em que são declaradas. Mesmo contratos que herdam desse contrato não conseguem acessar as variáveis privadas do contrato pai.uint private privateVariable;
Diferentemente das funções, não existe o nível de visibilidade external
para variáveis.
Vejamos um exemplo em um contrato:
contract MyContract {
uint public publicVar = 10;
uint internal internalVar = 20;
uint private privateVar = 30;
function accessVariables() public view returns (uint, uint, uint) {
// Ele pode acessar todas as variáveis, já que estão dentro do mesmo contrato
return (publicVar, internalVar, privateVar);
}
}
contract DerivedContract is MyContract {
function accessInheritedVariables() public view returns (uint, uint) {
// Pode acessar a publicVar e a internalVar, mas não a privateVar
return (publicVar, internalVar);
}
}
Neste exemplo, publicVar
, internalVar
e privateVar
possuem diferentes níveis de visibilidade, o que afeta como e onde podem ser acessadas. A função accessVariables
dentro de MyContract
pode acessar todas elas, enquanto accessInheritedVariables
em DerivedContract
pode acessar apenas as variáveis public
e internal
herdadas, mas não a private
.
🚨 A escolha do nível de visibilidade adequado para as variáveis é crucial para a segurança e o funcionamento correto do contrato. As variáveis public
são úteis para proporcionar transparência e acesso a dados importantes do contrato, enquanto as variáveis internal
e private
são essenciais para proteger o estado interno do contrato contra acessos não autorizados ou mal-intencionados.
Tipos de variables
As variáveis podem ser classificadas em três categorias principais de acordo com seu escopo e duração: variáveis de estado, variáveis locais e variáveis globais. Cada tipo possui características e usos específicos:
Variable de Estado: São variáveis armazenadas permanentemente na blockchain. Para modificar uma variável de estado, é necessário executar uma transação na rede Ethereum. Elas são acessíveis a partir de qualquer função dentro do contrato e, dependendo do nível de visibilidade, podem ser acessadas por outros contratos. As variáveis marcadas como
public
geram automaticamente uma função "getter".
contract MyContract {
uint public stateVariable; // Variável de estado
}
Variable Locais: São variáveis utilizadas dentro de funções e que não são armazenadas permanentemente na blockchain. Sua vida útil se limita ao tempo de execução da função. Elas só podem ser acessadas dentro da função onde foram declaradas. Geralmente, essas variáveis são armazenadas na memória (
memory
) ou na pilha, e não no armazenamento permanente do contrato.
contract MyContract {
function myFunction() public {
uint localVariable = 5; // Variable local
}
}
Variables globais: São variáveis predefinidas em Solidity que fornecem informações sobre a blockchain e as transações. Não é necessário declará-las, pois Solidity as disponibiliza automaticamente. Elas estão acessíveis globalmente em qualquer parte do contrato.
blockhash(uint blockNumber) returns (bytes32)
O hash do bloco indicado é retornado quando blocknumber
corresponde a um dos 256 blocos mais recentes. Caso contrário, a função retorna zero.
block.basefee (uint)
Taxa base do bloco atual.
block.chainid (uint)
Id da blockchain.
block.coinbase (address payable)
Endereço do minerador (agora validador) do bloco atual.
block.difficulty (uint)
Dificuldade do bloco atual (EVM < Paris). Atualmente deprecado.
block.gaslimit (uint)
Límite de gas do bloco atual
block.number (uint)
Número do bloco atual
block.prevrandao (uint)
Número aleatório proporcionado pela beacon chain (EVM >= Paris)
block.timestamp (uint)
Marca de tempo do bloco atual em segundos desde a época Unix (00:00:00 UTC de 1º de janeiro de 1970).
gasleft() returns (uint256)
Quantidade de gás restante.
msg.data (bytes calldata)
calldata da chamada atual.
msg.sender (address)
Endereço do remetente da chamada atual.
msg.sig (bytes4)
Os primeiros quatro bytes da calldata (identificador da função).
msg.value (uint)
Quantidade de wei enviados com a chamada.
tx.gasprice (uint)
Preço do gás da transação.
tx.origin (address)
Endereço do remetente original da transação. Quando acontece uma situação que um contrato chama um outro contrato, existe uma diferença entre o msg.sender e o msg.origin. (Use com cuidado!)
Para finalizar, vamos ver um exemplo de como declarar os diferentes tipos de variáveis em Solidity:
contract MyContract {
uint public stateVariable; // Variable de estado
function myFunction() public {
uint localVariable = 5; // Variable local
address sender = msg.sender; // Variable global
}
}
Neste exemplo, stateVariable
é uma variável de estado, localVariable
é uma variável local, e sender
é uma variável global.
Last updated