Python

如何獲取所有乙太坊地址?

  • March 3, 2021

我將獲得所有具有正餘額的 ehtereum 錢包地址。我試圖通過一種獲取交易的方法來獲取地址。我從 blocknumber(0~ Inf) 得到了交易。使用 web3 和以下程式碼:

block_number = 0
while True:
   tx = web3.eth.getTransaction(block_number)
   if not tx:
       break
   ...
   block_number += 1

但是上面的執行時間太慢了。如果有人知道如何通過其他方式獲取所有地址,請幫助我。

您實際上是在嘗試建構區塊瀏覽器的核心組件。一些相關的問題可能會作為背景有用,例如:區塊瀏覽器實際上是如何工作的?

請注意,即使這種迭代所有交易接收者的蠻力方法也不會產生所有帳戶地址,因為“內部交易”。參見:如何獲取合約內部交易

即使您通過這種迭代方法獲得的帳戶子集也將是一個非常緩慢的過程。有很多數據需要處理。但是您可以通過一次將所有事務放在一個塊中來加快速度:

block = w3.eth.getBlock(block_number, full_transactions=True)
for txn in block.transactions:
  # add txn.to to the set of recipients

API 文件

這至少會為您節省大量對節點的往返呼叫,因為您只需在每個塊中呼叫一次節點,而不是在每個事務中呼叫一次。

純 Web3 API 無法解決此任務。您可以獲得特定地址的餘額,但您無法有效地迭代所有具有(可能)非零餘額的地址。遍歷所有交易並檢查它們的“to”地址不會做你想要的,因為一個地址可能以不同的方式獲得乙太幣,並不是所有這些方式都要求地址出現在某些交易的“to”欄位中。

例如,創世區塊中有 8893 個地址獲得了乙太幣。此外,乙太幣可以通過智能合約發送到某個地址。

為了獲得所有具有非零餘額的地址列表,您可以像這樣使用Google BigQuery

SELECT `address`, `eth_balance`
FROM `bigquery-public-data.crypto_ethereum.balances`
WHERE `eth_balance` != 0
# ORDER BY `eth_balance` DESC
# LIMIT 10

引用自:https://ethereum.stackexchange.com/questions/52744