4、连接以太坊节点:使用 Infura 或 Alchemy 获取 RPC 节点、通过 Web3.py 建立连接、查询区块信息
好,咱们正式开始动手了。
前面几章聊的都是概念和工具选型,说白了都是「纸上谈兵」。从这一章开始,我们要真正把代码跑起来,让数据从链上流到你的屏幕上。
连接以太坊节点,是所有链上数据工作的第一步。你想想看,没有节点,你连区块都看不到,更别提分析什么交易、地址、Gas 费了。我个人习惯把这一步叫做「打通数据管道」——管道通了,后面的事就顺了。
4.1 为什么需要 RPC 节点?
以太坊是一个去中心化的网络,由成千上万个节点组成。每个节点都保存着完整的区块链数据。但问题来了——你不可能自己跑一个全节点吧?
全节点需要同步几百 GB 的数据,还要保持 24 小时在线。对于做数据分析的我们来说,这成本太高了。所以,我们选择「借力」——使用第三方提供的 RPC 节点服务。
RPC 的全称是 Remote Procedure Call,远程过程调用。说白了,就是通过 HTTP 请求,让远程的节点帮你查数据,然后把结果返回给你。
4.2 选择 Infura 还是 Alchemy?
目前市面上最主流的两个 RPC 服务商,就是 Infura 和 Alchemy。我两个都用过,说说我的感受。
| 对比项 | Infura | Alchemy |
|---|---|---|
| 免费额度 | 每日 10 万次请求 | 每月 3 亿计算单元(约 30 万次请求) |
| 稳定性 | 老牌,稳定 | 较新,但性能更好 |
| 数据丰富度 | 基础 RPC 方法 | 额外提供交易回放、日志解析等高级 API |
| 上手难度 | 简单 | 稍复杂,但文档更友好 |
我个人建议:如果你是初学者,先从 Infura 开始。注册简单,API Key 一拿就能用。等你做复杂分析时,再考虑 Alchemy 的高级功能。
4.3 获取 RPC 节点地址
拿到 API Key 之后,RPC 节点地址的格式是这样的:
# Infura 主网节点
https://mainnet.infura.io/v3/你的ProjectID
# Alchemy 主网节点
https://eth-mainnet.g.alchemy.com/v2/你的APIKey
嗯,这里要注意:千万不要把 API Key 硬编码在代码里,更不要上传到 GitHub。我曾经见过有人把 Key 直接写在 Jupyter Notebook 里,结果被爬虫扫到,一夜之间被刷了几十万次请求,直接欠费。
4.4 安装 Web3.py
Web3.py 是 Python 生态里最流行的以太坊交互库。它封装了 RPC 调用,让你用 Python 代码就能查询链上数据。
安装很简单:
pip install web3
如果你用的是 Anaconda 环境,建议先创建一个新的虚拟环境:
conda create -n web3_env python=3.9
conda activate web3_env
pip install web3
为什么推荐用虚拟环境?因为 Web3.py 依赖的库版本比较敏感,搞不好会和你的其他项目冲突。我吃过这个亏,后来就老老实实每次新建项目都开虚拟环境。
4.5 建立连接:从代码到节点
好,现在我们来写第一行真正的代码。
from web3 import Web3
# 你的 Infura RPC 地址
infura_url = "https://mainnet.infura.io/v3/你的ProjectID"
w3 = Web3(Web3.HTTPProvider(infura_url))
# 检查是否连接成功
if w3.is_connected():
print("✅ 连接成功!")
print(f"当前区块高度: {w3.eth.block_number}")
else:
print("❌ 连接失败,请检查 RPC 地址和网络")
运行这段代码,如果看到「连接成功」和区块高度,恭喜你——你已经成功打通了数据管道。
为什么会失败?常见原因有三个:
- API Key 写错了(检查一下有没有多余的空格)
- 网络问题(有些公司内网会屏蔽外部 RPC)
- Infura 服务暂时不可用(概率很低,但遇到过)
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' https://mainnet.infura.io/v3/你的ProjectID
4.6 查询区块信息:第一个数据点
连接成功后,我们来查一下最新的区块信息。这是最基础的操作,也是后续所有分析的起点。
# 获取最新区块
latest_block = w3.eth.get_block('latest')
print("最新区块信息:")
print(f"区块号: {latest_block['number']}")
print(f"时间戳: {latest_block['timestamp']}")
print(f"交易数量: {len(latest_block['transactions'])}")
print(f"矿工地址: {latest_block['miner']}")
print(f"Gas 使用量: {latest_block['gasUsed']}")
print(f"Gas 上限: {latest_block['gasLimit']}")
输出大概长这样:
最新区块信息:
区块号: 19876543
时间戳: 1712345678
交易数量: 152
矿工地址: 0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5
Gas 使用量: 14987654
Gas 上限: 30000000
这些字段是什么意思?我简单解释一下:
- 区块号:区块在链上的序号,从 0 开始
- 时间戳:区块被挖出的 Unix 时间戳,可以转换成人类可读的时间
- 交易数量:这个区块里包含多少笔交易
- 矿工地址:谁挖出了这个区块
- Gas 使用量:实际消耗的 Gas,反映网络拥堵程度
你还可以查询指定区块号的信息:
# 查询指定区块
block_number = 19000000
block = w3.eth.get_block(block_number)
print(f"区块 {block_number} 的交易数: {len(block['transactions'])}")
4.7 知识体系:连接节点的完整流程
为了让你更直观地理解整个流程,我画了一张图:
4.8 实战小练习
光看不练可不行。我建议你立刻动手做这三件事:
- 注册一个 Infura 账号,拿到你的 Project ID
- 用 Web3.py 连接主网,打印出最新区块的区块号和时间戳
- 把时间戳转换成人类可读的时间格式(提示:用 Python 的
datetime模块)
做完这些,你就已经迈出了链上数据分析的第一步。后面的事,咱们慢慢来。
- RPC 节点是连接链上数据的桥梁
- Infura 和 Alchemy 是主流选择,初学者推荐 Infura
- Web3.py 是 Python 操作以太坊的标准库
- 连接成功后,用
get_block()就能查询区块信息
嗯,这一章就到这儿。记住,数据管道打通了,后面的事就顺了。
公众号:蓝海资料掘金营,微信deep3321