本文详细介绍了在以太坊上如何检索特定地址的交易历史,包括实现方法、所需工具以及代码示例。作者通过步骤详尽的方法论,旨在帮助读者在以太坊区块链上进行有效的数据查询和管理。
如果你在构建以太坊应用程序,可能会遇到需要获取特定地址的交易历史记录的情况。不幸的是,目前以太坊的设计缺乏一种简单的方法来检索这些数据。因此,我们将这篇指南专门用于解释你可以在以太坊上检索交易历史记录的不同方式。我们将用 Python 演示其中的一种方法。请查看一下你需要的前置条件:
你将需要的
要检索特定地址的交易,可以进行以下任何一种操作:
迭代每个区块:由于没有特定的 RPC 方法可以调用以获取给定地址的交易数据列表,我们需要自己迭代区块链的区块,并记录每次检测到与我们地址相关的交易。这种方法可能非常耗时,并且如果需要从区块链的开始(创世区块)开始,将消耗大量的 RPC 调用。此外,我们应该向 Archive node 请求这些数据(它包含自创世区块以来所有的历史数据)。
使用索引服务:像 Etherscan API 这样的 API 允许你获取特定地址的交易。不过,这些服务存在一些限制,因为你需要针对不同类型的交易进行不同的请求(例如,外部交易与内部交易)。
使用开源索引器:这个 代码库 为用户设置了一个索引数据库,以便能够查询这种类型的交易数据。虽然设置需要一些时间,但一旦你拥有数据,将更容易进行分析和管理。
如果我们有兴趣获取自创世块以来的所有区块,我们需要与 Archive node 进行通信。到目前为止,以太坊区块链的完整状态大约需要 10,000 GB 的存储空间(约 11 TB)。幸运的是,我们不需要自己管理这一基础设施,我们可以使用 QuickNode 启动一个 Archive node。
要访问以太坊节点,导航到 endpoint 页面 并点击 Create an Endpoint 按钮。然后,选择你所希望的链。在这个例子中,我们使用的是以太坊主网,但你也可以使用其他与 EVM 相关的链(例如,Fantom、Polygon、Avalanche、Optimism)。
如果你希望从以太坊链的起始点获取交易数据,请选择 Archive node 附加选项:
注意: 如果你希望包含你的地址在 trace 调用中,QuickNode 提供了一种简便的方法,通过 Trace Mode 附加选项在你的区块链节点上启用此功能。
一旦你的节点准备好,复制 HTTP URL,因为你将在接下来的部分中需要它。
现在我们已经准备好 Archive node,将转到创建 Python 脚本。打开终端并运行以下命令来创建项目目录:
mkdir eth-transactions-web3py && cd eth-transactions-web3py && echo > transaction_finder.py
接下来,我们将安装所需的依赖项:
python3 -m pip install web3
为了简化,此演示将只从当前区块以及接下来的 100 个区块进行搜索。此外,我们将只检查 to 地址是否与我们在 blockchain_address 变量中设置的地址匹配。在你的 transaction_finder.py 文件中,添加以下代码:
## 导入依赖项
import pickle
from web3 import Web3, HTTPProvider
## 实例化一个 web3 远程提供者
w3 = Web3(HTTPProvider('YOUR_QUICKNODE_HTTP_ENDPOINT'))
## 请求最新区块编号
ending_blocknumber = w3.eth.blockNumber
## 最新区块编号减去 100 个区块
starting_blocknumber = ending_blocknumber - 100
## 在区块中筛选并查找与此地址相关的交易
blockchain_address = "INPUT_A_VALID_ETHEREUM_ADDRESS"
## 创建一个空字典以存储交易数据
tx_dictionary = {}
def getTransactions(start, end, address):
'''该函数接受三个输入,即起始区块编号、结束区块编号
和一个以太坊地址。该函数遍历每个区块中的交易,
检查 to 字段中的地址是否与我们在 blockchain_address 中设置的地址匹配。
此外,它会将找到的交易写入一个 pickle 文件,以便快速序列化和反序列化
Python 对象。'''
print(f"开始筛选区块编号 {start} 到 {end} 的交易,涉及地址 - {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"完成了从区块 {start} 到 {end} 的搜索,共找到 {len(tx_dictionary)} 笔交易")
getTransactions(starting_blocknumber, ending_blocknumber, blockchain_address)
请注意,上面的代码将交易数据存储在一个 pickle 文件中。使用 pickle 格式存储数据的优点是它可以序列化任何 Python 对象,而无需处理额外的代码。此外,我们可以很容易地读取、分析和清理结果,而无需再次请求区块链上的相同信息。
记得将你的 RPC URL 添加到 w3 变量中,并更新 blockchain_address 为你要查询历史交易的地址。当你完成这些操作后,保存文件并通过运行命令 python3 transaction_finder.py 来运行脚本:
python3 transaction_finder.py
请注意,这个脚本无法筛选日志或内部交易。
**
** 如果你的终端输出与上图相似,恭喜你!🎉
要阅读 transactions.pkl 文件的内容,你可以创建另一个文件叫做 transaction_reader.py:
echo > transaction_reader.py
添加以下代码片段:
import pickle
data = pickle.load( open("transactions.pkl", "rb" ))
print(data)
运行脚本:
python3 transaction_reader.py
在运行 transaction_reader.py 脚本时,你应该获得类似于下面屏幕截图的内容,其中键是交易哈希,值包含交易详细信息。
重要事项:上面的脚本仅检测在 to 或 from 字段中包含你地址的交易。在某些情况下,交易能触发较小的操作,这些操作仍会修改 EVM 的内部状态。与这些操作相关的数据会在交易内部记录,并被分类为 trace。
如果你正在寻找与 NFT 相关的交易,可以使用我们的 NFT API 来提取交易历史记录和关于 NFT 的关键集合信息,而无需逐个智能合约进行排序。
就这样!我们刚刚演示了如何在以太坊上获取特定地址的交易!如果你发现这有用,请查看我们的一些指南 这里。订阅我们的 新闻通讯 以获取更多文章和指南。如果你有任何反馈,随时通过 Twitter 联系我们。你也可以在我们的 Discord 社区服务器上与我们交流,这里有你能见到的一些最酷的开发者 😊
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!