1. 直接方式:获取以太坊交易 csv 文件
网站下载。下载地址 https://xblock.pro/#/
2. 定制化方式:通过 web3 将交易信息导入 csv 文件
- web3 安装
pip install web3.py
- geth 下载安装
windows 环境
- 官网下载。下载地址: geth.ethereum.org/downloads/
- 软件安装。一直点击next,修改自己的安装路径后点击 install,geth完成安装
- 环境变量配置。右键 <我的电脑>,点击 <属性>,点击 <高级系统设置>,点击 <环境变量>, <系统变量 Path>,点击 <编辑>,点击 <新建>,输入 <刚才软件安装的路径>
- 安装成功检测。<windows + r> 输入 cmd 进入命令管理器,输入 geth version
ubuntu 安装
- sudo add-apt-repository -y ppa:ethereum/ethereum
- sudo apt-get update
- sudo apt-get install ethereum
- 比如下载前 900 万区块的交易:http://elc.yonsei.ac.kr/usenix-atc21/0-9M.blockchain
- 如根据需要下载,比如前 100 万,将 0-9 改为 0-1;下载 100-200 万,0-9 改为 1-2,以此类推
- 比如一次性导入前 900 万区块交易,运行命令:
geth --datadir dir_name(文件夹名字作为本地交易存放位置)import 0-9M.blockchain
- 注意事项:硬盘感觉要有1T以上空间,同时要做好数据同步过程要一两天的心理准备。
要是只需要前100万个块,就更简单了,把上边命令中的 0-9M 改成 0-1M 就可以,如需导入1-2M,需先导入 0-1M
运行命令:
geth --http --http.api web3,eth,net,db,personal --http.addr 0.0.0.0 --http.port 8545 --datadir dir_name(文件夹名字作为本地交易存放位置)
假设我们只记录交易以下字段:
python代码如下:
from web3 import Web3, HTTPProvider, IPCProvider, WebsocketProvider
import csv
# 连接本地运行的以太坊
web3 = Web3(Web3.HTTPProvider('http://localhost:8545'))
# 导入 200万 到 300万 区块间的交易
fileName = "2000000to2999999_BlockTransaction.csv"
# 设置 csv 文件属性头内容
data = {'blockHash': None, 'blockNumber': None, 'from': None, 'gas': None, 'gasPrice': None, 'hash': None, 'input': None, 'nonce': None, 'to': None, 'transactionIndex': None, 'value': None}
# 写入 csv 文件属性头内容
with open(fileName, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=data.keys())
writer.writeheader()
# 交易数量
count = 0
with open(fileName, 'a', newline='') as csvfile:
for num in range(2000000, 3000000):
# 获取有交易详细记录的区块信息
blockInfo = web3.eth.get_block(num, True)
# 跳过不存在交易的区块
if(not bool(blockInfo['transactions'])):
continue
else:
for transactionList in blockInfo['transactions']:
# 记录每一条交易信息
transactionRow = {}
for key, value in dict(transactionList).items():
# 可自主选择不记录的一些交易字段
if key == 'type' or key == 'v' or key == 'r' or key == 's':
continue
# 将字段信息的二进制表示为十六进制
elif key == 'blockHash' or key == 'hash' or key == 'input':
transactionRow[key] = value.hex()
else:
transactionRow[key] = value
writer = csv.DictWriter(csvfile, fieldnames=transactionRow.keys())
writer.writerow(transactionRow)
print("当前区块:", num)
count = count + 1
print("交易个数为:", count)