Estratégias de otimização de Gas para contratos inteligentes Ethereum e melhores práticas

Estratégias de otimização de custos de Gas no desenvolvimento de contratos inteligentes

O problema das taxas de Gas da rede principal do Ethereum tem sido um foco de atenção para desenvolvedores e usuários, especialmente quando a rede está congestionada. Durante os picos de transações, os usuários muitas vezes precisam pagar taxas elevadas. Portanto, otimizar as taxas de Gas na fase de desenvolvimento de contratos inteligentes é especialmente importante. A otimização do 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á resumir o mecanismo de taxas de Gas da Máquina Virtual Ethereum (EVM), os conceitos centrais relacionados e as melhores práticas para otimização das taxas de Gas ao desenvolver contratos inteligentes. Esperamos que este conteúdo possa inspirar e ajudar os desenvolvedores, ao mesmo tempo que também ajuda os usuários comuns a entender melhor como funcionam as taxas de Gas da EVM, enfrentando juntos os desafios no ecossistema blockchain.

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

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 computação necessária para executar operações específicas.

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

Devido ao fato de que a execução de cada transação requer recursos computacionais, será cobrada uma certa taxa para evitar 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 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.

Compreendendo a otimização de Gas no EVM

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

Qualquer sequência de código de operação (, como criar contratos, realizar chamadas de mensagens, acessar o armazenamento de contas e executar operações na máquina virtual ), tem um custo 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 ser diferente do que está no 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, por exemplo, o array e a estrutura calldata
  • Chamada de função interna

Operações de alto custo incluem:

  • Ler e escrever variáveis de estado armazenadas em contratos inteligentes
  • Chamada de função externa
  • Operação em loop

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

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

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

1. Tente reduzir o uso de armazenamento.

Em 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 maior do que o das operações de memória. Por exemplo, as instruções OPcodesmload 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.

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 armazenar resultados intermediários na memória e, após a conclusão de todos os cálculos, atribuir os resultados às variáveis de armazenamento.

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

( 2. Variáveis empacotadas

O número de slots de armazenamento ) utilizados em contratos inteligentes e a maneira como os desenvolvedores representam os dados terão um grande impacto no consumo de Gas.

O compilador Solidity irá empacotar variáveis de armazenamento contínuas durante o processo de compilação e usará slots 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, de modo que várias variáveis possam caber em um único slot de armazenamento.

Com este ajuste de detalhe, os desenvolvedores podem economizar 20.000 unidades de Gas ### armazenando um slot de armazenamento não utilizado que consome 20.000 Gas (.

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

![As dez melhores práticas de otimização de Gas para contratos inteligentes do 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 das operações 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 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 usar uint8. No entanto, se a otimização de empacotamento de variáveis for aplicada, 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 custo de quatro variáveis uint256. Assim, o contrato inteligente pode ler e gravar um único slot de armazenamento e, em uma única operação, colocar quatro variáveis uint8 na memória/armazenamento.

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

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

Se os dados puderem ser controlados dentro de 32 bytes, é recomendável usar o tipo de dado 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 comprimento mínimo de bytes1 a bytes32.

As 10 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.

Na maioria dos casos, os mapeamentos são mais eficientes e têm custos mais baixos, mas os arrays possuem iterabilidade e suportam 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 que o empacotamento de tipos de dados possa otimizar o consumo de Gas.

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

) 6. Usar calldata em vez de memory

As variáveis declaradas nos parâmetros de 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 são somente 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.

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

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

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

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

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

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

Além disso, compiladores da versão 0.8.0 e superior já não precisam mais da biblioteca SafeMath, pois o próprio compilador já possui proteção contra estouro e subfluxo.

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

( 9. otimizador de modificações

O código do modificador é embutido na função modificada, e sempre 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, permitindo a reutilização dessa função interna nos modificadores, é possível reduzir o tamanho do bytecode e diminuir os custos de Gas.

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

( 10. otimização de curto-circuito

Para os operadores || e &&, a avaliação lógica ocorre com 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 cálculo devem ser colocadas primeiro, assim é possível evitar cálculos dispendiosos.

![As 10 melhores práticas de otimização de Gas para contratos inteligentes Ethereum])https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.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 removê-las. Esta é a maneira mais direta de reduzir os custos de implantação do contrato e manter o tamanho do contrato pequeno.

Aqui estão algumas dicas práticas:

  • Utilize 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 eliminados. 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 usar a palavra-chave delete para removê-la ou defini-la como 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. Usar contratos inteligentes pré-compilados

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 no nó 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 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.

) 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 seriam difíceis de realizar apenas com Solidity, proporcionando mais flexibilidade na otimização do consumo de Gas.

No entanto, o uso de assembly em linha também pode trazer riscos e é propenso a erros. Portanto, deve ser utilizado com cautela, limitado a desenvolvedores experientes.

( 4. Utilizando soluções Layer 2

fazer

ETH-1.8%
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
  • Compartilhar
Comentário
0/400
DancingCandlesvip
· 08-01 22:01
As taxas de gás estão realmente muito caras.
Ver originalResponder0
MEVEyevip
· 07-31 20:06
A otimização especializada já é uma necessidade básica.
Ver originalResponder0
P2ENotWorkingvip
· 07-31 11:30
gás费真贵啊
Ver originalResponder0
ReverseFOMOguyvip
· 07-31 01:52
As taxas de gás estão muito absurdas, não estão?
Ver originalResponder0
BearMarketBardvip
· 07-31 01:51
A otimização é um tema eterno
Ver originalResponder0
MetaMisfitvip
· 07-31 01:49
A faca das taxas de Gas é realmente afiada.
Ver originalResponder0
OldLeekMastervip
· 07-31 01:35
Armadilha de boneca russa é muito profunda.
Ver originalResponder0
BlockchainTherapistvip
· 07-31 01:26
Relato da linha de frente comunica a verdade
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)