Tipos de armazenamento para variáveis

Em Solidity, há três tipos de localizações de armazenamento para variáveis, cada uma com suas próprias características e usos. Essas localizações são: storage (armazenamento), memory (memória) e calldata. Compreender a diferença entre elas é crucial para o desenvolvimento eficiente e seguro de contratos inteligentes na Ethereum.


Storage (Armazenamento):

  • Descrição: As variáveis de armazenamento são persistentes e são guardadas na blockchain entre transações. Funcionam como o "disco rígido" de um contrato inteligente.

  • Uso: Principalmente utilizado para variáveis de estado, ou seja, variáveis que precisam persistir entre chamadas de funções e transações.

  • Custo: É a forma mais cara de armazenamento em termos de gás, especialmente para gravações e modificações.

  • Acesso: Por padrão, as variáveis de estado estão no armazenamento.


Memory (Memória):

  • Descrição: As variáveis em memória são temporárias e existem apenas enquanto uma função está sendo executada. Elas são apagadas entre chamadas de funções externas e não são armazenadas na blockchain.

  • Uso: Útil para armazenar dados temporários durante a execução de uma função. Por exemplo, variáveis locais ou argumentos passados para funções internas.

  • Custo: Muito mais barato que o armazenamento em termos de gás. Não possui custo permanente, pois os dados são eliminados no final da execução da função.

  • Acesso: É necessário especificar explicitamente memory para variáveis de função e parâmetros (exceto para tipos de referência internos como mappings).


Calldata:

  • Descrição: Calldata é uma localização de armazenamento não modificável e temporária que contém os dados de entrada das transações e chamadas de funções. É semelhante a memory, mas só é usada para dados de entrada em funções externas.

  • Uso: Utilizado para argumentos de função em funções marcadas como external. É a forma mais eficiente de passar dados em termos de gás, especialmente para arrays e estruturas complexas.

  • Custo: Geralmente mais barato em termos de gás do que memory, porque os dados em calldata não são copiados, mas lidos diretamente da transação ou chamada.

  • Acesso: É apenas leitura e não pode ser modificado.

Exemplo de Código:

pragma solidity ^0.8.0;

contract StorageTypes {
    // Storage: Persistente entre transações
    uint public storageVar = 10;

    function exampleFunction(uint[] calldata calldataVar) external {
        // Calldata: Dados de entrada em uma função external
        uint localVar = calldataVar[0];

        // Memory: Temporário durante a execução da função
        uint;
    }
}

Neste exemplo, storageVar é uma variável de armazenamento (storage), calldataVar é uma variável de calldata (já que é um argumento em uma função external), e memoryArray é uma variável de memória.

Compreender essas três localizações de armazenamento é fundamental para otimizar o uso de gás em contratos inteligentes e evitar erros comuns em Solidity.

Last updated