SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
18.11.2024

Lição: 068: Técnicas de Otimização de Gas em Solidity

A otimização de gas é um aspecto essencial da programação em Solidity, especialmente considerando os custos crescentes de gas na rede Ethereum. Ao otimizar seus contratos inteligentes, você pode reduzir as taxas de transação para os usuários e melhorar a eficiência geral do seu dApp. Nesta aula, exploraremos várias técnicas para otimizar o uso de gas em Solidity. Forneceremos exemplos para demonstrar como essas técnicas podem ser aplicadas de maneira eficaz.

1. Minimize as Escritas em Variáveis de Estado

Escrever na blockchain custa gas. Portanto, minimizar a frequência de atualizações das variáveis de estado pode resultar em economias significativas. Em vez de fazer várias escritas, considere consolidar as atualizações em menos transações.

Exemplo:

pragma solidity ^0.8.0;

contract OtimizacaoGas {
    uint256 public contador;

    // Função ineficiente em termos de gas
    function incrementoIneficiente() public {
        contador += 1;
        contador += 1;
        contador += 1;
    }

    // Função eficiente em termos de gas
    function incrementoEficiente() public {
        contador += 3;
    }
}

Consolidando as escritas, você economiza gas na função incrementoEficiente.

2. Use Funções view e pure

Funções declaradas como view ou pure não modificam o estado do contrato e podem ser chamadas sem custos de gas quando invocadas externamente. Assim, utilizar esses tipos de funções para operações de leitura pode otimizar o uso de gas.

Exemplo:

pragma solidity ^0.8.0;

contract OtimizacaoGas {
    uint256 private valor;

    // função view
    function obterValor() public view returns (uint256) {
        return valor;
    }

    // função pure
    function soma(uint256 a, uint256 b) public pure returns (uint256) {
        return a + b;
    }
}

Utilizar funções view e pure ajuda a minimizar taxas de gas desnecessárias para operações de leitura.

3. Agrupando Variáveis

Solidity armazena variáveis em slots de 32 bytes. Ao agrupar tipos de dados menores no mesmo slot, você pode reduzir significativamente os custos de armazenamento.

Exemplo:

pragma solidity ^0.8.0;

contract VariaveisAgrupadas {
    // Ineficiente em termos de gas: slots separados para cada variável
    uint8 public a;
    uint48 public b;
    uint8 public c;

    // O custo total de gas é maior

    // Eficiente em termos de gas: variáveis agrupadas
    uint8 public agrupadoA;
    uint56 public agrupadoB;  // 8 bits para agrupadoA + 48 bits para agrupadoB
}

Agrupando variáveis, você economiza espaço de memória e reduz os custos de gas associados ao armazenamento.

4. Use calldata para Parâmetros de Função Externa

Ao passar arrays grandes ou structs para funções, usar calldata em vez de memory pode economizar gas, pois evita a cópia de dados e reduz a sobrecarga.

Exemplo:

pragma solidity ^0.8.0;

contract OtimizacaoGas {
    function processarArray(uint256[] calldata dados) external {
        // faça algo com os dados
    }
}

Neste exemplo, usar calldata em vez de memory reduz significativamente os custos de gas.

5. Curto-Circuito em Operações Lógicas

Solidity avalia operações lógicas da esquerda para a direita, o que permite o curto-circuito. Ao colocar a condição que provavelmente é falsa primeiro, você pode economizar gas em avaliações desnecessárias.

Exemplo:

pragma solidity ^0.8.0;

contract CurtoCircuito {
    function verificarCondicoes(bool a, bool b, bool c) external pure returns (bool) {
        // O curto-circuito irá ignorar b se a for falsa
        return a || (b && c);
    }
}

Essa abordagem pode levar a ganhos de eficiência quando certas condições têm mais probabilidade de falhar.

6. Delete Variáveis Não Utilizadas

Se uma variável de estado não for mais necessária, usar a palavra-chave delete para removê-la pode economizar gas. Deletar uma variável redefine seu slot de armazenamento para zero, o que pode liberar espaço se a vida útil da variável tiver terminado.

Exemplo:

pragma solidity ^0.8.0;

contract GerenciamentoVariaveis {
    uint256 public dados;

    function definirDados(uint256 _dados) public {
        dados = _dados;
    }

    function redefinirDados() public {
        delete dados; // economiza gas e redefine a variável para zero
    }
}

Ao redefinir variáveis não utilizadas, você pode evitar o consumo excessivo de gas.

Conclusão

A otimização de gas é crucial no desenvolvimento em Solidity. Ao aproveitar as técnicas delineadas nesta aula—incluindo minimizar as escritas em variáveis de estado, usar funções view e pure, agrupar variáveis, usar calldata, curto-circuito e deletar variáveis não utilizadas—você pode criar contratos inteligentes eficientes que economizam custos de gas para os usuários. Sempre mantenha esses princípios em mente ao desenvolver seus dApps para melhorar o desempenho e a satisfação do usuário.

Video

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

Thank you for voting!