如何使用web3py获取整个以太坊网络的所有交易数据

问题描述 投票:0回答:3

我正在尝试对加密货币(例如比特币、以太坊)数据进行一些分析,但找不到数据源。例如,我想收集以太坊的输入地址、输出地址、交易时间、交易金额等交易数据。

我发现我可以使用 web3py 访问以太坊数据,但是是否可以获取最近在整个以太坊网络中进行的“所有”交易的数据,而不仅仅是连接到我自己的钱包(地址)的交易?例如,我想获取今天发生的所有以太坊交易的数据。

另外,我是否必须拥有自己的以太坊钱包(地址)才能使用 web3py 访问他们的数据?我想知道我是否需要一个特定的地址作为起点,或者我可以直接抓取数据而不创建钱包。

谢谢。

python-3.x blockchain ethereum web3py
3个回答
4
投票

在撰写此答案时,以太坊区块链上有超过 21 亿笔交易。如果您使用 Web3py 下载所有这些,它将需要您一个节点 RPC 连接,以及一些小脚本和数据库。

或者您可以使用此以太坊交易API下载所有交易。在撰写此回复时,此 API 是免费的。

披露 - 我是 Bitquery 的增长主管


1
投票

例如,我想收集以太坊的输入地址、输出地址、交易时间、交易金额等交易数据。

您可以使用 web3.eth.get_block 调用迭代所有区块和交易。但是,您需要自己解析交易内容。

要访问所有数据,建议您运行自己的节点以获得 JSON-RPC 调用的最大网络带宽。

另外,我是否必须拥有自己的以太坊钱包(地址)才能使用 web3py 访问他们的数据?

地址只是从随机数派生的,您不需要生成一个


0
投票

假设您已经有 Infura 项目 ID,以下代码应该可以帮助您访问最新的区块:

ethereum_mainnet_endpoint  = f'https://mainnet.infura.io/v3/{INFURA_PROJ_ID}'
web3 = Web3(Web3.HTTPProvider(ethereum_mainnet_endpoint))
assert web3.isConnected()

eth_block_df = pd.DataFrame(ethBlocks).set_index('number')

访问最近的交易后,您可以循环每个交易哈希并用它创建一个新的数据集:

def decoder(txns):
  block = []
  for i in txns:
    hash =  '0x' + bytes(i).hex()
    block.append(hash)
  
  return block

eth_block_df['transactions_0x'] = eth_block_df['transactions'].apply(lambda x: decoder(x))

def transaction_decoder(hashes):
  """
  Generates a list of ETH transactions per row
  """
  txn_dets = []
  for i in hashes:
    txn = web3.eth.get_transaction(str(i))
    txn_dets.append(dict(txn))
  
  return txn_dets

def transaction_df(series):
  """
  Converts a list of lists of Ethereum transactions into a single DataFrame.
  """
  obj = series.apply(transaction_decoder)
  main = []
  for row in obj:
    for txn in row:
      main.append(txn)

  eth_txns_df = pd.DataFrame(main, columns=main[0].keys())

  return eth_txns_df

eth_txns_df = transaction_df(eth_block_df['transactions_0x'])
print(eth_txns_df.shape)

我最近在一个仍在工作的项目中使用了这段代码,所以它可能不是最有效或最干净的解决方案,但它完成了工作。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.