4、Web3.py入门:环境安装、连接节点、查询区块与交易

好,咱们进入实战环节了。

前面几章讲了链上数据的价值,也画了架构图。但光说不练假把式。这一章,我们亲手把Python和区块链连起来。

Web3.py,说白了就是Python世界的以太坊SDK。你用它写几行代码,就能跟节点对话。我个人习惯,所有链上监控项目的第一行代码,都是从Web3.py开始的。

4.1 环境安装:别在这卡住

安装其实很简单。但我见过太多新手在虚拟环境上翻车。

⚠️ 避坑指南
我曾经有个学员,直接在系统Python里pip install,结果把依赖搞乱了,整个环境崩掉。所以,请务必使用虚拟环境。

我的推荐流程是这样的:

  1. 先装Python 3.9+(3.8也行,但别低于3.7)
  2. 创建虚拟环境:python -m venv web3_env
  3. 激活环境(Windows用Scripts\activate,Mac/Linux用source bin/activate)
  4. 安装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 知识体系总览

这一章的内容,其实就围绕一个核心流程:环境 → 连接 → 查询。我画了张图,帮你理清思路。

Web3.py 核心知识体系 1. 环境安装 Python 3.9+ / 虚拟环境 pip install web3 2. 连接节点 HTTP / WebSocket / IPC is_connected() 检查 3. 查询数据 区块 / 交易 / 收据 get_block / get_transaction 区块查询 get_block('latest') get_block(block_number) full_transactions=True/False 交易查询 get_transaction(tx_hash) get_transaction_receipt() from/to/value/gasPrice 核心流程:环境 → 连接 → 查询 每一步都做异常检查,避免生产环境翻车

这张图把本章的知识点串起来了。你照着这个流程走,基本不会迷路。

4.7 本章小结

这一章我们干了三件事:

  • 装环境:虚拟环境 + pip install web3
  • 连节点:三种Provider,推荐WebSocket做监控
  • 查数据:区块、交易、收据,一个不落

说实话,Web3.py的API设计得很Pythonic。你只要记住几个核心方法,剩下的可以举一反三。我在项目中,90%的查询需求都靠这几个方法搞定。

下一章,我们会把这些查询能力组合起来,搭建一个真正的监控系统。到时候,你会看到这些基础操作如何变成强大的自动化工具。


专注资料整理