As 10 melhores práticas de otimização de gás para contratos inteligentes do Ethereum

A taxa de gas do Ethereum na rede principal tem sido um grande desafio, especialmente durante períodos de congestionamento da rede. Durante os horários de pico, os usuários muitas vezes precisam pagar altas taxas de lavagem de dinheiro. Portanto, é especialmente importante otimizar as taxas de gas durante o desenvolvimento de contratos inteligentes. A otimização do consumo de gas não só reduz os custos de transação, mas também melhora a eficiência das transações, proporcionando aos usuários uma experiência mais econômica e eficiente no uso da blockchain.

Este artigo irá resumir o mecanismo de taxas de gás do Ethereum Virtual Machine (EVM), os conceitos centrais relacionados à otimização de taxas de gás e as melhores práticas para otimizar as taxas de gás ao desenvolver contratos inteligentes. Esperamos que, através destes conteúdos, possamos fornecer inspiração e ajuda prática aos desenvolvedores, ao mesmo tempo que ajudamos os usuários comuns a entender melhor o funcionamento das taxas de gás do EVM, enfrentando juntos os desafios do ecossistema blockchain. [1]

Breve introdução ao mecanismo de taxas de gás da EVM

[2] Em redes compatíveis com EVM, 'gás' refere-se à unidade de capacidade de cálculo necessária para executar operações específicas. [3] A figura abaixo mostra a estrutura da EVM. Na figura, o consumo de gás é dividido em três partes: execução de operações, chamadas de mensagens externas e leitura/gravação de memória e armazenamento.

ETH坊Contrato inteligente的Gas优化十大最佳实践

Fonte: Site oficial da Ethereum###

Devido ao facto de cada execução de transação requerer recursos de cálculo, é cobrada uma taxa para evitar ciclos infinitos e ataques de negação de serviço (DoS). A taxa necessária para concluir uma transação é chamada de "taxa de gás".

Desde a entrada em vigor do EIP-1559 (hard fork de Londres), as taxas de gás 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 de prioridade será usada como incentivo para encorajar os validadores a adicionar transações ao blockchain. Ao enviar uma transação com uma taxa de prioridade mais alta, é possível aumentar a probabilidade de a transação ser incluída no próximo bloco. Isso é semelhante a uma espécie de 'gorjeta' que os usuários pagam aos validadores.

1. Compreender a otimização de gás na EVM

Quando um contrato inteligente é compilado com Solidity, o contrato é convertido numa série de 'códigos de operação', ou seja, opcodes.

Qualquer operação de código (como criar contratos, fazer chamadas de mensagem, acessar armazenamento de contas e executar operações na máquina virtual) tem um custo de gás reconhecido, e esses custos são registrados no Livro Amarelo do Ethereum ###.

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

Após várias alterações do EIP, os custos de gás de algumas opcode foram ajustados e podem diferir do Livro Amarelo. Para obter informações detalhadas sobre os custos mais recentes do opcode, consulte aqui ###. [4]

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

O conceito central da otimização de gás é selecionar operações de alta eficiência de custo na blockchain EVM e evitar operações de gás custosas.

Na EVM, as seguintes operações têm um custo mais baixo:

  • Ler e escrever variáveis de memória
  • Leitura de 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 [1] Operações com custos elevados incluem: [2]
  • Ler e escrever as variáveis de estado armazenadas no contrato de armazenamento
  • Chamada de função externa
  • Operação de loop [3] [4] Melhores práticas de otimização de custo de gás EVM

Com base nos conceitos básicos acima, compilamos um guia de práticas recomendadas para otimizar os custos de gás para a comunidade de desenvolvedores. Seguindo essas práticas, os desenvolvedores podem reduzir o consumo de gás de contratos inteligentes, reduzir os custos de transação e criar aplicativos mais eficientes e amigáveis aos usuários.

1. Tente reduzir ao máximo o uso de armazenamento

No Solidity, o Storage é um recurso limitado que consome muito mais Gas do que a Memory. Cada vez que um contrato inteligente lê ou escreve dados no Storage, há um alto custo de Gas envolvido.

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 gás, enquanto as operações de armazenamento como sload e sstore, mesmo nas condições ideais, custam pelo menos 100 unidades.

Melhores práticas de otimização de gás para contratos inteligentes na rede ETH

Métodos de restrição de uso de armazenamento incluem:

  • Armazenar dados não permanentes na memória
  • Reduzir o número de vezes que as modificações de armazenamento são feitas: armazenando os resultados intermediários na memória e atribuindo os resultados às variáveis de armazenamento somente após a conclusão de todos os cálculos.

2. Empacotamento de Variáveis

O número de slots de armazenamento usados em contratos inteligentes e a maneira como os desenvolvedores representam os dados terão um grande impacto no consumo de taxas de gás.

O compilador de Solidity irá empacotar variáveis de armazenamento contíguas durante o processo de compilação e usará um slot de armazenamento de 32 bytes como unidade básica de armazenamento de variáveis. O empacotamento de variáveis refere-se a organizar as variáveis de modo que várias variáveis possam se encaixar em um único slot de armazenamento.

Do lado esquerdo está uma implementação de eficiência mais baixa, que consome 3 slots de armazenamento; do lado direito está uma implementação mais eficiente.

Melhores práticas de otimização de gas para contratos inteligentes do ETH

Através deste ajuste de detalhes, os desenvolvedores podem poupar 20,000 unidades de gás (armazenar uma ranhura de armazenamento não utilizada requer 20,000 gás), mas agora só precisam de duas ranhuras de armazenamento.

Devido a cada slot de armazenamento consumir gás, o empacotamento de variáveis otimiza o uso de gás reduzindo a quantidade de slots de armazenamento necessários.

3. Otimizar tipos de dados

Uma variável pode ser representada por vários tipos de dados, mas os custos das operações correspondentes para diferentes tipos de dados também são diferentes. Escolher o tipo de dados adequado ajuda a otimizar o uso de gás.

Por exemplo, em Solidity, os inteiros podem ser subdivididos em diferentes tamanhos: uint8, uint16, uint32, etc. Como a EVM opera em unidades de 256 bits, o uso de uint8 significa que a EVM deve primeiro convertê-lo em uint256, o que acarreta em despesas adicionais de gás.

Melhores práticas de otimização de gás para contratos inteligentes ETH

Podemos comparar o custo em gás de uint8 e uint256 com base no código na imagem. A função UseUint() consome 120.382 unidades de gás, enquanto a função UseUInt8() consome 166.111 unidades de gás.

Olhando isoladamente, usar uint256 é mais barato que uint8. No entanto, se a variável de otimização de embalagem que sugerimos anteriormente for usada, será diferente. Se o desenvolvedor puder empacotar quatro variáveis uint8 em um único slot de armazenamento, o custo total de iterá-las será menor do que quatro variáveis uint256. Assim, o contrato inteligente pode ler/gravar um slot de armazenamento uma vez e colocar quatro variáveis uint8 na memória/armazenamento em uma única operação.

4. Utilizar 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 dados bytes32 em vez de bytes ou strings. Em geral, as variáveis de tamanho fixo consomem menos gás do que as variáveis de tamanho variável. Se o comprimento em bytes puder ser limitado, tente escolher o comprimento mínimo de bytes1 a bytes32.

! [Top 10 Melhores Práticas para Otimização de Gases da Contrato inteligente] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/f5d5201df99b4efc4f05505890f72811.jpg)

ETH坊Contrato inteligente的Gas优化十大最佳实践

5. Mapeamento e Matrizes

As listas de dados Solidity podem ser representadas por dois tipos de dados: matrizes (Arrays) e mapeamentos (Mappings), mas sua sintaxe e estrutura são completamente diferentes.

Mapear é mais eficiente e mais barato na maioria dos casos, mas os arrays são iteráveis ​​e suportam empacotamento de tipos de dados. Portanto, é recomendado usar mapeamento primeiro ao gerenciar listas de dados, a menos que seja necessário iterar ou otimizar o consumo de Gás através do empacotamento de tipos de dados.

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, use calldata em vez de memory. Isso evita operações de cópia desnecessárias de calldata para memory.

Exemplo 1: Usando a memória

Os 10 melhores práticas de otimização de gás para contratos inteligentes da ETH

Ao usar a palavra-chave de memória, os valores do array serão copiados do calldata codificado para a memória durante o processo de decodificação da ABI. O custo de execução deste bloco de código é de 3,694 unidades de gás.

Exemplo 2: usando calldata

ETH坊Contrato inteligente的Gas优化十大最佳实践

Quando se lê diretamente o valor do calldata, evita-se a operação intermediária de memória. Esta otimização reduz os custos de execução para apenas 2.413 unidades de gás, aumentando a eficiência do gás em 35%.

7. Use 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 durante a compilação e armazenadas no bytecode do contrato. Portanto, em comparação com o armazenamento, seu custo de acesso é muito menor e é recomendável usar as palavras-chave Constant ou Immutable sempre que possível.

8. Use o Unchecked ao garantir que não ocorra overflow / underflow

Quando os desenvolvedores podem garantir que as operações aritméticas não resultarão em estouro ou subfluxo, eles 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 transação de gás.

Na figura abaixo, sujeito a restrições de condição i

As 10 melhores práticas de optimização de gás para contratos inteligentes ETH

Além disso, a partir da versão 0.8.0, o compilador não precisa mais usar a biblioteca SafeMath, pois o próprio compilador incorporou as funções de proteção contra overflow e underflow.

9. Otimizador de modificação

O código do modificador é incorporado à função modificada e, cada vez que o modificador é usado, o seu código é copiado. Isso aumentará o tamanho do bytecode e aumentará o consumo de gás. Aqui está uma maneira de otimizar o custo de gás do modificador:

Antes da otimização:

Os 10 melhores práticas de otimização de gás do contrato inteligente ETH

Após otimização:

As 10 melhores práticas de otimização de gás para contratos inteligentes da Rede principal ETH

Neste exemplo, ao refatorar a lógica como uma função interna _checkOwner(), permite-se reutilizar essa função interna em modificadores, reduzindo o tamanho do bytecode e o custo de Gota Gas.

10. Otimização de curto-circuito

Para os operadores || e &&, a avaliação lógica ocorrerá 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 gás, as condições de baixo custo de cálculo devem ser colocadas primeiro, para evitar cálculos de alto custo, se possível.

Sugestões gerais adicionais

1. Remover código indesejado

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 seu tamanho pequeno.

Aqui estão algumas sugestões úteis:

Utilize o algoritmo mais eficiente para cálculos. Se o resultado de algum cálculo é usado diretamente no contrato, os processos de cálculo redundantes devem ser eliminados. Em essência, todos os cálculos não utilizados devem ser removidos.

Na Ethereum, os desenvolvedores podem receber recompensas em gás liberando espaço de armazenamento. Quando uma variável não é mais necessária, deve ser eliminada usando a palavra-chave delete ou definindo-a como o valor padrão.

Otimização de loop: 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. Use de contratos pré-compilados

Os contratos pré-compilados fornecem funções de biblioteca complexas, como operações de criptografia e hash. Uma vez que o código não é executado na EVM, mas sim localmente nos nós do cliente, menos gás é necessário. O uso de contratos pré-compilados pode economizar gás reduzindo a quantidade de trabalho computacional necessário para executar o contrato inteligente.

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 gás e melhorar a eficiência operacional do aplicativo.

Para a lista completa de contratos pré-compilados suportados pela rede Ethereum, consulte aqui .

3. Utilizando código de montagem embutido

A montagem em linha 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 as caras operações de Solidity. A montagem em linha também permite um controle mais preciso do uso de memória e armazenamento, o que ajuda a reduzir ainda mais as taxas de gás. Além disso, a montagem em linha pode realizar algumas operações complexas que são difíceis de implementar apenas com Solidity, proporcionando mais flexibilidade na otimização do consumo de gás.

Aqui está um exemplo de código que utiliza a montagem incorporada para economizar gás:

ETH坊contrato inteligente的gas优化十大最佳实践

Como você pode ver no gráfico acima, o segundo caso de uso usando a técnica de montagem em linha tem uma maior eficiência de gás em comparação com o caso de uso padrão.

No entanto, o uso de montagem em linha também pode ser arriscado e propenso a erros. Portanto, deve ser usado com cuidado e apenas por desenvolvedores experientes.

4. Usar soluções de Camada 2

Usar soluções de Camada 2 pode reduzir a quantidade de dados que precisam ser armazenados e calculados na Ethereum Rede principal.

Soluções de Camada 2, como rollups, sidechains e canais de estado, podem descarregar o processamento de transações da rede principal do Ethereum, permitindo transações mais rápidas e mais baratas.

Através da agregação de um grande número de transações, estas soluções reduzem a quantidade de transações na cadeia, diminuindo assim os custos de gás. O uso de soluções de Camada 2 também pode aumentar a escalabilidade do Ethereum, permitindo que mais utilizadores e aplicações participem na rede sem causar congestionamento.

5. Usar ferramentas e bibliotecas de otimização

Existem várias ferramentas de otimização disponíveis, como o otimizador solc, o otimizador de construção do Truffle e o compilador Solidity do Remix.

ETH坊Contrato inteligente的Gas优化十大最佳实践

Estas ferramentas podem ajudar a minimizar o tamanho do bytecódigo, eliminar código inútil e reduzir o número de operações necessárias para executar o contrato inteligente. Combinadas com outras bibliotecas de otimização de gás, como 'solmate', os desenvolvedores podem reduzir eficazmente o custo de transação e aumentar a eficiência do contrato inteligente.

Conclusão

Otimizar o consumo de gás é um passo importante para os desenvolvedores, pois pode minimizar o custo de transação e melhorar a eficiência dos contratos inteligentes na rede compatível com EVM. Ao executar operações de baixo custo prioritariamente, reduzir o uso de armazenamento, usar montagem inline e seguir outras melhores práticas discutidas neste artigo, os desenvolvedores podem reduzir efetivamente o consumo de gás do contrato.

No entanto, deve-se notar que, durante o processo de otimização, os desenvolvedores devem operar com cuidado para evitar a introdução de vulnerabilidades de segurança. Durante a otimização do código e a redução do consumo de gás, nunca se deve sacrificar a segurança inerente dos contratos inteligentes.

:

:

:

:precompiled

ETH2,57%
GAS2,85%
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
  • 1
  • Repostar
  • Compartilhar
Comentário
Adicionar um comentário
Adicionar um comentário
Sem comentários
  • Fixado