Storage x Memory

Storage e Memory

Entender a diferença entre storage e memory em Solidity é fundamental para a manipulação correta dos tipos stateful (com estado) e stateless (sem estado) dentro de contratos inteligentes.

  • Storage: Refere-se à área de armazenamento permanente na blockchain. Variáveis de estado e arrays são armazenados em storage. Qualquer modificação em variáveis de storage é gravada permanentemente na blockchain e consome gasolina (taxas de transação).

  • MemoryÉ uma área temporária de armazenamento utilizada para armazenar dados durante a execução de uma função. Variáveis locais e parâmetros de função são armazenados em memory. Os dados armazenados em memory são removidos assim que a execução da função é concluída e não são persistidos na blockchain.

**Storage vs memory **

**storage** **memory** Armazena dados entre chamadas de função Armazena dados temporariamente Os dados previamente colocados na área de armazenamento são acessíveis a cada execução do contrato inteligente. A memória é completamente apagada assim que o código é executado. Consome mais gás Tem menos consumo de gás e é melhor para cálculos intermediários. Armazena arrays, variáveis de estado e locais de estruturas. Armazena os argumentos das funções.

Manipulação dos Tipos Stateful e Stateless:

  • Stateful: Tipos stateful referem-se a dados que são armazenados permanentemente na blockchain, geralmente como variáveis de estado (storage). Exemplos incluem saldo de uma conta, registro de propriedade de tokens, etc. Manipular dados stateful requer cuidado devido ao custo de gasolina associado à leitura e gravação de dados em storage.

  • Stateless: Tipos stateless são aqueles que não são armazenados permanentemente na blockchain e existem apenas durante a execução de uma função, geralmente armazenados em memory. Exemplos incluem parâmetros de função, variáveis locais e resultados temporários de cálculos. Manipular dados stateless é mais eficiente em termos de consumo de gasolina, pois não envolve gravação na storage.

Exemplo:

pragma solidity ^0.8.0;

contract Exemplo {
    uint256 public statefulVar; // Stateful variable

    function manipularStateful(uint256 _valor) public {
        // Modifica uma variável stateful (em storage)
        statefulVar = _valor;
    }

    function manipularStateless(uint256 _valor) public pure returns (uint256) {
        // Manipula uma variável stateless (em memory)
        uint256 resultado = _valor * 2;
        return resultado;
    }
}

No exemplo acima, statefulVar é uma variável stateful armazenada em storage. A função manipularStateful modifica esta variável, o que resulta em uma transação na blockchain.

Por outro lado, na função manipularStateless, resultado é uma variável stateless temporária armazenada em memory. Como a função é marcada como pure, ela não interage com storage e não resulta em transações na blockchain.