Tipos de Dados
Solidity é uma linguagem de tipagem estática. Isso significa que o tipo de uma variável é determinado no momento da compilação e não pode ser alterado durante a execução do programa.
Ao declarar uma variável em Solidity, é necessário especificar seu tipo de forma explÃcita. Uma vez definido, o tipo da variável permanece o mesmo durante toda a execução do código.
Por exemplo, uma variável chamada myNumber do tipo inteiro seria declarada assim:
uint256 myNumber; Este enfoque de tipagem estática oferece diversos benefÃcios, como:
Detecção precoce de erros: Muitos problemas relacionados a tipos podem ser identificados pelo compilador antes da execução do programa.
Otimização de desempenho: O compilador pode aplicar verificações e otimizações especÃficas com base nos tipos de dados conhecidos, tornando o contrato mais eficiente.
Por outro lado, linguagens de tipagem dinâmica, como Python ou JavaScript, permitem que o tipo de uma variável seja alterado durante a execução do programa, o que pode levar a maior flexibilidade, mas também a erros inesperados.
Existen dos tipos de datos: tipos de valor y tipos de referencia.
Tipos de valor
Os tipos de valor armazenam diretamente o dado.
Abaixo estão os principais tipos dessa categoria:
Inteiros sem sinal (uint)
uint) Representam números inteiros não negativos (unsigned). Exemplo:
uint256 varInt = 25; // se define como um uint com valor 25Tamanhos disponÃveis: De
uint8atéuint256, em incrementos de 8 bits.Exemplo:
uint8,uint16,uint24atéuint256.Limite de valores:
uint8: De 0 a 255 (2^8-1).uint256: De 0 a (2^256-1).
Valor padrão:
0.Valor máximo permitido:
🚨 Atenção: Se o valor ultrapassar os limites, a execução falha e a transação será revertida.
Se quisermos atribuir a um tipo de dado seu valor máximo possÃvel em Solidity, podemos usar a seguinte instrução:
💡Dica: Se, ao escrever seu código, você declarar apenas uint sem especificar o número de bits, o Solidity assume que o tipo é uint256.
Inteiros com sinal (int)
Números inteiros con sinal. Exemplo:
💡 Notas Importantes:
Essa abordagem também funciona para outros tamanhos de inteiros, como
uint8,uint16,int8, etc. Basta substituiruint256ouint256pelo tipo desejado.Da mesma forma, é possÃvel obter o valor mÃnimo (para inteiros com sinal) utilizando
type(int256).min, que retorna-(2^255).
Booleanos (bool)
Representam valores verdadeiros ou falsos.
Exemplo:
🥸 Valor padrão: false.
Endereços (address)
Representam endereços Ethereum (20 bytes). Usados para identificar contas externas (EOA) ou contratos inteligentes.
Exemplo:
Estrutura:
40 caracteres hexadecimais com prefixo
0x(indica formato hexadecimal).
Valor padrão:
Conhecido como
0x0,address(0)ouaddress(0x0).
Enumerações (enum):
Fornecem uma maneira legÃvel de associar valores significativos a variáveis.
Úteis para definir estados ou categorias especÃficas.
Melhoram a legibilidade, a manutenção e evitam erros ao substituir valores numéricos diretos por identificadores semânticos.
Tipos de referência - Bytes e Strings
Os tipos de referência em Solidity são usados para armazenar dados complexos, referenciando uma localização de memória. Quando são atribuÃdos a outras variáveis ou passados como argumentos para funções, apenas a referência ao dado é passada, e não uma cópia do valor.
Isso implica que, ao modificar esses dados em uma função, você pode estar alterando diretamente o dado original. Os principais tipos de referência abordados aqui são os bytes e strings.
Bytes (bytes):
Os bytes são utilizados para armazenar sequências de bytes, sendo úteis para manipular dados binários arbitrários. Eles podem ser:
Podem ser dos tipos: estáticos o dinâmicos.
a) Bytes estáticos (bytesN)
Armazenam uma sequência de bytes de tamanho fixo, onde
Nvaria entre 1 e 32.Exemplo:
bytes1,bytes2, ...,bytes32.São mais eficientes em termos de custo de gás porque o tamanho é conhecido antecipadamente.
Usados para armazenar dados como hashes ou identificadores.
b) Bytes dinâmicos (bytes)
Armazenam uma sequência de bytes de tamanho variável.
Funcionam como um array dinâmico de
bytes1.Mais flexÃveis, mas têm um custo de gás maior devido à alocação dinâmica de memória.
Valor padrão:
Formato inteiro:
0Formato hexadecimal:
0x00.
String (string):
Os strings são projetados especificamente para armazenar cadeias de caracteres e são sempre dinâmicos, com tamanho variável. Eles representam sequências de caracteres Unicode codificadas em UTF-8.
CaracterÃsticas:
Strings são ideais para armazenar texto legÃvel, enquanto
bytesé mais adequado para dados binários.Se o texto tiver menos de 32 bytes, considere usar
bytes32para maior eficiência, já que a memória será alocada de forma estática.Valor padrão: uma string vazia.
🚨
Considerações importantes:
🚨 Codificação UTF-8: Cada caractere pode ocupar mais de um byte (por exemplo, letras com acentos). Usar caracteres fora do padrão pode causar erros.
🚨 Comparação de strings: Solidity não permite comparação direta de strings com
==. Em vez disso, compare os hashes das strings usandokeccak256.
Exemplo:
Armazenamento vs. Memória:
Strings podem ser armazenados na memória (dados temporários) ou no armazenamento (dados persistentes).
Usar
memoryé mais barato em termos de gás e comumente usado em parâmetros de funções. Exemplo:
Valor padrão: uma string vazia.
🚨 Custo de gás:
Operações com strings podem ser caras para contratos inteligentes, especialmente ao manipular cadeias grandes.
Last updated