Aula 016: Variáveis e Variáveis de Estado em Solidity
Nesta aula, exploraremos o conceito de variáveis em Solidity, com foco especial nas variáveis de estado. Compreender as variáveis é fundamental ao desenvolver contratos inteligentes, pois elas são usadas para armazenar e manipular dados.
O que são Variáveis?
Em Solidity, as variáveis são usadas para armazenar tipos de dados. Elas podem conter diferentes tipos de valores, como inteiros, booleanos, strings, etc. Existem vários tipos de variáveis em Solidity, que podem ser amplamente categorizadas em variáveis de estado, variáveis locais, variáveis globais e variáveis de memória.
Variáveis de Estado
As variáveis de estado são declaradas no nível do contrato e são armazenadas permanentemente na blockchain. Quando você utiliza variáveis de estado, elas são gravadas no armazenamento do contrato, o que significa que seus valores persistem entre chamadas de função e transações.
Declarando Variáveis de Estado
Para declarar uma variável de estado, você simplesmente especifica a visibilidade (por exemplo, public
, private
, internal
, external
) e o tipo de dado seguido pelo nome da variável. Aqui está um exemplo:
pragma solidity ^0.8.0;
contract MeuContrato {
uint256 public meuNumero; // Variável de estado do tipo inteiro sem sinal
string private minhaString; // Variável de estado do tipo string
address internal meuEndereco; // Variável de estado do tipo endereço
}
Inicializando Variáveis de Estado
Você pode inicializar variáveis de estado diretamente na declaração ou no construtor:
pragma solidity ^0.8.0;
contract MeuContrato {
uint256 public meuNumero = 10; // Inicializada diretamente
string private minhaString; // Declarada, mas não inicializada
constructor() {
minhaString = "Olá, Mundo!"; // Inicializada no construtor
}
}
Acessando Variáveis de Estado
As variáveis de estado podem ser acessadas usando a função que é gerada automaticamente para variáveis públicas, ou diretamente dentro dos métodos do contrato se forem internas ou privadas.
pragma solidity ^0.8.0;
contract MeuContrato {
uint256 public meuNumero = 10;
function obterMeuNumero() public view returns (uint256) {
return meuNumero; // Retornando diretamente a variável de estado
}
}
Modificando Variáveis de Estado
Para modificar uma variável de estado, você precisa criar uma função que altera o valor da variável de estado. Vamos ver como podemos fazer isso:
pragma solidity ^0.8.0;
contract MeuContrato {
uint256 public meuNumero;
function definirMeuNumero(uint256 _numero) public {
meuNumero = _numero; // Modificando a variável de estado
}
}
Compreendendo o Armazenamento
As variáveis de estado dependem do “armazenamento” da blockchain, que é persistente e tem custo de gas para ser escrito. Cada modificação em uma variável de estado requer uma transação, e assim os usuários devem pagar taxas de gas.
Você pode pensar nas variáveis de estado como semelhantes aos atributos de instância na programação orientada a objetos, onde cada instância de contrato tem seu próprio armazenamento para as variáveis de estado.
Comparação com Variáveis Locais
Variáveis locais são aquelas definidas dentro de uma função e só são acessíveis dentro dessa função. Elas não persistem além da chamada da função. Aqui está um exemplo contrastando variáveis locais e variáveis de estado:
pragma solidity ^0.8.0;
contract MeuContrato {
uint256 public meuNumero; // Variável de estado
string private minhaString; // Variável de estado
function definirMeuNumero(uint256 _numero) public {
meuNumero = _numero; // Modificando a variável de estado
uint256 variavelTemporaria = _numero + 1; // Variável local
// variavelTemporaria persiste apenas dentro desta função
}
}
Conclusão
Em resumo, as variáveis de estado são cruciais em Solidity, pois permitem que contratos persistam dados através de transações. Elas são distintas das variáveis locais, que são temporárias e existem apenas durante a execução da função. Compreender como trabalhar com essas variáveis é fundamental para qualquer desenvolvedor de Solidity.
Na próxima aula, nos aprofundaremos em tipos de dados e estruturas em Solidity, pavimentando o caminho para contratos mais complexos. Boa codificação!