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

Melhores práticas para otimizar as taxas de Gas dos contratos inteligentes Ethereum

As taxas de Gas na mainnet do Ethereum sempre foram uma questão complicada, especialmente durante períodos de congestionamento da rede. Durante os picos, os usuários precisam pagar altas taxas de transação. Portanto, otimizar as taxas de Gas na fase de desenvolvimento de contratos inteligentes é crucial. A otimização do consumo de Gas não apenas pode reduzir efetivamente os custos de transação, mas também pode melhorar a eficiência das transações, proporcionando aos usuários uma experiência de blockchain mais econômica e eficiente.

Este artigo irá abordar o mecanismo de taxas de Gas da máquina virtual Ethereum (EVM), os conceitos centrais da otimização das taxas de Gas, bem como as melhores práticas para otimizar as taxas de Gas ao desenvolver contratos inteligentes. Esperamos que este conteúdo possa inspirar e ajudar os desenvolvedores, ao mesmo tempo que ajuda os usuários comuns a entender melhor como funcionam as taxas de Gas do EVM, enfrentando juntos os desafios do ecossistema blockchain.

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

Introdução ao mecanismo de taxa 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, será cobrada uma certa taxa para evitar loops infinitos e ataques de negação de serviço (DoS). A taxa necessária para completar uma transação é chamada de "taxa de Gas".

Desde a activação do fork duro 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 básica 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 os usuários pagam aos validadores.

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

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

Qualquer trecho 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 divergir do que está no livro amarelo.

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

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

A ideia central da otimização de Gas é priorizar operações de custo eficiente 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

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

Melhores práticas para otimização de custos de Gas EVM

Com base nos conceitos básicos acima, organizamos uma lista das melhores práticas para otimização de Gas para a comunidade de desenvolvedores. Ao seguir essas práticas, os desenvolvedores podem reduzir o consumo de Gas dos contratos inteligentes, diminuindo os custos das transações e criando aplicações mais eficientes e amigáveis para os usuários.

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

1. Tente minimizar 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 no armazenamento, gera elevados 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 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 salvar 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.

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

( 2. Variáveis empacotadas

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

O compilador Solidity irá agrupar 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 das variáveis. O empacotamento de variáveis refere-se à organizaçã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. ### Armazenar uma slot de armazenamento não utilizada consome 20.000 Gas (, mas agora apenas requer dois slots de armazenamento.

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

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

) 3. Otimização de 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 dados adequado ajuda a otimizar o uso do 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.

Vistos isoladamente, aqui usar uint256 é mais barato do que usar uint8. No entanto, se utilizarmos 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 para iterá-las será menor do que o custo para quatro variáveis uint256. Assim, o contrato inteligente pode ler e escrever em um slot de armazenamento uma única vez e colocar as quatro variáveis uint8 na memória/armazenamento em uma única operação.

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

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

Se os dados puderem ser controlados em 32 bytes, recomenda-se usar o tipo de dados 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 sempre o menor comprimento possível, de bytes1 a bytes32.

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

5. Mapeamento e Arrays

As listas de dados em Solidity podem ser representadas 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 têm 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 que o empacotamento de tipos de dados possa otimizar o consumo de Gas.

![Ethereum contratos inteligentes de Gas otimização dez melhores práticas]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.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 modificado pela função, enquanto calldata é imutável.

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

Ethereum contratos inteligentes的Gas优化十大最佳实践

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

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

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

( 8. Usar Unchecked garantindo que não ocorrerão transbordamentos/subtransbordamentos.

Quando os desenvolvedores podem garantir que 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 não precisam mais da biblioteca SafeMath, pois o compilador já possui proteção contra estouros e subfluxos incorporada.

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

( 9. Otimizador de modificações

O código do modificador é incorporado à 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-se a reutilização dessa função interna dentro dos modificadores, o que pode reduzir o tamanho do bytecode e diminuir os custos de Gas.

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

10. otimização de curto-circuito

Para os operadores || e &&, a avaliação lógica ocorre com curta-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, deve-se colocar as condições de baixo custo computacional na frente, assim é possível pular os cálculos de alto custo.

Sugestões gerais adicionais

( 1. Remover código inútil

Se houver funções ou variáveis não utilizadas no contrato, é recomendá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 sugestões úteis:

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 removidos. Essencialmente, quaisquer cálculos não utilizados devem ser eliminados.

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 a excluir ou defini-la como 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.

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

) 2. Utilizar 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, menos Gas é necessário. O uso de contratos pré-compilados pode economizar Gas ao reduzir a carga de trabalho computacional necessária para executar contratos inteligentes.

Os 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 melhorar a eficiência de 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 do 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

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
  • 7
  • Partilhar
Comentar
0/400
AlgoAlchemistvip
· 1h atrás
gás está a matar-me
Ver originalResponder0
BearEatsAllvip
· 11h atrás
O custo do gás alto não é apenas um caminho sem saída para quem quer tirar proveito.
Ver originalResponder0
MEVHunterWangvip
· 07-11 05:59
gás novamente subiu, olhar dói o coração
Ver originalResponder0
CoffeeNFTradervip
· 07-11 05:55
gás ainda otimizado é uma armadilha, é melhor ir para layer2
Ver originalResponder0
StrawberryIcevip
· 07-11 05:54
Está preso em alto gás, vamos lá!
Ver originalResponder0
OffchainWinnervip
· 07-11 05:50
Eu não quero usar L2...
Ver originalResponder0
HalfBuddhaMoneyvip
· 07-11 05:31
Não importa o quão alta é a taxa de gás, você tem que apressá-lo, irmão
Ver originalResponder0
  • Pino
Negocie cripto em qualquer lugar e a qualquer hora
qrCode
Digitalizar para transferir a aplicação Gate
Novidades
Português (Portugal)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)