Futuros
Aceda a centenas de contratos perpétuos
CFD
Ouro
Plataforma de ativos tradicionais globais
Opções
Hot
Negoceie Opções Vanilla ao estilo europeu
Conta Unificada
Maximize a eficiência do seu capital
Negociação de demonstração
Introdução à negociação de futuros
Prepare-se para a sua negociação de futuros
Eventos de futuros
Participe em eventos para recompensas
Negociação de demonstração
Utilize fundos virtuais para experimentar uma negociação sem riscos
Lançamento
CandyDrop
Recolher doces para ganhar airdrops
Launchpool
Faça staking rapidamente, ganhe potenciais novos tokens
HODLer Airdrop
Detenha GT e obtenha airdrops maciços de graça
IPO Access
Desbloquear acesso completo a IPO de ações globais
Pontos Alpha
Negoceie ativos on-chain para airdrops
Pontos de futuros
Ganhe pontos de futuros e receba recompensas de airdrop
Investimento
Simple Earn
Ganhe juros com tokens inativos
Investimento automático
Invista automaticamente de forma regular.
Investimento Duplo
Aproveite a volatilidade do mercado
Soft Staking
Ganhe recompensas com staking flexível
Empréstimo de criptomoedas
0 Fees
Dê em garantia uma criptomoeda para pedir outra emprestada
Centro de empréstimos
Centro de empréstimos integrado
Centro de Património VIP
Aumento de património premium
Gestão de património privado
Alocação de ativos premium
Fundo Quant
Estratégias quant de topo
Staking
Faça staking de criptomoedas para ganhar em produtos PoS
Alavancagem inteligente
Alavancagem sem liquidação
USD1 Juros por holding
20%
Sem bloqueio, negocie e saque
Promoções
Centro de atividades
Participe de atividades para recompensas
Referência
20 USDT
Convide amigos para recompensas de ref.
Programa de afiliados
Ganhe recomp. de comissão exclusivas
Gate Booster
Aumente a influência e ganhe airdrops
Announcements
Atualizações na plataforma em tempo real
Blog da Gate
Artigos da indústria cripto
Serviços VIP
Enormes descontos nas taxas
Gestão de ativos
Solução integral para a gestão de ativos
Institucional
Soluções de ativos digitais para empresas
Desenvolvedores (API)
Conecta-se ao ecossistema de aplicações Gate
Transferência Bancária OTC
Deposite e levante moeda fiduciária
Programa de corretora
Mecanismo generoso de reembolso de API
AI
Gate AI
O seu parceiro de IA conversacional tudo-em-um
Gate AI Bot
Utilize o Gate AI diretamente na sua aplicação social
GateClaw
Gate Lagosta Azul, pronto a usar
Gate for AI Agent
Infraestrutura de IA, Gate MCP, Skills e CLI
Gate Skills Hub
Mais de 10 mil competências
Do escritório à negociação, uma biblioteca de competências tudo-em-um torna a IA ainda mais útil
GateRouter
Escolha inteligentemente entre mais de 40 modelos de IA, com 0% de taxas adicionais
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.
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 ###.
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:
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.
Métodos de restrição de uso de armazenamento incluem:
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.
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.
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)
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
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
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:
Após otimização:
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:
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.
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