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;
}
}
Saída:
Para testar este contrato usando o Remix, você pode fazer o seguinte:
- Abra o Remix no seu navegador (https://remix.ethereum.org).
- Clique na aba "Compile" para compilar o contrato.
- Clique na aba "Run" para abrir o ambiente de tempo de execução do Remix.
- Na seção "Deployed Contracts", clique no botão "Create" para implantar uma nova instância do contrato.
- 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);
}
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;
}
}
Saída:
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):
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.
Latest comments (0)