WEB3DEV

Cover image for Estimando o Preço do Gás Usando Transações Pendentes em Python
Paulo Gio
Paulo Gio

Posted on

Estimando o Preço do Gás Usando Transações Pendentes em Python

Este guia lhe dará uma visão detalhada de como estimar o preço do gás usando transações pendentes em Python, mas se você preferir deixar o trabalho pesado para nós, recomendamos a API de Estimativa de Gás. Ao usar a API de Estimativa de Gás, você pode melhorar seu fluxo de trabalho. Embora você possa usar um script personalizado para obter manualmente o preço de gás da mempool, considere estimar as taxas de transação com a API de Estimativa de Gás.

Teste a API de Estimativa de Gás

Visão geral

Para enviar uma transação na rede Ethereum, você precisa pagar taxas para incluir a transação em um bloco, bem como a computação necessária na transação; esta taxa é chamada de gás. As transações são aceitas no bloco com base na quantidade de gás enviada com elas, então ter a capacidade de ver os preços atuais do gás é uma vantagem. Este guia abrangerá a estimativa de preços do gás usando transações pendentes em Python usando a biblioteca Web3Py.

Pré-requisitos

  • Python instalado em seu sistema (versão 3.6+) e Pip3.
  • Um editor de texto.

O que é o gás na Ethereum?

O gás é a unidade de medida da quantidade de esforço computacional necessário para realizar uma determinada operação. A maioria dos contratos inteligentes que rodam em EVMs (Máquinas Virtuais Ethereum) são escritos em Solidity. Cada linha de código ou cada função Solidity precisa de gás para ser executada.

A imagem a seguir é tirada do Yellow Paper da Ethereum. Ela dá uma ideia aproximada de quanto gás uma instrução específica pode custar.

https://lh3.googleusercontent.com/ncp7UAdC9kbYAE-9drNWWgt5nbCZdv2Y1a1AiLOJRrjlG-Yw9hlgfUVsBTK8RE5iYZUCX2rROpU_fVw3QriVkoX0JLoYPP9NG4ySUly_ybrJauM7YMR0L0ZM1JHSKIAoULo1lm5B

Cortesia da imagem - Yellow Paper da Ethereum

Portanto, as taxas de gás são pagamentos feitos pelos usuários para compensar a energia de computação da rede Ethereum utilizada durante as suas transações. Para fazer uma analogia, dirigir um carro por uma certa distância A requer uma certa quantidade de gás/combustível B. Da mesma forma, enviar uma certa quantidade de ETH ou enviar um contrato inteligente A requer uma certa quantia de taxa (gás) B.

Exigir uma taxa de gás também evita práticas abusivas na rede Ethereum, como spam na rede. Também incentiva os desenvolvedores a tornar o código mais eficiente para evitar operações computacionais caras e loops infinitos.

O gás é medido em Gwei (abreviação de GigaWei), que é uma subunidade da moeda Ether (ETH) usada na rede Ethereum (1.000.000.000 Gwei = 1 ETH). Ter uma unidade separada ajuda a diferenciar o valor de avaliação da moeda ETH e o custo computacional de usar a EVM.

Por que estimar o gás?

Por que queremos estimar o gás? Bem, atualmente, os mineradores escolhem quais transações minerar em blocos. Como os mineradores escolhem quais transações colocar em um bloco? Eles tendem a escolher as transações que incluem mais gás. Por que eles escolhem as transações com mais gás? Porque os mineradores ficam com as taxas de gás incluídas em uma transação. Transações com gás abaixo da média atual costumam demorar muito para serem verificadas ou até mesmo serem descartadas pelos mineradores no pior dos casos.

Então, se pagarmos muito gás, nossa transação é incluída. Se não pagarmos gás suficiente, nossa transação pode ser descartada. Mas quanto gás pagar para incentivar os mineradores? É aí que entra a estimativa de gás.

Para entender melhor a estimativa e os preços de gás, vamos colocar algumas definições formais atrás deles:

  • Gás: A unidade para medir o custo computacional de uma ação particular executada na EVM. Por exemplo - eu posso incluir 25.000 gás para completar alguma transação.
  • Limite de Gás: A quantidade máxima de gás que o usuário está disposto a pagar para que a ação seja executada (no mínimo 21.000).
  • Preço de Gás: A quantidade de Gwei que o usuário está disposto a gastar em cada unidade de gás.

Queremos descobrir qual é o preço médio de gás, então incluir um preço de gás ligeiramente mais alto para nossas transações. Não nos importamos muito com o limite de gás ou o gás enviado; desde que eles sejam suficientemente altos, receberemos o reembolso do gás que não foi usado.

Agora, vamos tentar estimar o gás para uma simples transação de transferência de ETH. Vamos obter a estimativa real de gás observando as transações pendentes.

Instalando o Web3.py

Nosso primeiro passo aqui será verificar se o Python 3.6 ou superior está instalado em seu sistema; você pode verificar se o Python está instalado ou não digitando o seguinte no seu terminal/cmd:

$ python --version
Enter fullscreen mode Exit fullscreen mode

Se não estiver instalado, você pode seguir as instruções na página de Downloads do site oficial do Python.

Usaremos o Web3.py, uma biblioteca Python usada para interagir com a Ethereum. Instalaremos o Web3.py usando o PIP. Digite o seguinte no seu terminal/cmd:

$ pip install web3
Enter fullscreen mode Exit fullscreen mode

Observação: as versões do Python e de outras bibliotecas causam problemas comuns de instalação. Portanto, se você enfrentar problemas, tente configurar um ambiente virtual e solucionar a instalação do web3.py.

Se tudo der certo, o Web3.py será instalado em seu sistema. Se você quiser ver algumas outras coisas que o Web3.py pode fazer, confira nossos guias sobre como conectar-se à Ethereum usando o Web3.py e gerar um novo endereço Ethereum usando o Web3.py.

Inicializando nosso nó Ethereum

Para os nossos propósitos de hoje, poderíamos usar praticamente qualquer cliente Ethereum com suporte para o mempool, como o Geth ou o OpenEthereum (antigo Parity). Como isso é um pouco complicado para apenas estimar o gás, vamos pegar um ponto de extremidade gratuito do QuickNode para facilitar. Depois de criar o seu ponto de extremidade Ethereum gratuito, copie o seu ponto de extremidade do provedor HTTP:

https://www.quicknode.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaWNEIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--11a5da64365c498754e3777200fcb5d045efcd8b/hidden-blue-sky.png

Você precisará disso mais tarde, então copie e salve.

Estimando o Gás

A primeira coisa que vamos fazer é uma estimativa simples da quantidade de gás para enviar uma transação. Crie um arquivo python chamado gas.py e copie e cole o seguinte código nele. Este é um exemplo de estimativa de gás para a transação de transferência de ETH.

from web3 import Web3, HTTPProvider
web3 = Web3(HTTPProvider("ADICIONE_O_URL_DO_NÓ_ETHEREUM"))
estimate = web3.eth.estimateGas({'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601', 'from': '0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE', 'value': 145})
print("Estimativa de gás é: ", estimate)
Enter fullscreen mode Exit fullscreen mode

Então vá em frente e substitua ADICIONE_O_URL_DO_NÓ_ETHEREUM pelo provedor http da seção acima.

Explicação do código acima:

Linha 1: Importando web3 e HTTPProvider.

Linha 2: Definindo o URL do nosso nó.

Linha 3: Estimando o gás usando a função estimateGas para uma transação de transferência de ETH.

Linha 4: Imprimindo a estimativa.

Agora, execute o seu script Python usando.

$ python gas.py
Enter fullscreen mode Exit fullscreen mode

Deve ficar assim:

https://lh4.googleusercontent.com/TgBqiavJVMEJOMHGxTxL2IjKpzlLyy33P24uBo5YftGENXULz2qfxZAv4Yjkasb8HEoDzZeJeGiLETj1bXnrPJQEIbAaIWYUStIsu0u645120M2kEf3uHwwrhgebSw-5hJmJoie-

O exemplo de estimativa acima não nos diz realmente qual preço de gás devemos pagar pela transação. Vamos obter uma medida do preço de gás que devemos estar dispostos a pagar olhando as transações pendentes do nosso nó Ethereum.

Crie um arquivo Python chamado gas_pt.py e copie e cole o seguinte código nele:

from web3 import Web3, HTTPProvider
import statistics
web3 = Web3(HTTPProvider("ADICIONE_O_URL_DO_NÓ_ETHEREUM"))
pending_transactions = web3.provider.make_request("parity_pendingTransactions", [])
gas_prices = []
gases = []
for tx in pending_transactions["result"[:10]]:
    gas_prices.append(int((tx["gasPrice"]),16))
    gases.append(int((tx["gas"]),16))

print("Média:")
print("-"*80)
print("gasPrice: ", statistics.mean(gas_prices))
print(" ")
print("Mediana:")
print("-"*80)
print("gasPrice: ", statistics.median(gas_prices))
Enter fullscreen mode Exit fullscreen mode

Então vá em frente e substitua ADICIONE_O_URL_DO_NÓ_ETHEREUM pelo provedor http da seção acima.

Explicação do código acima:

Linha 1: Importando web3 e HTTPProvider.

Linha 2: Importando o pacote Statistics.

Linha 3: Definindo o URL do nosso nó.

Linha 4: Obtendo transações pendentes e armazenando-as em um array e, em seguida, na variável pending_transactions.

Linhas 5-6: Criando os arrays gas_prices e gases.

Linhas 7-9: Obtendo os dez primeiros elementos (transações) do array results da variável pending_transactions e adicionando os valores de gasPrice ao array gas_prices após convertê-los de hexadecimal para decimal, adicionando os valores de gás ao array gases após convertê-los de hexadecimal para decimal.

Linhas 11-12: Imprimindo a string "Médias:" e 80 traços para um output limpo.

Linha 13: Imprimindo o preço médio de gás com a string "gasPrice:", ao obter a média dos valores de gasPrice armazenados no array gas_prices.

Linha 14: Imprimindo um espaço.

Linhas 15-16: Imprimindo a string "Mediana:" e 80 traços para um output limpo.

Linha 17: Imprimindo o preço mediano de gás com a string "gasPrice:", ao obter a mediana dos valores de gasPrice armazenados no array gas_prices.

Agora, execute o script Python.

$ python gas_pt.py
Enter fullscreen mode Exit fullscreen mode

Se o código for executado com sucesso, ele deve se parecer com isso. Pode levar um tempo para o código ser executado integralmente, pois ele primeiro precisa obter as transações pendentes (que podem ser muitas) para em seguida consultá-las.

https://lh4.googleusercontent.com/UJ3NsfXN1hDPlBExtQxA0gLQG2F8s4RF3QlF6mqGPUkyQeZfwcYB0yFiPAlcSdwcjSW2GSA08cG4gO2qCmbf9fZu5WCNxtR6e-t6CDbc0D6h7HxUDh2eQSUOeYfz4Siu7MrHk0zz

Você pode ver a média, a mediana e os preços de gás na imagem acima.

Conclusão

Agora que você sabe como estimar o gás e os preços de gás, certifique-se de estimar os custos de gás antes da função sendTransaction ou estimar o custo para implantar contratos inteligentes. Confira um exemplo de reenvio de uma transação com um valor de gás mais alto usando JavaScript.

Inscreva-se em nossa newsletter para mais artigos e guias sobre Ethereum. Se tiver algum comentário, não hesite em entrar em contato conosco via Twitter. Você sempre pode conversar conosco em nossa comunidade no Discord, que conta com alguns dos desenvolvedores mais legais que você irá conhecer :)

Este artigo foi publicado originalmente no blog do Quicknode. Traduzido por Paulinho Giovannini.

Top comments (0)