14 dicas para otimizar os custos de Gas dos contratos inteligentes Ethereum e ajudar os desenvolvedores a reduzir custos

Melhores práticas de otimização de Gas para contratos inteligentes Ethereum

As taxas de Gas na mainnet Ethereum sempre foram um problema complicado, especialmente quando a rede está congestionada. Durante os períodos de pico, os usuários frequentemente precisam pagar taxas de transação caras. Portanto, otimizar os custos de Gas durante a fase de desenvolvimento de contratos inteligentes é crucial. A otimização do consumo de Gas não só pode reduzir efetivamente os custos de transação, mas também aumentar a eficiência das transações, proporcionando aos usuários uma experiência em blockchain mais econômica e eficiente.

Este artigo irá resumir o mecanismo de taxas de Gas da Ethereum Virtual Machine (EVM), os conceitos centrais da otimização das taxas de Gas, bem como as melhores práticas para otimização das taxas de Gas ao desenvolver contratos inteligentes. Esperamos que este conteúdo possa fornecer inspiração e ajuda prática aos desenvolvedores, ao mesmo tempo que ajuda os usuários comuns a entender melhor o funcionamento das taxas de Gas da EVM, enfrentando juntos os desafios do ecossistema blockchain.

Ethereum contratos inteligentes de otimização de Gas: as 10 melhores práticas

Introdução ao mecanismo de taxas de Gas do EVM

Em redes compatíveis com EVM, "Gas" é a unidade utilizada para medir a capacidade de cálculo necessária para executar operações específicas.

Na estrutura do EVM, o consumo de Gas é dividido em três partes: execução de operações, chamadas de mensagens externas e leitura e escrita de memória e armazenamento.

Devido ao fato de que a execução de cada transação requer recursos computacionais, uma certa taxa será cobrada para evitar ciclos infinitos e ataques de negação de serviço (DoS). O custo necessário para completar uma transação é conhecido como "taxa de Gas".

Desde a ativação do fork hard de Londres EIP-1559( ), as taxas de Gas são calculadas pela seguinte fórmula:

Taxa de gás = unidades de gás utilizadas * (taxa base + taxa de prioridade)

A taxa base será destruída, enquanto a taxa prioritária servirá como incentivo, encorajando os validadores a adicionar transações à blockchain. Ao definir uma taxa prioritária mais alta ao enviar uma transação, é possível aumentar a probabilidade de que a transação seja incluída no próximo bloco. Isso é semelhante a uma "gorjeta" que os usuários pagam aos validadores.

Oito Melhores Práticas de Otimização de Gas para Contratos Inteligentes Ethereum

1. Compreender a otimização de Gas no EVM

Quando um contrato inteligente é compilado com Solidity, o contrato é convertido em uma série de "códigos de operação", ou opcodes.

Qualquer código de operação (, como criar contratos, realizar chamadas de mensagens, acessar armazenamento de contas e executar operações na máquina virtual ), tem um custo de consumo de Gas reconhecido, que está registrado no livro amarelo do Ethereum.

Após várias modificações no EIP, alguns custos de Gas para códigos de operação foram ajustados, o que pode divergir do que está no livro amarelo.

2.Conceitos básicos da otimização de Gas

A ideia central da otimização de Gas é priorizar operações com alta eficiência de custo na blockchain EVM, evitando operações com custos de Gas elevados.

No EVM, as seguintes operações têm um custo mais baixo:

  • Ler e escrever variáveis de memória
  • Ler constantes e variáveis imutáveis
  • Ler e escrever variáveis locais
  • Ler a variável calldata, como o array e a estrutura calldata
  • Chamada de função interna

Operações com custos mais elevados incluem:

  • Ler e escrever as variáveis de estado armazenadas no armazenamento do contrato
  • Chamada de função externa
  • Operação em loop

O melhor das 10 práticas de otimização de Gas para contratos inteligentes Ethereum

Melhores Práticas para Otimização de Custos de Gas do EVM

Com base nos conceitos básicos acima, compilamos uma lista das melhores práticas para otimização de taxas de Gas para a comunidade de desenvolvedores. Ao seguir estas práticas, os desenvolvedores podem reduzir o consumo de taxas de Gas dos contratos inteligentes, diminuir os custos de transação e criar aplicações mais eficientes e amigáveis ao usuário.

1. Tente minimizar o uso de armazenamento

Em Solidity, o Storage( armazena) é um recurso limitado, cujo consumo de Gas é muito superior ao da Memory( memória). Cada vez que um contrato inteligente lê ou grava dados no armazenamento, gera altos custos de Gas.

De acordo com a definição do livro amarelo do Ethereum, o custo das operações de armazenamento é mais de 100 vezes maior do que o das operações de memória. Por exemplo, os OPcodes mload e mstore consomem apenas 3 unidades de Gas, enquanto operações de armazenamento como sload e sstore, mesmo nas melhores condições, custam pelo menos 100 unidades.

Os métodos para limitar o uso de armazenamento incluem:

  • Armazenar dados não permanentes na memória
  • Reduzir o número de modificações de armazenamento: ao manter os resultados intermediários na memória e, após a conclusão de todos os cálculos, alocar os resultados às variáveis de armazenamento.

O melhor de 10 práticas recomendadas para otimização de Gas em contratos inteligentes Ethereum

2. Empacotamento de variáveis

O número de slots de armazenamento ( usados em contratos inteligentes e a forma como os desenvolvedores representam os dados afectarão significativamente o consumo de Gas.

O compilador Solidity agrupa variáveis de armazenamento contínuas durante o processo de compilação, utilizando slots de armazenamento de 32 bytes como a unidade básica de armazenamento de variáveis. O empacotamento de variáveis refere-se à disposição adequada das variáveis, de modo que múltiplas variáveis possam caber em um único slot de armazenamento.

Com este ajuste de detalhe, os desenvolvedores podem economizar 20.000 unidades de Gas ) armazenar um slot de armazenamento não utilizado consome 20.000 Gas (, mas agora apenas requer dois slots de armazenamento.

Uma vez que cada espaço de armazenamento consome Gas, a compactação de variáveis otimiza o uso de Gas reduzindo o número de espaços de armazenamento necessários.

![Oito Melhores Práticas para a Otimização de Gas em Contratos Inteligentes Ethereum])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 3. Otimizar tipos de dados

Uma variável pode ser representada por vários tipos de dados, mas os custos de operação correspondentes a diferentes tipos de dados também variam. Escolher o tipo de dado adequado ajuda a otimizar o uso de Gas.

Por exemplo, em Solidity, os inteiros podem ser subdivididos em diferentes tamanhos: uint8, uint16, uint32, etc. Como a EVM executa operações em unidades de 256 bits, usar uint8 significa que a EVM deve primeiro convertê-lo para uint256, e essa conversão consome Gas adicional.

Isoladamente, usar uint256 aqui é mais barato do que uint8. No entanto, se usarmos a otimização de empacotamento de variáveis que sugerimos anteriormente, a situação muda. Se os desenvolvedores conseguirem empacotar quatro variáveis uint8 em um slot de armazenamento, o custo total de iterá-las será menor do que o de quatro variáveis uint256. Dessa forma, o contrato inteligente pode ler e escrever em um slot de armazenamento uma única vez e colocar quatro variáveis uint8 na memória/armazenamento em uma única operação.

![Oito melhores práticas para otimização de Gas em contratos inteligentes Ethereum]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(

) 4. Usar variáveis de tamanho fixo em vez de variáveis dinâmicas

Se os dados puderem ser controlados dentro de 32 bytes, recomenda-se usar o tipo de dado bytes32 em vez de bytes ou strings. Em geral, variáveis de tamanho fixo consomem menos Gas do que variáveis de tamanho variável. Se o comprimento dos bytes puder ser limitado, escolha o menor comprimento possível entre bytes1 e bytes32.

5. Mapeamento e Arrays

A lista de dados do Solidity pode ser representada por dois tipos de dados: Arrays### e Mappings(, mas sua sintaxe e estrutura são completamente diferentes.

Mapeamentos são geralmente mais eficientes e têm custos mais baixos na maioria dos casos, mas arrays têm a capacidade de iteração e suportam a embalagem de tipos de dados. Portanto, recomenda-se priorizar o uso de mapeamentos ao gerenciar listas de dados, a menos que seja necessário iterar ou que a embalagem de tipos de dados possa otimizar o consumo de Gas.

![Ethereum contratos inteligentes Gas otimização das dez melhores práticas])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. Usar calldata em vez de memory

As variáveis declaradas nos parâmetros da função podem ser armazenadas em calldata ou memory. A principal diferença entre os dois é que memory pode ser modificada pela função, enquanto calldata é imutável.

Lembre-se deste princípio: se os parâmetros da função forem somente leitura, deve-se priorizar o uso de calldata em vez de memory. Isso pode evitar operações de cópia desnecessárias de calldata da função para memory.

( 7. Utilize a palavra-chave Constant/Immutable sempre que possível.

As variáveis Constant/Immutable não são armazenadas na memória do contrato. Essas variáveis são calculadas durante a compilação e armazenadas no bytecode do contrato. Portanto, em comparação com a memória, o custo de acesso a elas é muito menor, recomendando-se o uso das palavras-chave Constant ou Immutable sempre que possível.

![Ethereum contratos inteligentes Gas otimização das dez melhores práticas])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp###

8. Usar Unchecked ao garantir que não ocorram overflow/underflow

Quando os desenvolvedores podem ter certeza de que as operações aritméticas não resultarão em overflow ou underflow, podem usar a palavra-chave unchecked introduzida no Solidity v0.8.0 para evitar verificações desnecessárias de overflow ou underflow, economizando assim custos de Gas.

Além disso, as versões 0.8.0 e superiores do compilador já não precisam mais da biblioteca SafeMath, pois o próprio compilador já possui proteção contra overflow e underflow incorporada.

( 9. otimizador

O código do modificador é incorporado na função modificada, e cada vez que o modificador é utilizado, seu código é copiado. Isso aumentará o tamanho do bytecode e elevará o consumo de Gas.

Ao reconstruir a lógica como uma função interna _checkOwner)###, permitindo a reutilização dessa função interna em modificadores, é possível reduzir o tamanho do bytecode e diminuir os custos de Gas.

![Práticas recomendadas para otimização de Gas em contratos inteligentes Ethereum]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 10. Otimização de curto-circuito

Para os operadores || e &&, a avaliação lógica sofre uma avaliação de curto-circuito, ou seja, se a primeira condição já puder determinar o resultado da expressão lógica, a segunda condição não será avaliada.

Para otimizar o consumo de Gas, as condições de baixo custo computacional devem ser colocadas na frente, assim é possível pular cálculos de alto custo.

Melhores 10 práticas de otimização de Gas para contratos inteligentes Ethereum

Sugestões gerais adicionais

1. Remover código inútil

Se houver funções ou variáveis não utilizadas no contrato, é aconselhável removê-las. Esta é a forma mais direta de reduzir os custos de implantação do contrato e manter o tamanho do contrato pequeno.

Aqui estão algumas dicas úteis:

Use os algoritmos mais eficientes para realizar cálculos. Se os resultados de certos cálculos forem usados diretamente no contrato, então esses processos de cálculo redundantes devem ser removidos. Essencialmente, qualquer cálculo não utilizado deve ser excluído.

No Ethereum, os desenvolvedores podem obter recompensas em Gas ao liberar espaço de armazenamento. Se uma variável não for mais necessária, deve-se usar a palavra-chave delete para removê-la ou defini-la para o valor padrão.

Otimização de loops: evitar operações de loop de alto custo, combinar loops sempre que possível e mover cálculos repetidos para fora do corpo do loop.

( 2. Utilizando contratos pré-compilados

Os contratos pré-compilados oferecem funções de biblioteca complexas, como operações de criptografia e hashing. Como o código não é executado na EVM, mas sim localmente nos nós do cliente, é necessário menos Gas. O uso de contratos pré-compilados pode economizar Gas ao reduzir a carga computacional necessária para executar contratos inteligentes.

Exemplos de contratos pré-compilados incluem o algoritmo de assinatura digital de curva elíptica )ECDSA### e o algoritmo de hash SHA2-256. Ao usar esses contratos pré-compilados em contratos inteligentes, os desenvolvedores podem reduzir os custos de Gas e aumentar a eficiência da execução das aplicações.

![Oito melhores práticas de otimização de Gas em contratos inteligentes Ethereum]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 3. Usar código de montagem em linha

Assembly em linha ( in-line assembly ) permite que os desenvolvedores escrevam código de baixo nível, mas eficiente, que pode ser executado diretamente pela EVM, sem a necessidade de usar os caros códigos de operação Solidity. A assembly em linha também permite um controle mais preciso sobre o uso de memória e armazenamento, reduzindo ainda mais as taxas de Gas. Além disso, a assembly em linha pode executar algumas operações complexas que são difíceis de realizar apenas com Solidity, oferecendo mais flexibilidade para otimizar o consumo de Gas.

No entanto, o uso de assembly inline também pode trazer riscos e ser propenso a erros. Portanto, deve ser usado com cautela, reservado apenas para desenvolvedores experientes.

4. Usar soluções Layer 2

A utilização de soluções Layer 2 pode reduzir a necessidade de armazenar e calcular na rede principal do Ethereum.

ETH1.7%
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
  • Recompensa
  • 3
  • Compartilhar
Comentário
0/400
RugResistantvip
· 07-28 10:42
Experiência prática garantida
Ver originalResponder0
P2ENotWorkingvip
· 07-28 09:27
gás费太离谱了
Ver originalResponder0
PhantomMinervip
· 07-25 13:06
insights valiosos实战价值高
Ver originalResponder0
  • Marcar
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)