WEB3DEV

Cover image for Um guia completo sobre o gas e o preço do gas na Solidity
Fatima Lima
Fatima Lima

Posted on

Um guia completo sobre o gas e o preço do gas na Solidity

#solidity #blockchain #gas

O custo de execução de uma função ou transação na rede Ethereum é chamado "gas" no contexto da Solidity. A quantidade de Ether que um usuário está preparado para gastar em cada unidade de gas é conhecido como o "preço do gas".

O custo do gas tem influência significativa sobre a rapidez com que a rede concluirá uma transação. Como os mineradores estão mais inclinados a dar prioridade às transações de maior recompensa, as transações com preços de gas mais altos serão frequentemente processadas mais rapidamente do que aquelas com preços de gas mais baixos. É importante considerar que o custo do gas não é constante e está sujeito a mudanças, dependendo da oferta e da demanda. O custo do gas pode ser maior em períodos de alta demanda e menor em períodos de baixa demanda. Ao submeter uma transação, os usuários podem indicar o preço do gas que estão dispostos a pagar.

O gas na Solidity é uma defesa contra ataques que fariam com que a rede Ethereum ficasse sem recursos. Como a Ethereum executa contratos inteligentes em uma plataforma descentralizada, é viável para pessoas mal-intencionadas tentar esgotar todos os recursos para interferir na rede. Para evitar que isto aconteça, a rede Ethereum usa um sistema chamado "gas" para limitar a quantidade de trabalho que pode ser feito em uma única transação ou execução de função.

Cada operação na Solidity possui um custo de gas associado a ela e o custo total de gas para uma determinada transação ou execução de função é a soma dos custos de gas de todas as operações que ela inclui. A quantidade máxima de gas que o usuário está disposto a gastar com a operação é especificada quando ele submete uma transação ou chama uma função. A operação será cancelada e quaisquer mudanças realizadas serão desfeitas se o gas se esgotar antes de sua conclusão. Isto mantém as ameaças de exaustão de recursos à distância e garante a estabilidade e a segurança da rede Ethereum.

Por Que o Gas reduz a quantidade de Computação?

A quantidade de processamento que uma transação necessita não está diretamente relacionada ao preço do gas na Solidity. Em vez disso, o preço do gas reflete o valor que o remetente da transação está disposto a negociar para cada unidade de gas. A quantidade máxima de gas que você está preparado para pagar pelo cálculo deve ser especificada ao enviar uma transação na rede Ethereum, assim como o preço do gas, que é a quantidade de Ether (a moeda nativa da rede) que você está disposto a pagar por cada unidade de gas.

Sua chance de ter sua transação aparecendo no bloco seguinte minerado na blockchain Ethereum aumenta com a quantidade de gas que você está pronto para pagar. Isto porque os mineradores que estão encarregados de validar e adicionar transações à blockchain têm maior probabilidade de dar prioridade às transações com preços mais altos de gas, pois eles gerarão um lucro maior ao processá-las.

A quantidade de computação necessária para uma transação, entretanto, não diminui diretamente com o aumento do preço do gas. Em vez de tornar sua transação mais atraente para os mineradores, apenas aumenta a probabilidade de que ela seja executada prontamente. As ações que são realizadas por você podem ser simplificadas, ou você pode usar métodos mais eficazes para diminuir a quantidade de processamento necessária para uma transação.

O que acontece se acabar o gas numa transação?

Na rede Ethereum, se acabar o gas enquanto uma transação estiver sendo processada, ela será abortada e todas as modificações feitas na blockchain serão desfeitas. O gas utilizado para enviar a transação não será reembolsado ao remetente.

A rede Ethereum dispõe de um sistema instalado para garantir que as transações não consumam energia de computação por tempo indefinido. A rede Ethereum pode garantir que todas as transações possam ser processadas rápida e efetivamente sem que nenhuma transação monopolize os recursos disponíveis, limitando a quantidade de gas que cada transação é permitida a utilizar.

Para garantir que você estabeleça um limite de gas adequado para suas transações enquanto cria um contrato inteligente Solidity, é fundamental examinar cuidadosamente a quantidade de gas que seu contrato consumirá. Suas transações podem ficar sem gas e falhar se você não autorizar gas suficiente, o que pode ser problemático para seu contrato ou para os usuários do seu contrato.

O que é uma Unidade de Preço de Gas?

A quantidade de Ether (a moeda nativa da rede Ethereum) que o remetente de uma transação está disposto a pagar por cada unidade de gas é conhecida como o preço do gas na blockchain Ethereum. A quantidade máxima de gas que você estiver pronto para gastar para o cálculo deve ser especificada ao enviar uma transação na rede Ethereum, assim como o preço do gas, ou a quantidade de ether que você está disposto a pagar por cada unidade de gas.

A menor unidade de Ether, conhecida como "wei", é usada para descrever o custo do gas. Um Ether tem 1.000.000.000.000.000.000.000 wei. Wei é a unidade mais comum usada para especificar o preço do gas, porém, também é possível usar wei ou ether.

Como obter o Preço do Gas na Solidity usando o Remix

A palavra-chave "gasPrice" na Solidity pode ser usada para recuperar o preço mais recente do gas para uma transação. O número de wei que o remetente da transação está disposto a pagar por cada unidade de gas é retornado pela palavra-chave "gasprice" como um valor uint.

Aqui está um exemplo de como você pode usar a palavra-chave “gasprice" na Solidity:

pragma solidity ^0.5.3;

contract GasPrice{

    function getGasRefund() public returns (uint) {

        return tx.gasprice;

    }

}
Enter fullscreen mode Exit fullscreen mode

Saída:

Image description

Para testar este contrato usando o Remix, você pode fazer o seguinte:

  1. Abra o Remix no seu navegador (https://remix.ethereum.org).
  2. Clique na aba "Compile" para compilar o contrato.
  3. Clique na aba "Run" para abrir o ambiente de tempo de execução do Remix.
  4. Na seção "Deployed Contracts", clique no botão "Create" para implantar uma nova instância do contrato.
  5. Na seção "Instance", clique no botão "gasprice" para chamar a função "gasprice".

A função "gasprice" retornará o preço atual do gas para a transação como um valor uint (por favor, certifique-se de clicar no botão getGasRefund). Você pode então usar este valor para determinar a quantidade de Ether que a pessoa que envia a transação está disposta a pagar por cada unidade de gas.

Observe que o preço do gas retornado pela palavra-chave "gasprice" pode variar de acordo com o estado atual da rede Ethereum. O preço do gas é determinado pela demanda do mercado por recursos computacionais na rede e pode flutuar ao longo do tempo.

Como reduzir o preço do gas em uma transação

Nesta parte, falaremos sobre como reduzir os preços de gas em uma transação. Existem algumas técnicas para isso.

  • Otimizar os procedimentos que estão sendo utilizados: Uma transação exigirá mais gas para executar as operações quanto mais complicadas elas forem. Reduza a quantidade de gas necessária para a transação, simplificando os procedimentos que estão sendo realizados, o que diminuirá o custo do gas.
  • Usar com frequência algoritmos eficazes: Alguns algoritmos são mais eficazes do que outros para algumas tarefas. Você pode reduzir a quantidade de gas necessária para uma transação e, como resultado diminuir o custo do gas, usando algoritmos mais eficientes.
  • Usar um preço de gas mais baixo: Quando você envia uma transação, você pode especificar o preço do gas que está disposto a pagar pelo cálculo. Ao especificar um preço de gas mais baixo, você pode reduzir o custo da transação. Entretanto, esteja ciente de que se o preço do gas for muito baixo, sua transação pode não ser processada prontamente, pois os mineradores são mais propensos a priorizar transações com preços de gas mais altos.
  • Usar uma blockchain mais barata: Devido às variações em suas arquiteturas e à demanda por recursos computacionais, algumas redes de blockchain têm preços de gas mais baixos do que outras. Se possível, você pode reduzir o custo de suas transações utilizando uma blockchain menos dispendiosa.

O que é Limite de Gas?

A quantidade máxima de gas que uma transação pode usar na blockchain Ethereum é conhecida como o limite de gas. Na rede Ethereum, você deve mencionar o preço do gas ou a quantidade de Ether que você está disposto a pagar por cada unidade de gas, assim como a quantidade máxima de gas que você está disposto a pagar para o cálculo ao enviar uma transação.

O limite de gas é uma precaução de segurança fundamental que ajuda a prevenir que as transações utilizem uma porção excessiva da capacidade computacional da rede Ethereum. Uma transação será cancelada e todas as modificações feitas na blockchain serão desfeitas, se ela usar mais gas do que o disponível.

Na Solidity, você pode especificar o limite de gas para uma transação usando a palavra-chave "gas". Por exemplo:

   function myFunction() public {

   // Define o limite do gas como 100,000

   uint gasLimit = 100000;

   // Envia a transação com o limite de gas de 100,000

   address(this).transfer(msg.value);

}
Enter fullscreen mode Exit fullscreen mode

O limite de gas deve ser cuidadosamente avaliado durante a criação de suas transações ou contratos. E você deve sempre considerar que "quanto mais alto o limite de gas definido, mais Ether você gasta".

Você também deve observar que definir o limite de gas muito alto pode levar a custos adicionais, enquanto que definir um limite muito baixo pode levar a transações rejeitadas. Você deve tentar fixar o limite de gas com a maior precisão possível com base na dificuldade das atividades que estão sendo realizadas e no consumo de gas esperado da transação.

O que é Limite de Gas de Bloco

A quantidade máxima de gas que todas as transações em um bloco na blockchain Ethereum têm permissão de usar é conhecida como limite de gas do bloco. O limite de gas do bloco da blockchain Ethereum é uma precaução de segurança que funciona para impedir que os blocos utilizem muitos recursos computacionais. Algumas transações serão rejeitadas e excluídas do bloco se o consumo total de gas de todas as transações no bloco for maior do que o limite de gas do bloco.

A rede Ethereum estabelece o limite de gas de bloco e ele é modificado ao longo do tempo para garantir que a rede possa continuar processando transações efetivamente sem esgotar a capacidade computacional. A demanda atual por recursos computacionais na rede pode ter um impacto sobre o limite de gas do bloco, que não é um número constante.

Ao criar suas transações ou contratos, é fundamental considerar o limite de gas do bloco porque, se ele for fixado em um valor muito alto, pode resultar em despesas extras. Com base na dificuldade das atividades que estão sendo realizadas e no consumo previsto de gas da transação, você deve tentar fixar o limite de gas com a maior precisão possível.

Como Calcular o Gas na Solidity

Na Solidity, você pode usar a função "gasleft()" para obter a quantidade restante de gas para a transação atual. A função "gasleft()" retorna um valor uint256, o número de unidades de gas remanescentes para a transação. Você pode usar este valor para rastrear o consumo de gas de seu contrato e para garantir que você não exceda o limite de gas para a transação.

Aqui está um exemplo de como você pode usar a função "gasleft()" na Solidity:

pragma solidity ^0.7.0;

contract GasTracker {

    function trackGas() public {

        // Obter o gas restante para a transação

        uint256 gasRemaining = gasleft();

        // Realize operações que consumam gas

        // ...

        // Confira o gas restante de novo

        uint256 gasRemaining2 = gasleft();

        // Calcule o gas consumido pelas operações

        uint256 gasConsumed = gasRemaining - gasRemaining2;

    }

}
Enter fullscreen mode Exit fullscreen mode

Saída:

Image description

Neste exemplo, a função "trackGas()" recebe o gas restante para a transação, realiza algumas operações que consomem gas e então recebe o gas restante novamente. A diferença entre o gas inicial restante e o gas final restante é a quantidade de gas que foi consumida pelas operações.

Você pode usar esta técnica para rastrear o consumo de gas de seu contrato e para garantir que você não exceda o limite de gas para a transação. Você também pode usar esta informação para otimizar seu código de contrato identificando áreas onde você possa reduzir o gas necessário para executar o contrato.

Processo básico de otimização de gas baseado na Solidity

Aqui estão alguns passos gerais que você pode seguir para otimizar o consumo de gas de seus contratos baseados na Solidity:

  • As estruturas e métodos de dados utilizados em seu contrato: Para completar tarefas específicas, alguns algoritmos e estruturas de dados são mais eficazes do que outros. Você pode reduzir o gas necessário para executar seu contrato, selecionando algoritmos e estruturas de dados mais eficientes.
  • Evite o uso de loops: Por favor, esta é uma das partes a qual você deve estar mais atento. Os loops podem consumir muito gas, especialmente se forem usados para realizar operações complexas. Se possível, você deve tentar evitar o uso de loops em seu contrato.
  • Use a palavra-chave "inline": Ao chamar uma função de outro contrato, você pode usar a palavra-chave "inline" para especificar que a função chamada deve ser alinhada com a função que fez a chamada, em vez de ser executada como uma chamada separada. Isto pode ajudar a reduzir o consumo de gas de seu contrato, uma vez que elimina a necessidade de uma chamada adicional.
  • Usar funções "view" ou "pure": As funções marcadas como "view" ou "pure" não modificam o estado do contrato e, portanto, não consomem nenhum gas. Se você tem funções que não precisam modificar o estado do contrato, você deve marcá-las como "view" ou "pure" para reduzir o consumo de gas do seu contrato. Por favor, clique aqui para aprender mais sobre funções na Solidity.

Estatísticas e princípios básicos de gas

Toda operação e computação na máquina virtual Ethereum (EVM) tem um custo de gas vinculado a ela. O uso de recursos de computação (como CPU e uso de memória) está diretamente relacionado com a quantidade de gas que a computação utiliza. O custo total de um contrato ou de uma transação é determinado pela adição dos custos de gas de todas as operações realizadas.

O objetivo do sistema de gas é limitar o número de recursos que uma transação pode utilizar e impedir que as transações sejam executadas indefinidamente. Isto assegura que a rede Ethereum possa processar transações de forma previsível e eficiente.

Este é um princípio fundamental a ser lembrado ao lidar com o Limite de Preço do Gas em Contratos Inteligentes:

Quanto mais alto o limite de gas, mais altos os recursos de computação utilizados (mais rápida a transação):

Image description

Você pode ver pela figura acima que o alto Limite de Gas estabelecido no contrato inteligente aumentará a velocidade da transação.

É fundamental considerar cuidadosamente os custos de gas do seu contrato e suas operações. Se o custo do gas de uma função for muito alto, pode ser difícil ou mesmo impossível para os usuários executarem a função. Por outro lado, se o custo do gas for muito baixo, a função pode ficar vulnerável à exploração de invasores.

Conclusão

Espero que tenha achado a leitura deste post agradável. Este artigo incluiu tópicos como gas, preços do gas na Solidity e o papel do gas nas transações. Também discutimos alguns aspectos sobre o cálculo dos preços do gas e é meu objetivo sincero que este post tenha ajudado a compreender o significado do gas e dos preços do gas ao criar contratos inteligentes. Depois de ler este artigo, vou encorajá-lo a estudar mais sobre o uso do gas e escrever algum código prático para resolver os problemas de gas consultando a documentação oficial.

Esse artigo foi escrito por Gabriel Delight e traduzido por Fátima Lima. O original pode ser lido aqui.

Oldest comments (0)