4、Web3.py入门:环境安装、连接节点、查询区块与交易
好,咱们进入实战环节了。
前面几章讲了链上数据的价值,也画了架构图。但光说不练假把式。这一章,我们亲手把Python和区块链连起来。
Web3.py,说白了就是Python世界的以太坊SDK。你用它写几行代码,就能跟节点对话。我个人习惯,所有链上监控项目的第一行代码,都是从Web3.py开始的。
4.1 环境安装:别在这卡住
安装其实很简单。但我见过太多新手在虚拟环境上翻车。
我曾经有个学员,直接在系统Python里pip install,结果把依赖搞乱了,整个环境崩掉。所以,请务必使用虚拟环境。
我的推荐流程是这样的:
- 先装Python 3.9+(3.8也行,但别低于3.7)
- 创建虚拟环境:
python -m venv web3_env - 激活环境(Windows用Scripts\activate,Mac/Linux用source bin/activate)
- 安装Web3.py:
pip install web3
装完之后,验证一下:
python -c "from web3 import Web3; print(Web3.__version__)"
如果能打印出版本号,恭喜你,环境通了。
如果你在国内,pip下载慢。可以加个镜像源:
pip install web3 -i https://pypi.tuna.tsinghua.edu.cn/simple
4.2 连接节点:选对Provider是关键
环境装好了,接下来要连节点。节点是什么?你可以把它理解成区块链的「入口」。没有节点,你啥也查不到。
连接方式主要有三种:
| Provider类型 | 适用场景 | 优缺点 |
|---|---|---|
| HTTPProvider | 本地节点或远程RPC | 简单直接,但需要节点URL |
| WebsocketProvider | 实时订阅事件 | 支持长连接,适合监控场景 |
| IPCProvider | 本地节点(Unix socket) | 最快最安全,但只能本地用 |
我个人做监控系统,最常用的是WebsocketProvider。为什么呢?因为监控需要实时性,HTTP轮询太慢了,而且浪费资源。
来看一段连接代码:
from web3 import Web3
# 连接以太坊主网(这里用Infura的公共节点)
infura_url = "https://mainnet.infura.io/v3/YOUR_PROJECT_ID"
w3 = Web3(Web3.HTTPProvider(infura_url))
# 检查是否连接成功
if w3.is_connected():
print("✅ 连接成功!当前区块高度:", w3.eth.block_number)
else:
print("❌ 连接失败,请检查网络或节点地址")
嗯,这里要注意。YOUR_PROJECT_ID需要你去Infura官网注册一个。免费的够用了,每天10万次请求。
连接节点时,一定要做
is_connected() 检查。我见过太多人代码写完了,跑起来才发现节点早就断了,数据全是空的。
4.3 查询区块:看看链上发生了什么
连上节点了,咱们先查个区块试试。区块是区块链的基本单位,每个区块里打包了一堆交易。
查询最新区块:
latest_block = w3.eth.get_block('latest')
print("区块号:", latest_block['number'])
print("区块哈希:", latest_block['hash'].hex())
print("时间戳:", latest_block['timestamp'])
print("交易数量:", len(latest_block['transactions']))
你想想看,这一下就能看到当前链上最新的状态。是不是很直观?
如果你想查某个特定区块,比如第18000000号区块:
block = w3.eth.get_block(18000000)
print(f"区块 {block['number']} 包含 {len(block['transactions'])} 笔交易")
我在做监控系统时,经常需要对比前后两个区块的状态。比如监控某个地址的余额变化。这时候,我会把区块号作为索引,存到数据库里,方便回溯。
4.4 查询交易:追踪每一笔转账
区块查完了,咱们深入一层,看看交易。交易才是链上数据的灵魂。
查询某笔交易:
tx_hash = "0xabc123..." # 这里填真实的交易哈希
tx = w3.eth.get_transaction(tx_hash)
print("发送方:", tx['from'])
print("接收方:", tx['to'])
print("金额(ETH):", w3.from_wei(tx['value'], 'ether'))
print("Gas价格(Gwei):", w3.from_wei(tx['gasPrice'], 'gwei'))
这里有个坑,我踩过。交易哈希是bytes32类型,打印出来是一串乱码。记得用 .hex() 转换一下。
另外,查询交易收据也很重要。收据里包含了交易是否成功、实际消耗了多少Gas等信息:
receipt = w3.eth.get_transaction_receipt(tx_hash)
print("交易状态:", "成功" if receipt['status'] == 1 else "失败")
print("实际Gas消耗:", receipt['gasUsed'])
print("区块号:", receipt['blockNumber'])
交易收据只有在交易被打包进区块后才能查到。如果你刚发了一笔交易,马上查收据,可能会返回None。等几秒再查就好。
4.5 实战:批量查询区块中的交易
好了,单个查询学会了。但监控系统需要批量处理。咱们写个小脚本,把最近10个区块的所有交易都捞出来:
latest = w3.eth.block_number
for i in range(latest, latest - 10, -1):
block = w3.eth.get_block(i, full_transactions=True)
print(f"\n--- 区块 {i} ---")
for tx in block['transactions']:
print(f" {tx['from']} -> {tx['to']} : {w3.from_wei(tx['value'], 'ether')} ETH")
注意这里 full_transactions=True 这个参数。如果不加,返回的只是交易哈希列表。加上之后,直接返回完整的交易对象。省得你再一个个去查。
不过,这个参数很耗性能。如果区块里包含几百笔交易,一次请求的数据量会很大。我建议在监控场景下,先用 full_transactions=False 拿到哈希列表,然后按需查询。
4.6 知识体系总览
这一章的内容,其实就围绕一个核心流程:环境 → 连接 → 查询。我画了张图,帮你理清思路。
这张图把本章的知识点串起来了。你照着这个流程走,基本不会迷路。
4.7 本章小结
这一章我们干了三件事:
- 装环境:虚拟环境 + pip install web3
- 连节点:三种Provider,推荐WebSocket做监控
- 查数据:区块、交易、收据,一个不落
说实话,Web3.py的API设计得很Pythonic。你只要记住几个核心方法,剩下的可以举一反三。我在项目中,90%的查询需求都靠这几个方法搞定。
下一章,我们会把这些查询能力组合起来,搭建一个真正的监控系统。到时候,你会看到这些基础操作如何变成强大的自动化工具。