Guia de otimização de Gas para contratos inteligentes Ethereum: As dez melhores práticas e dicas

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

As taxas de Gas na mainnet Ethereum têm sido um problema complicado, especialmente durante momentos de congestionamento da rede. Durante os picos, os usuários frequentemente precisam pagar altas taxas de transação. Portanto, otimizar as taxas de Gas durante a fase de desenvolvimento de contratos inteligentes é crucial. Otimizar o consumo de Gas não só pode reduzir efetivamente os custos de transação, mas também melhorar 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 Máquina Virtual Ethereum (EVM), os conceitos centrais relacionados à otimização das taxas de Gas, bem como as melhores práticas para otimização das taxas de Gas ao desenvolver contratos inteligentes. Espera-se que, através deste conteúdo, possa inspirar e fornecer ajuda prática aos desenvolvedores, ao mesmo tempo que ajuda os usuários comuns a entender melhor como funcionam as taxas de Gas da EVM, enfrentando juntos os desafios do ecossistema blockchain.

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

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

Em redes compatíveis com EVM, "Gas" refere-se à 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 e escrita de memória e armazenamento.

Devido ao fato de que a execução de cada transação requer recursos de computação, será cobrada uma certa taxa para prevenir loops infinitos e ataques de negação de serviço (DoS). A taxa necessária para concluir uma transação é chamada de "taxa de Gas".

Desde a entrada em vigor do EIP-1559, a taxa de Gas é calculada 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 um incentivo, encorajando os validadores a adicionar transações à blockchain. Ao enviar uma transação, definir uma taxa prioritária mais alta 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 ao validador.

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 seja, opcodes.

Qualquer trecho de código de operação (, como criar contratos, fazer chamadas de mensagem, acessar o 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 do EIP, o custo de Gas de alguns códigos de operação foi ajustado, podendo estar em desacordo com o livro amarelo.

2.Conceito básico de otimização de gás

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

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 variáveis de calldata, como arrays e estruturas de calldata
  • Chamada de função interna

As operações com custos mais elevados 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 Gas do EVM

Com base nos conceitos básicos acima mencionados, compilámos uma lista de melhores práticas para a otimização das 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 utilizador.

1. Tente reduzir o uso de armazenamento.

No Solidity, o armazenamento( é um recurso limitado, cujo consumo de Gas é muito superior ao da memória). Cada vez que um contrato inteligente lê ou escreve dados do 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 superior ao das operações de memória. Por exemplo, os códigos de operação mload e mstore consomem apenas 3 unidades de Gas, enquanto as operações de armazenamento como sload e sstore, mesmo nas melhores condições, custam pelo menos 100 unidades.

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 guardar os resultados intermédios na memória, e depois de todas as computações estarem concluídas, atribuir os resultados às variáveis de armazenamento.

Gas otimização das dez melhores práticas de 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 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, utilizando um slot de armazenamento de 32 bytes como a unidade básica de armazenamento das variáveis. O empacotamento de variáveis refere-se à disposição adequada das variáveis, permitindo que várias variáveis se ajustem a um único slot de armazenamento.

Com este ajuste de detalhe, os desenvolvedores podem economizar 20.000 unidades de Gas ### para armazenar uma slot de armazenamento não utilizada que consumiria 20.000 Gas (, mas agora apenas requer dois slots de armazenamento.

Como cada slot de armazenamento consome Gas, a compactação de variáveis otimiza o uso do Gas ao reduzir o número de slots de armazenamento necessários.

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

) 3. Otimizar tipos de dados

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

Por exemplo, em Solidity, os inteiros podem ser divididos 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.

Vendo isoladamente, usar uint256 é 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 o desenvolvedor conseguir empacotar quatro variáveis uint8 em um único slot de armazenamento, o custo total de iterá-las será menor do que o de quatro variáveis uint256. Assim, o contrato inteligente poderá ler e gravar um único slot de armazenamento, colocando quatro variáveis uint8 na memória/armazenamento em uma única operação.

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

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

Se os dados puderem ser controlados dentro de 32 bytes, é recomendado usar o tipo de dados bytes32 em vez de bytes ou strings. De modo geral, variáveis de tamanho fixo consomem menos Gas do que variáveis de tamanho variável. Se o comprimento em bytes puder ser limitado, escolha sempre o menor comprimento possível entre bytes1 e bytes32.

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

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.

Em muitos casos, os mapeamentos são mais eficientes e têm custos mais baixos, mas os arrays possuem iterabilidade e suportam o empacotamento 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 possa haver otimizações no consumo de Gas através do empacotamento de tipos de dados.

![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 a memory pode ser modificada pela função, enquanto a calldata é imutável.

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

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

( 7. Tente usar as palavras-chave Constant/Immutable sempre que possível.

As 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, recomendando-se usar as palavras-chave Constant ou Immutable sempre que possível.

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

( 8. Usar Unchecked garantindo que não ocorra overflow/underflow

Quando os desenvolvedores podem ter certeza de que as operações aritméticas não causarão 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, a partir da versão 0.8.0, os compiladores não precisam mais utilizar a biblioteca SafeMath, pois o compilador já possui funcionalidades de proteção contra overflow e underflow embutidas.

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

( 9. otimizador

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

Ao reestruturar a lógica como uma função interna _checkOwner)###, permite a reutilização dessa função interna nos modificadores, o que pode reduzir o tamanho do bytecode e diminuir os custos de Gas.

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

10. Otimização de curto-circuito

Para os operadores || e &&, a operação lógica sofre 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 de computação devem ser colocadas primeiro, assim é possível pular cálculos de alto custo.

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

Sugestões Gerais Adicionais

( 1. Remover código inútil

Se existirem 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 úteis:

Utilize o algoritmo mais eficiente para realizar os 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 eliminado.

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 como o valor padrão.

Otimização de loops: evite operações de loop de alto custo, combine loops sempre que possível e mova 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 de trabalho 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 utilizar 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.

ETH0.26%
GAS-1.71%
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
  • 8
  • Repostar
  • Compartilhar
Comentário
0/400
SerumDegenvip
· 07-23 04:02
lmao gás drenando minha carteira agora... rekt af
Ver originalResponder0
WalletDivorcervip
· 07-21 18:08
Com mãos, é possível ver a otimização do contrato
Ver originalResponder0
ProofOfNothingvip
· 07-20 15:12
gás sem dinheiro, o que mais podemos discutir?
Ver originalResponder0
AlphaBrainvip
· 07-20 04:31
Deixa pra lá, não quero otimizar o gás, vamos para o L2.
Ver originalResponder0
ImpermanentLossEnjoyervip
· 07-20 04:29
Quem ainda se lembra do desastre de uma transação de 2000u?
Ver originalResponder0
OvertimeSquidvip
· 07-20 04:19
Para negociar taxas, você precisa pagar a hipoteca.
Ver originalResponder0
DeFiVeteranvip
· 07-20 04:17
Ainda é melhor ir para o silêncio.
Ver originalResponder0
IronHeadMinervip
· 07-20 04:08
A taxa de gás é realmente insuportável
Ver originalResponder0
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)