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

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

As taxas de Gas na mainnet do Ethereum têm sido um dos principais desafios enfrentados por desenvolvedores e usuários, especialmente durante períodos de congestão da rede. Durante os picos de transações, os usuários frequentemente precisam pagar taxas elevadas. Portanto, é crucial otimizar as taxas de Gas durante a fase de desenvolvimento de contratos inteligentes. 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 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 principais da otimização de taxas de Gas, bem como as melhores práticas para otimização de taxas de Gas ao desenvolver contratos inteligentes. Espero 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 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 taxas de Gas do EVM

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

Na estrutura do EVM, o consumo de Gas é principalmente 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 facto de que a execução de cada transação requer recursos de cálculo, será cobrada uma certa taxa para evitar ciclos infinitos e ataques de negação de serviço ( DoS ). O custo necessário para concluir uma transação é denominado "Taxa de Gas".

Desde a ativação do fork hard de Londres 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 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" paga pelos usuários aos validadores.

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

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 criar contratos, realizar chamadas de mensagem, acessar o armazenamento da conta 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 os códigos de operação foram ajustados, podendo diferir do que está no livro amarelo.

Conceito básico de otimização de Gas

O princípio central da otimização de Gas é priorizar operações com alta eficiência de custo na blockchain EVM, evitando operações com altos custos de Gas.

No EVM, as seguintes operações têm um custo relativamente 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 variáveis de estado armazenadas no armazenamento do contrato
  • Chamadas de funções externas
  • Operação em loop

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

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

Com base nos conceitos básicos acima, aqui está uma lista de melhores práticas para otimização de Gas. 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 Storage( é um recurso limitado, cujo consumo de Gas é muito superior ao da Memory). Cada vez que um contrato inteligente lê ou escreve dados no armazenamento, incurre em 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, 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 manter os 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.

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

( 2. Variáveis empacotadas

A quantidade de storage slot) utilizado em contratos inteligentes e a forma como os desenvolvedores expressam os dados influenciarão significativamente o consumo de Gas.

O compilador Solidity empacota variáveis de armazenamento contíguas durante o processo de compilação e usa um slot 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, permitindo que várias variáveis se encaixem 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 requer 20.000 Gas, mas agora apenas são necessários dois slots de armazenamento.

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

![Melhores 10 práticas de otimização de Gas para 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 divididos em tamanhos diferentes: 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, usar uint256 é mais caro 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 puder empacotar quatro variáveis uint8 em um único slot de armazenamento, então o custo total de iterá-las será menor do que o de quatro variáveis uint256. Assim, o contrato inteligente pode ler e gravar um slot de armazenamento uma única vez e colocar quatro variáveis uint8 na memória/armazenamento em uma única operação.

Ethereum contratos inteligentes de Gas otimização 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, é aconselhável usar o tipo de dados bytes32 em vez de bytes ou strings. De maneira 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, tente escolher o comprimento mínimo de bytes1 a 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 de custo mais baixo na maioria dos casos, mas arrays possuem iterabilidade e suportam empacotamento de tipos de dados. Portanto, é aconselhável priorizar o uso de mapeamentos ao gerenciar listas de dados, a menos que seja necessário iterar ou que seja possível otimizar o consumo de Gas através do empacotamento de tipos de dados.

![Otimas práticas de Gas para 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 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 são apenas de 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. 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, sendo recomendável 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-9c566626ab499ef65d6f5089a2876ad3.webp(

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

Quando os desenvolvedores podem garantir que as operações aritméticas não levarão a estouros ou subfluxos, 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, a partir da versão 0.8.0, os compiladores não precisam mais usar a biblioteca SafeMath, pois o próprio compilador já possui funcionalidades de proteção contra overflow e underflow.

( 9. otimizador de modificações

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

Ao reconstruir a lógica em funções internas, permitindo a reutilização dessa função interna em modificadores, pode-se reduzir o tamanho do bytecode e diminuir os custos de Gas.

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

10. otimização de curto circuito

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

Ethereum contratos inteligentes de otimização de Gas: Dez Melhores Práticas

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 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:

  • Utilizar os algoritmos mais eficientes para realizar cálculos. Se o resultado de certos cálculos for utilizado diretamente no contrato, então esses processos de cálculo redundantes devem ser eliminados. Essencialmente, quaisquer cálculos não utilizados devem ser removidos.

  • 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 hash. Como o código não é executado na EVM, mas localmente nos nós clientes, 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.

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

) 3. Usar código de montagem em linha

Assembly inline ### in-line assembly ### permite aos desenvolvedores escrever 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 inline 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 inline pode executar algumas operações complexas que são difíceis de implementar apenas com Solidity, oferecendo mais flexibilidade para otimizar o consumo de Gas.

No entanto, o uso de assembly em linha 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

Usar soluções de Layer 2 pode reduzir a quantidade de dados que precisam ser armazenados e processados na rede principal Ethereum.

ETH-0.82%
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
  • 4
  • Compartilhar
Comentário
0/400
MEV_Whisperervip
· 08-02 05:53
gás又subir了,炒合约麻烦死
Ver originalResponder0
fomo_fightervip
· 08-02 05:46
gás muito alto, onde estiver fresco, onde ficar
Ver originalResponder0
ApeWithAPlanvip
· 08-02 05:39
gás ainda que caro é o mais saboroso do ETH
Ver originalResponder0
MetadataExplorervip
· 08-02 05:26
Então esse gás está barulhento de novo?
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)