SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
15.11.2024

Lição: 037: Armazenamento vs Memória vs Calldata em Solidity

Em Solidity, compreender como os dados são armazenados e acessados é crucial para o desenvolvimento eficiente de contratos inteligentes. As três principais localidades de dados são Armazenamento, Memória e Calldata. Esta aula explorará cada uma dessas localidades de dados, suas características e como utilizá-las efetivamente com exemplos.

1. Armazenamento

O Armazenamento é onde todas as variáveis de estado de um contrato são mantidas permanentemente. Os dados armazenados aqui ficam na blockchain, o que significa que são persitentes e permanecerão ao longo de chamadas de funções e transações. O armazenamento é mais caro em termos de custos de gás devido à sua permanência.

Características:

  • Os dados são armazenados permanentemente na blockchain.
  • As modificações nas variáveis de armazenamento consomem gás.
  • Estado persistente para o contrato.

Exemplo:

pragma solidity ^0.8.0;

contract ExemploArmazenamento {
    uint256 public contagem; // Este valor é armazenado no armazenamento

    function incrementar() external {
        contagem += 1; // Atualizando a variável de armazenamento
    }

    function obterContagem() external view returns (uint256) {
        return contagem; // Lendo do armazenamento
    }
}

Neste exemplo, a variável contagem é armazenada no armazenamento. Sempre que a função incrementar é chamada, ela atualiza a variável contagem.

2. Memória

A Memória é uma localidade de dados temporária. É usada para variáveis que existem apenas durante a execução de uma função. Uma vez que a execução da função é concluída, os dados na memória são apagados. É mais barata em comparação ao armazenamento, pois os dados na memória não geram custos de armazenamento permanentes.

Características:

  • Os dados são temporários e existem apenas enquanto uma função está executando.
  • As mudanças nas variáveis de memória são baratas em comparação ao armazenamento.
  • É possível modificar os dados da memória livremente.

Exemplo:

pragma solidity ^0.8.0;

contract ExemploMemoria {
    function obterSoma(uint256[] memory numeros) external pure returns (uint256) {
        uint256 soma = 0; // Esta variável está na memória
        for (uint256 i = 0; i < numeros.length; i++) {
            soma += numeros[i]; // Acesso à memória é barato
        }
        return soma;
    }
}

Neste exemplo, o array numeros é passado para a função obterSoma e é armazenado na memória. A variável soma também está na memória e existe apenas enquanto a função está sendo executada.

3. Calldata

Calldata é uma localidade de dados especial que é somente leitura e é usada para parâmetros de funções. É mais barata que a memória porque não permite modificações, tornando-a adequada para chamadas de funções externas. Os dados em calldata não podem ser modificados, o que aumenta a segurança ao lidar com dados externos.

Características:

  • Os dados são imutáveis; não podem ser alterados após serem passados.
  • É mais barato que a memória, pois não há operações de escrita.
  • Normalmente usado para parâmetros de funções externas.

Exemplo:

pragma solidity ^0.8.0;

contract ExemploCalldata {
    function obterProduto(uint256[] calldata valores) external pure returns (uint256) {
        uint256 produto = 1;
        for (uint256 i = 0; i < valores.length; i++) {
            produto *= valores[i]; // Acesso somente leitura do calldata
        }
        return produto;
    }
}

Neste exemplo, o array valores é passado via calldata. A função pode ler os dados, mas não pode modificá-los, proporcionando uma maneira eficiente em gás de lidar com dados de entrada.

Conclusão

Compreender as distinções entre Armazenamento, Memória e Calldata é essencial para escrever contratos inteligentes eficientes em Solidity. Cada localidade de dados serve a um propósito específico:

  • Armazenamento é para variáveis de estado permanentes.
  • Memória é para variáveis temporárias usadas durante a execução de funções.
  • Calldata é para parâmetros de função somente leitura, tornando-o mais eficiente em gás para chamadas externas.

Ao gerenciar as localidades de dados sabiamente, você pode otimizar seus contratos inteligentes para desempenho e custo.

Did you like this article? Rate it from 1 to 5:

Thank you for voting!