获取和某个智能合约交互的所有地址
本项目已经开源到 GitHub 中,地址为:https://github.com/hubei-xhjy/blockchain-history-analyzer
Eigenlayer 交互地址查询
1. get_txn_by_etherscan.py
1. 获取 EigenLayer 合约地址
一般上,项目都会在他们的官网提供合约地址。通常在 Documentation 文档中。
- 如 EigenLayer 的官网: https://www.eigenlayer.xyz/
- 打开 Documentation 页面
- 直接搜索 Contract,找到类似
Contract Address
- 从文档中可以看到,这里提供了几个站外连接,我们点击 README.md 文档
- 这时候会跳转到 GitHub(其他项目会有不同的方法,可能直接写在页面中)
可以看到他们的表格如下:
Name | Proxy | Implementation | Notes |
---|---|---|---|
DelegationManager | 0x012345 | 0xabcdef | Proxy: TUP@4.7.1 |
我们只需要获取 Proxy 的合约就行,可以看到这里有一大串合约地址,都要留下来,以免有漏网之鱼
0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A |
2. 使用 Etherscan 搭配合约地址进行数据爬取
Etherscan 已经给我们提供了通过合约地址以及区块范围进行数据爬取的 API
注意:此 API 每次最大只返回 10000 条数据
https://api.etherscan.io/api |
我们在这里做个示例,执行以下请求:
- 我们用 18905564 作为起始区块
- 这里我们用 19438188 作为结束区块
- 这里我们用 1 作为页数
- 这里我们用 1 作为偏移量(显示 1 条数据)
- 示例 API
https://api.etherscan.io/api |
代码解释
这段代码是为了从 Etherscan API 拉取特定以太坊智能合约地址的交易数据,并将其保存到本地文件中。以下是对代码各部分的详细解释:
- 导入模块:
使用import requests
导入 Python 的requests
库,这是一个常用的库,用于发起 HTTP 请求。 - API 密钥和合约地址:
etherscan_api_key
存储了 Etherscan API 的密钥,这是进行 API 调用时验证用户的关键信息。contract_addresses
列表包含了需要查询交易信息的多个智能合约地址。 - 区块范围:
start_block
和end_block
定义了查询交易的起始和结束区块号。代码中将起始区块设定为 10000000,结束区块设定为 19438188。这样设定是为了确保涵盖了需要查询的所有交易数据。 - 查询循环:
代码使用了一个外层的for
循环遍历每一个合约地址,内层的while
循环则用于持续查询直到没有更多数据。对于每个合约地址,代码构造一个 URL 来调用 Etherscan 的 API,获取该地址的交易列表。如果一页的结果满了(默认是 10000 条最大),就调整current_block
来获取接下来的数据。 - 构造 URL:
URL 包括合约地址、起始和结束区块号等参数。为了保证 URL 的正确,代码中有步骤替换 URL 中的空格和换行符。 - 处理响应:
如果 HTTP 请求成功(状态码 200),则读取返回的数据并检查结果集的长度。如果结果集为 0,说明没有更多数据;否则,将数据写入本地文件。每次成功写入文件后,如果结果集达到 10000 条,就更新current_block
并增加文件索引file_index
,准备写入新的文件。 - 错误处理:
如果 HTTP 请求失败,会打印错误信息和状态码。
这段代码的主要功能是从 Etherscan API 拉取交易数据,并根据数据量可能将结果分成多个文件保存。这可以用于分析智能合约的交易历史或进行区块链数据的备份。
2. get_addresses_list.py
有了这些 tx 数据,接下来我们需要对这些数据进行分析。得出与这个智能合约交互的地址列表。
上面的 json 返回数据如下(节选)
{ |
可以得到以下信息:
- 我们所需的数据都在 result 数组里
- 重要的几个字段有:
- from
- to
- isError
其中,isError 是用来检查这个 tx 是否成功的,0 表示成功,1 表示失败。
接下来要做的事情就是对所有交互过的地址进行收集并去重。
代码解释
这段代码用于从之前通过 Etherscan API 获取的交易数据中提取出所有唯一的钱包地址,并将它们保存到一个文本文件中。以下是对代码各部分的详细解释:
- 导入模块:
使用import os
和import json
导入 Python 的os
库和json
库。os
库用于操作文件和目录,json
库用于解析 JSON 文件。 - 初始化数据:
contract_addresses
列表包含了所有需要处理的智能合约地址。这些地址之前已通过其他脚本用来获取交易数据。wallet_addresses
是一个集合(set),用于存储不重复的钱包地址。 - 处理文件:
代码遍历contract_addresses
中的每个地址。对于每个地址,它查找output
目录下以该地址开头且以.json
结尾的所有文件。 - 读取和解析数据:
对于找到的每个文件,代码打开文件并加载 JSON 数据。它遍历每个交易数据的 ‘result’ 部分,对每个交易项进行处理。 - 筛选交易数据:
代码检查每个交易是否有错误(通过 ‘isError’ 字段)。如果isError
为1
,则忽略该交易;否则,将交易的发送方(’from’)和接收方(’to’)地址添加到wallet_addresses
集合中。 - 保存结果:
将wallet_addresses
集合中的地址写入到output/wallet_addresses.txt
文件中,每个地址占一行。 - 输出统计信息:
最后,打印出存储的钱包地址总数,以帮助了解处理的结果规模。
3. track_eigenlayer_airdrop_by_address.py
现在有了所有的地址列表,接下来就是向空投项目方发送请求,查询空投额度:
通过一次前端请求过程中,我们使用开发者工具获取到了官方的空投 API 地址:
url = "https://claims.eigenfoundation.org/clique-eigenlayer-api/campaign/eigenlayer/credentials?walletAddress={}" |
我们发现官方并没有对 IP 进行禁止(流量限制),所以我们可以只挂一个 VPN 就开始暴力请求
因为这是一个很漫长的请求,所以我加入了 tqdm 来追踪进度
代码解释
这段代码旨在从一个 CSV 文件中读取钱包地址,通过并发请求一个 API 来获取关于每个钱包地址的额外数据(例如资格令牌信息),并将结果写入到一个新的 CSV 文件中。下面是对代码的详细解释:
- 导入必要的模块:
requests
用于发起网络请求。csv
用于处理 CSV 文件读写。tqdm
提供进度条功能,让用户可视化处理进度。ThreadPoolExecutor
用于实现多线程并发,提高请求处理的效率。
- 定义 API URL:
url
定义了用来获取数据的 API 地址,该地址需要填入一个钱包地址。 - 读取钱包地址:
使用csv.reader
从 “output/wallet_addresses.csv” 文件中读取钱包地址。首先读取标题行,并检查是否已经包含 ‘Tokens’ 列。如果没有,将 ‘Tokens’ 添加到标题行中。 - 定义辅助函数
fetch_token_data
:
这个函数接收一行数据(即一个钱包地址),向 API 发送请求,并处理响应。成功获取数据后,将其添加到该行;如果请求失败或发生异常,则记录相应的错误信息。 - 多线程处理:
使用ThreadPoolExecutor
创建一个线程池,最多允许 10 个并发线程。这些线程将并行地为每个钱包地址调用fetch_token_data
函数。 - 写入新的 CSV 文件:
结果被写入到 “output/wallet_addresses_updated.csv” 文件中。首先写入更新后的标题行,然后写入每行的处理结果。 - 进度条显示:
使用tqdm
包装executor.map
的调用,显示处理进度条,提供用户友好的进度显示。