WEB3DEV

Cover image for Como buscar o histórico de transações na Ethereum usando o Web3.py
Adriano P. Araujo
Adriano P. Araujo

Posted on

Como buscar o histórico de transações na Ethereum usando o Web3.py

Como buscar o histórico de transações na Ethereum usando o Web3.py

Visão geral

Se você estiver desenvolvendo na Ethereum, poderá encontrar cenários em que precisará buscar o histórico da transação para um determinado endereço. Infelizmente, o design atual da Ethereum carece de uma maneira fácil de recuperar esses dados. Por esse motivo, estamos dedicando este guia para explicar as diferentes maneiras pelas quais você pode recuperar o histórico de transações na Ethereum. Vamos demonstrar uma dessas maneiras com  Python. Dê uma olhada nos pré-requisitos para saber o que você precisará: 

O que você precisará

Métodos para recuperar transações para um determinado endereço

Para recuperar transações para um determinado endereço, podemos fazer o seguinte: 

  • Iterar através de cada bloco: Como não existe um método RPC específico, podemos fazer uma chamada para obter uma lista de dados de transação para um determinado endereço, precisaremos iterar através dos blocos da blockchain e registrar cada instância em que detectarmos uma transação relacionada ao nosso endereço. Esse método pode ser demorado e pode consumir muitas chamadas RPC se você precisar começar desde o início do bloco de seleção ( bloco de gênese ). Além disso, devemos solicitar esses dados de um Nó do arquivo ( que contém todos os dados históricos da blockchain desde o bloco de gênese ).

  • Usar um serviço de indexação: APIs como o API Etherscan permite que você busque transações para um determinado endereço. No entanto, eles vêm com limitações, pois você precisará fazer solicitações diferentes para diferentes tipos de transações que você esteja procurando (por exemplo, transações externas versus internas).

  • Usar um Indexador de código aberto: Este repositório configurou um banco de dados de indexação para que os usuários possam consultar esse tipo de dados da transação. Embora demore um pouco mais para configurar, será mais fácil analisar e gerenciar quando você tiver os dados.

Acesse um nó Ethereum com o QuickNode

Se estivermos interessados em obter todos os blocos da gênese, precisaremos nos comunicar com um nó do arquivo. No momento atual desta redação, o estado completo da blockchain Ethereum tem cerca de 10.000 GB de armazenamento ( ~ 11TB ). Felizmente, não precisamos gerenciar essa infraestrutura e podemos usar o QuickNode para inicializar um nó de arquivo.

Para acessar um nó Ethereum, navegue até o página de endpoints e clique no botão Create an Endpoint. Em seguida, selecione a blockchain  de sua escolha. Neste exemplo, estamos usando a Ethereum Mainnet, mas você também pode usar outras blockchains relacionadas ao EVM (ou seja, Fantom, Polygon, Avalanche, Optimism).

Se você deseja obter dados de transação desde o início da cadeia Ethereum, selecione o Arquivo do nó:

Nota: Se você deseja incluir transações onde seu endereço foi incluído em uma chamada de rastreamento, o QuickNode fornece uma maneira rápida e fácil de ativar essa funcionalidade no nó blockchain através do complemento Modo de rastreamento.

Quando seu nó estiver pronto, copie o URL HTTP conforme necessário na seção a seguir.

Buscando o histórico de transações usando o Web3.py

Agora que temos nosso nó de arquivo pronto, passaremos a criar o script Python. Abra seu terminal e execute os seguintes comandos para criar um diretório de projeto:


// buscando histórico de transações usando web3 py

mkdir eth-transactions-web3py && cd eth-transactions-web3py && echo > transaction_finder.py

Enter fullscreen mode Exit fullscreen mode

Em seguida, instalaremos as dependências necessárias:


//buscando histórico de transações usando web3 py

python3 -m pip install web3

Enter fullscreen mode Exit fullscreen mode

Por simplicidade, esta demonstração será pesquisada apenas no bloco atual e nos 100 blocos seguintes. Além disso, verificaremos apenas se o endereço to, corresponde ao conjunto em nossa variável blockchain_address. No seu arquivo transaction_finder.py, adicione o seguinte código:


//buscando histórico de transações usando web3 py



# importação de dependências



import pickle

from web3 import Web3, HTTPProvider



#  instância um provedor remoto web3

w3 = Web3(HTTPProvider('YOUR_QUICKNODE_HTTP_ENDPOINT'))



# solicita o número do bloco mais recente

ending_blocknumber = w3.eth.blockNumber



# bloco mais recente menos 100

starting_blocknumber = ending_blocknumber - 100 



# Filtra através dos blocos e procura transações envolvendo esse endereço

blockchain_address = "INPUT_A_VALID_ETHEREUM_ADDRESS"



# cria um dicionário vazio, adicionaremos dados da transação ao  

tx_dictionary = {}



def getTransactions(start, end, address):

    '''This function takes three inputs, a starting block number, ending block number

    and an Ethereum address. The function loops over the transactions in each block and

    checks if the address in the to field matches the one we set in the blockchain_address.

    Additionally, it will write the found transactions to a pickle file for quickly serializing and de-serializing

    a Python object.'''

    print(f"Started filtering through block number {start} to {end} for transactions involving the address - {address}...")

    for x in range(start, end):

        block = w3.eth.getBlock(x, True)

        for transaction in block.transactions:

            if transaction['to'] == address or transaction['from'] == address:

                with open("transactions.pkl", "wb") as f:

                    hashStr = transaction['hash'].hex()

                    tx_dictionary[hashStr] = transaction

                    pickle.dump(tx_dictionary, f)

                f.close()

    print(f"Finished searching blocks {start} through {end} and found {len(tx_dictionary)} transactions")



getTransactions(starting_blocknumber, ending_blocknumber, blockchain_address)




Enter fullscreen mode Exit fullscreen mode

Observe que o código acima armazena os dados da transação em um arquivo pickle. A vantagem de armazenar os dados no formato pickle é que ele pode serializar qualquer objeto Python sem manipular código adicional. Além disso, podemos ler, analisar e limpar facilmente os resultados sem fazer outra solicitação ao blockchain para obter as mesmas informações.

Lembre-se de adicionar seu URL RPC à variável w3 e também atualize a blockchain_address para o endereço em que você está pesquisando transações históricas. Quando terminar, salve o arquivo e execute o script executando o comando python3 transaction_finder.py:


//buscando histórico de transações usando web3 py

python3 transaction_finder.py

Enter fullscreen mode Exit fullscreen mode

Se a saída no seu terminal for semelhante à captura de tela acima, parabéns! 🎉

Para ler o conteúdo do arquivo transactions.pkl, você pode criar outro arquivo chamado transaction_reader.py:


//buscando histórico de transações usando web3 py

echo > transaction_reader.py

Enter fullscreen mode Exit fullscreen mode

Adicione o seguinte snippet de código:


// buscando histórico de transações usando web3 py



import pickle



data = pickle.load( open("transactions.pkl", "rb" ))

print(data)

Enter fullscreen mode Exit fullscreen mode

Execute o script:


//buscando histórico de transações usando web3 py

python3 transaction_reader.py

Enter fullscreen mode Exit fullscreen mode

Ao executar o script transaction_reader.py, você deve obter algo semelhante à captura de tela abaixo, onde a chave é o hash da transação e o valor contém os detalhes da transação.

Coisas importantes a serem observadas: O script acima detecta apenas transações com seu endereço no campo to  ou de. Existem cenários em que uma transação pode desencadear ações menores que ainda modificam o estado interno da EVM. Os dados relacionados a essas ações são registrados internamente na transação e são classificados como um rastreamento.

Se você estiver procurando por transações relacionadas a NFTs, poderá usar nossa API NFT para extrair o histórico de transações e as principais informações de coleta sobre as NFTs sem precisar classificar os contratos inteligentes individuais.

Conclusão

Aí está! Acabamos de demonstrar como buscar transações para um determinado endereço na Ethereum! Se você achar isso útil, confira alguns de nossos guias aqui. Inscreva-se no nosso boletim para mais artigos e guias. Sinta-se à vontade para entrar em contato conosco via Twitter se você tiver algum feedback. Você sempre pode conversar conosco em nosso servidor do Discord, uma comunidade com alguns dos desenvolvedores mais legais que você já conheceu 😊


Este artigo foi escrito por Ferhat Kochan  e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Latest comments (0)