4. Python环境搭建:Web3.py库安装、Infura/Alchemy节点服务配置、本地节点 vs 远程节点
好,咱们正式开始动手了。
前面聊了那么多链上数据的底层逻辑,现在终于要进入实操环节。说实话,很多新手在第一步就被环境搭建劝退了——不是装不上库,就是连不上节点,折腾一整天连个区块高度都查不到。我当年也踩过这些坑,所以今天咱们把这事彻底讲明白。
4.1 为什么非得用Python?
你可能想问:JavaScript不也能做链上分析吗?为什么我推荐Python?
原因很简单:Python的数据处理生态太强了。Pandas、NumPy、Matplotlib这些库,做数据分析简直是降维打击。你想想看,当你从链上拉下来几万条交易记录,用Python清洗、聚合、可视化,一套流程下来行云流水。换成JavaScript?嗯,也不是不行,但你会多写不少代码。
我个人习惯用Python 3.9+版本。别用太老的版本,有些新库已经放弃支持3.7以下了。
4.2 安装Web3.py——其实就一行命令
Web3.py是连接以太坊网络的Python桥梁。安装它,你就能用Python跟链上交互了。
pip install web3
对,就这么简单。但我建议你用虚拟环境,别污染全局Python。我在项目里吃过这个亏——同时维护好几个项目,依赖版本打架,最后不得不全部重装。
python -m venv venv
source venv/bin/activate # Mac/Linux
# 或者
venv\Scripts\activate # Windows
pip install web3
装完之后,验证一下:
python -c "from web3 import Web3; print(Web3.__version__)"
如果输出版本号,恭喜你,第一步走通了。
4.3 节点服务配置——Infura vs Alchemy
有了Web3.py,你还需要一个节点才能连上以太坊网络。自己跑节点?别急,后面会讲。先说说最省事的方案:第三方节点服务。
市面上主流的两家:Infura 和 Alchemy。我都用过,说说我的感受。
| 对比项 | Infura | Alchemy |
|---|---|---|
| 免费额度 | 10万请求/天 | 3亿计算单元/月(约30万次请求) |
| 稳定性 | 老牌,偶尔抽风 | 更稳定,有历史数据回放 |
| WebSocket支持 | 支持 | 支持,且更易用 |
| 数据丰富度 | 基础数据 | 增强API(如交易收据解析) |
我个人更倾向Alchemy。为什么?有一次我用Infura做历史数据回溯,跑到一半突然限流了,整个分析脚本白跑两小时。换成Alchemy之后,同样的代码再没出过问题。当然,Infura也够用,看你的预算和需求。
4.3.1 注册并获取API Key
不管选哪家,流程都差不多:
- 去官网注册账号
- 创建一个项目(选以太坊主网)
- 复制API Key或HTTP端点URL
以Alchemy为例,你拿到的是这样的URL:
https://eth-mainnet.g.alchemy.com/v2/你的API_KEY
4.3.2 用Web3.py连接节点
拿到URL之后,连接就很简单了:
from web3 import Web3
# 连接Alchemy节点
alchemy_url = "https://eth-mainnet.g.alchemy.com/v2/你的API_KEY"
w3 = Web3(Web3.HTTPProvider(alchemy_url))
# 检查是否连接成功
print(f"已连接: {w3.is_connected()}")
print(f"当前区块高度: {w3.eth.block_number}")
4.4 本地节点 vs 远程节点——怎么选?
这个问题我经常被问到。直接说结论:开发测试用远程,生产环境用本地。
为什么会这样?我给你分析一下:
4.4.1 远程节点的优缺点
- 优点:零运维,注册即用,适合快速原型开发
- 缺点:有请求限制,延迟较高,数据隐私存疑
我记得有一次做高频交易监控,用Infura的免费版,每秒请求超过10次就被限流了。后来换成付费方案,成本一下子上去不少。
4.4.2 本地节点的优缺点
- 优点:无请求限制,延迟低,数据完全自主
- 缺点:需要同步全量数据(以太坊主网现在超过1TB),运维成本高
如果你只是做数据分析,我建议用远程节点起步。等你的项目跑起来了,数据量大了,再考虑自己跑节点。别一上来就搞本地节点,同步一周数据还没完,热情早磨没了。
4.4.3 快速启动本地节点(Geth)
如果你真想跑本地节点,用Geth是最常见的:
# 安装Geth(Mac)
brew install ethereum
# 启动轻节点(只同步区块头,不下载完整状态)
geth --syncmode light --http
轻节点模式只需要几十GB空间,适合数据分析场景。全节点?嗯,除非你有专门的服务器,否则别碰。
4.5 本章知识体系
下面这张图帮你理清今天的内容:
4.6 避坑指南
最后分享几个我踩过的坑:
- API Key泄露:我曾经把Key写在Jupyter Notebook里,分享时忘了删,结果被人拿去调用了两万次查询。从那以后,我所有Key都放在.env文件里,用python-dotenv加载。
- 网络超时:远程节点偶尔会超时。我的解决方案是加重试机制:
from web3 import Web3
from web3.middleware import retry_request_middleware
w3 = Web3(Web3.HTTPProvider(alchemy_url))
w3.middleware_onion.add(retry_request_middleware)
# 这样请求失败时会自动重试3次
- 版本兼容:Web3.py v6和v5的API有变化。如果你看网上的教程报错,先检查版本。我习惯用v6,语法更现代。
一句话总结:装好Web3.py,配好节点服务,你就能用Python读取链上任何数据了。远程节点起步,别一上来就折腾本地节点。
好了,环境搭好了,下一章咱们就开始真正抓数据了。到时候你会看到,链上数据其实没那么神秘。