Guia de Práticas para Otimização de Gas Fees de Contratos Inteligentes Ethereum

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

As taxas de Gas na mainnet Ethereum têm sido um problema difícil de resolver, especialmente em momentos de congestionamento da rede. Durante os períodos de pico, os usuários frequentemente precisam pagar taxas de transação elevadas. Portanto, a otimização das taxas 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 pode aumentar a eficiência das transações, proporcionando aos usuários uma experiência de uso de blockchain mais econômica e eficiente.

Este artigo irá descrever o mecanismo de taxas de Gas da Ethereum Virtual Machine (EVM), os conceitos centrais da otimização de taxas de Gas, bem como as melhores práticas para a otimização de taxas de Gas no desenvolvimento de contratos inteligentes. Espera-se que este conteúdo possa inspirar e ajudar os desenvolvedores, ao mesmo tempo que ajuda os usuários comuns a entender melhor o funcionamento das taxas de Gas do EVM, enfrentando juntos os desafios do ecossistema blockchain.

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

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

Em redes compatíveis com EVM, "Gas" é a unidade usada 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/escrita de memória e armazenamento.

Devido a cada transação exigir recursos de computação para ser executada, será cobrada uma certa taxa para evitar loops infinitos e ataques de negação de serviço (DoS). O custo necessário para completar uma transação é chamado de "taxa de Gas".

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

Taxa de gás = unidades de gás usadas * (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. Definir uma taxa prioritária mais alta ao enviar uma transação pode aumentar a probabilidade de a transação ser incluída no próximo bloco. Isso é semelhante a uma "gorjeta" que o usuário paga aos validadores.

Oito melhores práticas para otimização de Gas em contratos inteligentes Ethereum

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 sequência de código de operação (, como a criação de contratos, a realização de chamadas de mensagens, o acesso ao armazenamento de contas e a execução de 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, o custo de Gas de alguns códigos de operação foi ajustado, podendo estar em desacordo com o livro amarelo.

conceito básico de 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 arrays e estruturas de calldata
  • Chamada de função interna

Operações de custo mais elevado incluem:

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

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

Melhores práticas para otimização de taxas de gás EVM

Com base nos conceitos básicos acima, compilámos uma lista de 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 Gas dos contratos inteligentes, diminuir os custos de transação e criar aplicações mais eficientes e amigáveis para o usuário.

1. Tente reduzir o uso de armazenamento.

Em Solidity, o Storage( armazena) é um recurso limitado, cujo consumo de Gas é muito superior ao da Memory(. Cada vez que um contrato inteligente lê ou escreve dados do armazenamento, gera um alto custo de Gas.

De acordo com a definição do livro amarelo do Ethereum, o custo das operações de armazenamento é mais de 100 vezes superior ao das operações de memória. Por exemplo, as instruções 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: mantendo os resultados intermediários na memória e, após a conclusão de todos os cálculos, atribuindo os resultados às variáveis de armazenamento.

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

) 2. Empacotamento de variáveis

O número de slots de armazenamento ### usados nos contratos inteligentes e a forma como os desenvolvedores representam os dados terão um grande impacto no consumo de Gas.

O compilador Solidity empacota variáveis de armazenamento contínuas durante o processo de compilação e usa um slot de armazenamento de 32 bytes como a unidade básica de armazenamento das variáveis. O empacotamento de variáveis refere-se a organizar as variáveis de forma a permitir que várias variáveis se ajustem em um único slot de armazenamento.

Com esse ajuste de detalhe, os desenvolvedores podem economizar 20.000 unidades de Gas. Armazenar um slot de armazenamento não utilizado requer 20.000 Gas, mas agora apenas dois slots de armazenamento são necessários.

Como cada slot de armazenamento consome Gas, o empacotamento de variáveis otimiza o uso de Gas ao reduzir o número de slots de armazenamento necessários.

Gas otimização das dez melhores práticas de contratos inteligentes Ethereum

( 3. Otimizar tipos de dados

Uma variável pode ser representada por vários tipos de dados, mas o custo das operações correspondentes a diferentes tipos de dados também é diferente. Escolher o tipo de dados 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 em uint256, e essa conversão consome Gas adicional.

Analisando isoladamente, usar uint256 é mais barato do que uint8. No entanto, se a otimização de empacotamento de variáveis for utilizada, a situação muda. Se o desenvolvedor conseguir empacotar quatro variáveis uint8 em um slot de armazenamento, então o custo total para iterá-las será menor do que o de quatro variáveis uint256. Assim, 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 de otimização de Gas para 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 o uso do 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, tente escolher o menor comprimento possível de bytes1 a bytes32.

5. Mapeamentos e arrays

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

Os mapeamentos são geralmente mais eficientes e menos custosos na maioria dos casos, mas os arrays têm iterabilidade e suportam o empacotamento de tipos de dados. Portanto, recomenda-se usar mapeamentos ao gerenciar listas de dados, a menos que seja necessário iterar ou que o consumo de Gas possa ser otimizado através do empacotamento de tipos de dados.

Práticas recomendadas para otimização de Gas em contratos inteligentes Ethereum

( 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 apenas leitura, deve-se dar prioridade ao 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, sempre que possível, as palavras-chave Constant/Immutable.

Variáveis Constant/Immutable não são armazenadas no armazenamento do contrato. Essas variáveis são calculadas em tempo de compilação e armazenadas no bytecode do contrato. Portanto, em comparação com o armazenamento, o custo de acesso a elas é muito menor, sendo recomendado usar os keywords Constant ou Immutable sempre que possível.

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

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

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

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

9. otimizador de modificações

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

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

![Ethereum contratos inteligentes Gas otimização das dez melhores práticas]###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 ocorre por avaliação de curto-circuito, ou seja, se a primeira condição já pode determinar o resultado da expressão lógica, a segunda condição não será avaliada.

Para otimizar o consumo de Gas, deve-se colocar as condições de baixo custo de cálculo à frente, assim é possível pular cálculos mais caros.

![Melhores práticas de otimização de Gas para contratos inteligentes Ethereum])https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

Sugestões gerais adicionais

) 1. Remover código inútil

Se houver funções ou variáveis não utilizadas no contrato, recomenda-se que sejam removidas. 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 sugestões práticas:

  • Utilize os algoritmos mais eficientes para calcular. Se os resultados de certos cálculos forem usados diretamente no contrato, então deve-se eliminar esses processos de cálculo redundantes. Essencialmente, qualquer cálculo não utilizado deve ser removido.

  • 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 utilizar a palavra-chave delete para removê-la, ou defini-la como 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.

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

) 2. Usar contratos inteligentes pré-compilados

Os contratos pré-compilados oferecem funções de biblioteca complexas, como operações de criptografia e hash. Como o código não é executado na EVM, mas sim localmente nos nós do cliente, o gás necessário é menor. O uso de contratos pré-compilados pode economizar gás 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.

) 3. Usar código de assembleia inline

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 códigos de operação Solidity caros. 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 na otimização do 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, limitado a desenvolvedores experientes.

![Ethereum contratos inteligentes de Gas otimização dez melhores práticas])

Ver original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Recompensa
  • 8
  • Compartilhar
Comentário
0/400
WalletInspectorvip
· 18h atrás
gás费太贵 不如L2
Ver originalResponder0
CryptoCross-TalkClubvip
· 07-11 01:06
Rindo até morrer, as taxas de Gas estão a subir, a carteira dos idiotas está a queimar
Ver originalResponder0
liquiditea_sippervip
· 07-11 01:03
gás realmente está caro demais
Ver originalResponder0
AirdropChaservip
· 07-11 01:03
Agora o gás não pode ser mais humanizado! Gastar dinheiro como se fosse água.
Ver originalResponder0
MEVSandwichVictimvip
· 07-11 01:02
Ainda estou a otimizar, todos os dias sou esgotado pelo Gas.
Ver originalResponder0
LiquidityNinjavip
· 07-11 01:01
Sou um ninja no mundo da encriptação. Taxas de Gas muito altas realmente partem meu coração. Fazer trades pontuais é o caminho a seguir.

Por favor, gere um comentário em português sobre este artigo.
Ver originalResponder0
DaoDevelopervip
· 07-11 00:56
acabei de implantar um contrato inteligente otimizado para gás... vocês não acreditariam nas economias, de verdade
Ver originalResponder0
ImpermanentPhilosophervip
· 07-11 00:44
gás está muito caro, não consigo dormir
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)