SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
15.11.2024

Lição: 038: Localização de Dados em Solidity

Em Solidity, a localização de dados refere-se ao local onde as variáveis são armazenadas na memória durante a execução de um contrato inteligente. Compreender as localizações de dados é crucial para otimizar o uso de gás e garantir a integridade dos dados. Existem três principais localizações de dados em Solidity: armazenamento, memória e calldata. Nesta aula, vamos explorar cada uma dessas localizações com exemplos.

Armazenamento

Armazenamento é a localização de dados persistente usada para variáveis de estado. Os dados armazenados neste local são gravados na blockchain e permanecem lá mesmo após a conclusão da execução do contrato. É aqui que o estado do seu contrato é mantido.

Exemplo de Armazenamento

pragma solidity ^0.8.0;

contract ExemploArmazenamento {
    // Variável de estado armazenada no armazenamento
    uint256 public numero;

    // Função para definir o número
    function definirNumero(uint256 _numero) public {
        numero = _numero; // Isso atualiza o armazenamento
    }

    // Função para recuperar o número
    function obterNumero() public view returns (uint256) {
        return numero;
    }
}

Neste exemplo, a variável numero está localizada no armazenamento. Quando você chama definirNumero, isso atualiza a variável de estado permanentemente na blockchain.

Memória

Memória é uma localização de dados temporária onde as variáveis são armazenadas durante a execução de uma função. Os dados armazenados na memória são apagados entre chamadas de função (externas). É mais barato em termos de gás do que o armazenamento, mas não é persistente.

Exemplo de Memória

pragma solidity ^0.8.0;

contract ExemploMemoria {
    // Função que usa memória
    function criarArray(uint256 tamanho) public pure returns (uint256[] memory) {
        uint256[] memory arrayTemporario = new uint256[](tamanho); // Array na memória
        for (uint256 i = 0; i < tamanho; i++) {
            arrayTemporario[i] = i + 1; // Preencher array
        }
        return arrayTemporario; // Retornar array da memória
    }
}

Neste exemplo, arrayTemporario é declarado na memória. O array existe apenas durante a chamada da função e não será armazenado na blockchain assim que a execução da função for concluída.

Calldata

Calldata é uma localização de dados somente leitura usada para argumentos de funções, especialmente para chamadas de funções externas. Esta localização de dados é imutável, significando que não pode ser modificada. Também é mais eficiente em termos de gás ao lidar com grandes entradas de dados.

Exemplo de Calldata

pragma solidity ^0.8.0;

contract ExemploCalldata {
    // Função que recebe um array como calldata
    function somarArray(uint256[] calldata arr) external pure returns (uint256) {
        uint256 soma = 0;
        for (uint256 i = 0; i < arr.length; i++) {
            soma += arr[i]; // Acessando calldata
        }
        return soma; // Retornar a soma calculada
    }
}

Neste exemplo, o array arr é passado usando a localização calldata. Isso permite que a função leia os dados de entrada diretamente, sem copiá-los para a memória, tornando-a mais eficiente.

Diferenças e Casos de Uso

  1. Armazenamento:

    • Persistente e que altera o estado.
    • Use quando você precisa manter dados entre chamadas de função.
    • Custos de gás mais altos.
  2. Memória:

    • Temporária e modificável.
    • Use para cálculos temporários ou dados que não precisam ser persistentes.
    • Custos de gás mais baixos em comparação com o armazenamento.
  3. Calldata:

    • Somente leitura e imutável.
    • Use para parâmetros de função, especialmente para conjuntos de dados grandes.
    • Mais eficiente em termos de gás para chamadas externas.

Conclusão

Compreender as localizações de dados em Solidity é essencial para escrever contratos inteligentes eficientes e seguros. A escolha entre armazenamento, memória e calldata pode afetar significativamente não apenas a execução dos seus contratos, mas também os custos de gás associados a eles. Sempre considere a localização de dados apropriada com base no caso de uso que você está lidando.

Video

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

Thank you for voting!