web3.py 入门实战:用 Python 连接以太坊、配置 Provider 与构建链上应用的完整指南
发布时间:2026/10/12 1:52:41 锦皓数字建站

Web3区块链【免费下载链接】web3.pyA python interface for interacting with the Ethereum blockchain and ecosystem.项目地址https://gitcode.com/gh_mirrors/we/web3.py点击查看免费下载web3.py 是 Ethereum 官方维护的 Python 库用于与以太坊区块链及生态进行交互是构建去中心化应用dapp、发送交易、部署与调用智能合约、读取区块数据的核心工具。本文以项目根目录 README.md 为主线结合仓库内 docs/quickstart.rst、docs/overview.rst、docs/providers.rst 等官方文档与web3包源码系统讲解安装方式、Provider 连接机制、首次链上查询、中间件体系与交易流程让你读完即可独立上手开发。一、web3.py 是什么web3.py 为开发者提供了一套完整的 Python 接口覆盖以太坊交互的主要场景读取区块与账户数据、签名与发送交易、部署和调用智能合约、订阅链上事件等。根据 README.md 的定位说明它的典型用途包括构建去中心化应用dapps与智能合约交互部署、读取、执行函数读取区块、余额、交易等链上数据探索更多以太坊生态能力如 ENS 域名解析。仓库 setup.py 中给出的官方描述为web3: A Python library for interacting with Ethereum项目当前版本为8.0.0-beta.2要求Python 3.10 及以上版本python_requires3.10, 4采用 MIT 许可证。从 web3/init.py 的导出清单可以看到库的核心公开 API 面貌入口对象Web3同步与AsyncWeb3异步以及账户工具AccountProvider 家族HTTPProvider、AsyncHTTPProvider、IPCProvider、AsyncIPCProvider、WebSocketProvider、EthereumTesterProvider、AsyncEthereumTesterProvider、AutoProvider以及基础类BaseProvider、JSONBaseProvider、PersistentConnectionProvider。其中同步/异步双轨 API 是 web3.py 的一大特点Web3用于常规同步调用AsyncWeb3配合await用于高并发异步场景。二、安装与运行环境准备根据 README.md安装非常简单python -m pip install web3为了更好的实践体验建议在独立虚拟环境中安装官方 docs/quickstart.rst 也强调优先使用 virtualenv避免依赖冲突。可选扩展包extras仓库 setup.py 定义了若干 extras可按需安装extras用途主要依赖tester使用EthereumTesterProvider进行本地测试/原型开发eth-tester[py-evm]、py-gethdev开发者环境含构建、文档、测试工具build、sphinx、pytest、tox、pre-commit、mypy等docs构建 Sphinx 文档sphinx、sphinx_rtd_theme、towncriertest运行测试套件pytest、pytest-asyncio、hypothesis、flaky等例如测试环境python -m pip install web3[tester]开发环境完整安装官方 docs/contributing.rst 中推荐python -m pip install -e .[dev] pre-commit install核心依赖web3.py建立在以太坊 Python 生态的多个底层库之上见 setup.py 的install_requireseth-abiABI 编解码、eth-account账户与签名、eth-utils工具函数、hexbytes十六进制字节对象、requestsHTTP Provider 底层、aiohttp异步 HTTP、websocketsWebSocket Provider 底层、pydantic类型校验等。环境变量建议docs/quickstart.rst 提示开发环境建议设置PYTHONWARNINGSdefault否则部分弃用警告deprecation warning不会显示。三、认识 Providerweb3.py 如何连接以太坊web3.py 本身不包含以太坊节点它需要连接一个节点本机或远程才能工作。这种连接在 web3.py 中称为ProviderProvider 负责生成 JSON-RPC 请求并通过 HTTP、WebSocket 或 IPC socket 将请求提交给节点、取回响应参见 docs/providers.rst。内置 Provider 一览根据 web3/providers/init.py 的导出与 docs/overview.rst 的说明库内置以下 ProviderHTTPProvider连接 http/https 的 JSON-RPC 服务器同步AsyncHTTPProvider上述服务器的异步版本IPCProvider连接 IPC socket 的 JSON-RPC 服务器同步AsyncIPCProvider通过持久连接异步连接 IPC socketWebSocketProvider通过持久连接异步连接 WebSocket 服务器EthereumTesterProvider/AsyncEthereumTesterProvider集成eth-tester的本地测试 ProviderAutoProvider自动探测可用 Provider默认。如何选择连接方式docs/providers.rst 给出了实用的决策建议IPC本地文件系统 socket最快且最安全适合与节点同机部署WebSocket支持远程速度优于 HTTP适合跨机器连接HTTP兼容性最好绝大多数节点都支持。选型原则能与节点同机运行就选 IPC必须连接异机节点就选 WebSocket节点不支持 WebSocket 时退而用 HTTP。通过环境变量指定 Provider另一种零代码方式在启动脚本前设置WEB3_PROVIDER_URI环境变量web3.py 会优先尝试该 Provider。支持的格式docs/providers.rstfile:///path/to/node/rpc-json/file.ipc http://192.168.1.2:8545 https://node.ontheweb.com ws://127.0.0.1:8546底层实现在 web3/providers/auto.pyload_provider_from_environment()读取该变量load_provider_from_uri()根据 scheme 分派——file对应IPCProviderhttp/https对应HTTPProvider。四、快速上手三种典型连接方式1. 测试环境EthereumTesterProvider如果只是学习或快速原型验证官方推荐使用eth-tester测试 Provider它自带预充值测试以太币的账户且每笔交易会立即被打包进区块无需真实节点。需要先安装扩展依赖python -m pip install web3[tester]然后代码取自 docs/quickstart.rst from web3 import Web3, EthereumTesterProvider w3 Web3(EthereumTesterProvider()) w3.is_connected() TrueEthereumTesterProvider的实验性定位与构造参数ethereum_tester、api_endpoints详见 docs/providers.rst其默认 RPC 端点定义在 web3/providers/eth_tester/defaults.py。2. 本地节点IPC / HTTP / WebSocket运行自己的以太坊节点如 Geth是官方建议的最安全方式。Geth 默认在8545端口提供 HTTP 服务、8546端口提供 WebSocket 服务。连接示例 from web3 import Web3, AsyncWeb3 # IPCProvider w3 Web3(Web3.IPCProvider(./path/to/filename.ipc)) w3.is_connected() True # HTTPProvider w3 Web3(Web3.HTTPProvider(http://127.0.0.1:8545)) w3.is_connected() True # AsyncHTTPProvider w3 AsyncWeb3(AsyncWeb3.AsyncHTTPProvider(http://127.0.0.1:8545)) await w3.is_connected() True # -- 持久连接 Provider -- # # WebSocketProvider w3 await AsyncWeb3(AsyncWeb3.WebSocketProvider(ws://127.0.0.1:8546)) await w3.is_connected() True # AsyncIPCProvider w3 await AsyncWeb3(AsyncWeb3.AsyncIPCProvider(./path/to/filename.ipc)) await w3.is_connected() True不指定ipc_path时IPCProvider/AsyncIPCProvider会按操作系统使用默认路径docs/providers.rstLinux / FreeBSD~/.ethereum/geth.ipcmacOS~/Library/Ethereum/geth.ipcWindows\\.\pipe\geth.ipc3. 远程节点最快上手的方式是使用远程节点服务商提供的端点把端点 URL 直接传给 Provider from web3 import Web3, AsyncWeb3 w3 Web3(Web3.HTTPProvider(https://your-provider-url)) w3 AsyncWeb3(AsyncWeb3.AsyncHTTPProvider(https://your-provider-url)) w3 await AsyncWeb3(AsyncWeb3.WebSocketProvider(wss://your-provider-url))远程场景下节点不掌握你的私钥交易需要在本地签名后发送详见后文交易章节。五、Provider 配置深入HTTPProvider构造签名docs/providers.rstHTTPProvider(endpoint_uri, request_kwargs{}, sessionNone, exception_retry_configurationExceptionRetryConfiguration())endpoint_uriRPC 端点完整 URI如https://localhost:854580/443 端口可省略request_kwargs透传给每次 HTTP POST 请求的关键字参数常用于设置超时session自定义requests.Session可调整连接池大小exception_retry_configuration异常重试配置实例设为None可禁用重试。超时与连接池配置示例 from web3 import Web3 w3 Web3(Web3.HTTPProvider(http://127.0.0.1:8545, request_kwargs{timeout: 60})) import requests adapter requests.adapters.HTTPAdapter(pool_connections20, pool_maxsize20) session requests.Session() session.mount(http://, adapter) session.mount(https://, adapter) w3 Web3(Web3.HTTPProvider(http://127.0.0.1:8545, sessionsession))注意同一进程内同一 URL 建议只创建一个HTTPProvider底层会复用 TCP/IP 连接不同 URL 的多个 Provider 则互不影响。AsyncHTTPProvider异步 HTTP Provider 底层基于aiohttp可通过cache_async_session()传入自定义aiohttp.ClientSession from aiohttp import ClientSession from web3 import AsyncWeb3, AsyncHTTPProvider w3 AsyncWeb3(AsyncHTTPProvider(endpoint_uri)) custom_session ClientSession() await w3.provider.cache_async_session(custom_session) # 结束时断开 w3.provider.disconnect()持久连接 ProviderWebSocketProvider 与 AsyncIPCProvider这两个 Provider 继承自PersistentConnectionProvider基类web3/providers/persistent/init.py支持eth_subscription订阅、异步收发与自动重连。基类可配置项docs/providers.rst参数默认值说明request_timeout50.0发送请求并等待响应的超时秒subscription_response_queue_size500订阅响应的暂存队列大小silence_listener_task_exceptionsFalse是否静默监听任务抛出的异常max_connection_retries5初始化连接时的最大重试次数request_information_cache_size500请求信息暂存缓存大小用于按原始请求处理响应WebSocketProvider(endpoint_uri, websocket_kwargs{}, use_text_framesFalse)额外支持use_text_framesTrue时以文本帧发送数据兼容不支持二进制通信的服务器。推荐使用async with上下文管理器建立连接退出时自动关闭 import asyncio from web3 import AsyncWeb3 from web3.providers.persistent import WebSocketProvider async def subscription_example(): ... async with AsyncWeb3(WebSocketProvider(ws://127.0.0.1:8546)) as w3: ... subscription_id await w3.eth.subscribe(newHeads) ... async for response in w3.socket.process_subscriptions(): ... print(f{response}\n) ... if some_condition: ... await w3.eth.unsubscribe(subscription_id) ... break ... latest_block await w3.eth.get_block(latest) ... print(fLatest block: {latest_block}) asyncio.run(subscription_example())连接后的核心交互接口是w3.socketPersistentConnection实例其 API 包括subscriptions当前活跃订阅、process_subscriptions()异步迭代订阅消息、send()/recv()/make_request()原始收发。官方建议优先使用各模块的标准方法如w3.eth.get_block(latest)避免直接调用原始收发接口——因为原始响应不经过 formatter 格式化和中间件处理。快捷 Providergethdev 与 AutoProvider连接本地geth --devProof of Authority开发实例时可直接使用快捷入口web3/auto/gethdev.py它默认注入ExtraDataToPOAMiddleware中间件 from web3.auto.gethdev import w3 w3.is_connected() True from web3.auto.gethdev import async_w3 await async_w3.provider.connect() await async_w3.is_connected() True此外不显式传 Provider 创建Web3()时会默认使用AutoProviderweb3/providers/auto.py它按顺序尝试WEB3_PROVIDER_URI环境变量 →IPCProvider→HTTPProvider找到第一个可连接的即作为活跃 Provider。六、第一次链上查询读取区块信息连接建立后w3实例即可访问以太坊数据。最典型的入门操作是读取最新区块完整示例见 docs/quickstart.rst w3.eth.get_block(latest) {difficulty: 1, gasLimit: 6283185, gasUsed: 0, hash: HexBytes(0x53b983fe73e16f6ed8178f6c0e0b91f23dc9dad4cb30d0831f178291ffeb8750), logsBloom: HexBytes(0x0000...), miner: 0x0000000000000000000000000000000000000000, number: 0, parentHash: HexBytes(0x0000...), receiptsRoot: HexBytes(0x56e8...), size: 622, stateRoot: HexBytes(0x1f5e...), timestamp: 0, totalDifficulty: 1, transactions: [], transactionsRoot: HexBytes(0x56e8...), uncles: []}返回结果是AttributeDict由默认中间件AttributeDictMiddleware提供见 web3/middleware/init.py它像dict一样支持键访问同时允许属性访问且不可修改docs/web3.eth.rst block w3.eth.get_block(latest) block[number] # 键访问 0 block.number # 属性访问 0 block.number 1 # 会抛出 TypeError数据不可变web3.eth命名空间是最常用的 API 集合web3/eth/init.py常用能力包括读取数据get_balance、get_transaction、get_block、get_code、get_storage_at、get_transaction_count、get_proof等发送交易send_transaction、sign_transaction、send_raw_transaction、replace_transaction、wait_for_transaction_receipt、estimate_gas等事件与过滤subscribe、filter、get_logs、get_filter_changes、uninstall_filter等常用属性block_number、gas_price、max_priority_fee、accounts、syncing、default_account、default_block默认latest。七、Web3 基础工具 APIWeb3/BaseWeb3类web3/main.py内置了一批高频工具方法覆盖编码、地址、单位换算与哈希场景编码解码to_bytes()、to_hex()、to_int()、to_text()、to_json()、is_encodable()地址工具is_address()、is_checksum_address()、to_checksum_address()校验和地址货币换算to_wei(number, unit)、from_wei(number, unit)——例如w3.to_wei(3, ether)返回 3 ETH 对应的 Wei密码学哈希keccak()支持text、hexstr、bytes、int多种入参、solidity_keccak()。八、中间件Middleware体系中间件是 web3.py 扩展与定制请求的关键机制其思想是洋葱模型请求从最外层进入、层层经过中间件到达 Provider节点响应再按相反顺序返回docs/middleware.rst。中间件可以修改请求与响应、提前返回结果甚至让请求不触达 Provider。默认已启用的中间件web3/middleware/init.py包括AttributeDictMiddleware属性字典、ValidationMiddleware参数校验、GasPriceStrategyMiddlewaregas 价格策略、ENSNameToAddressMiddlewareENS 域名解析、FormattingMiddlewareBuilder数据格式化、PythonicMiddleware等。运行时可通过w3.middleware_onion调整docs/overview.rstadd(middleware, nameNone)添加到最外层inject(middleware, nameNone, layerNone)注入到指定层replace(...)/remove(...)/clear(...)替换、移除、清空。典型用法——给指定账户自动签名交易docs/transactions.rstfrom web3.middleware import SignAndSendRawMiddlewareBuilder import os # 注意切勿把私钥写进代码请使用环境变量 pk os.environ.get(PRIVATE_KEY) acct2 w3.eth.account.from_key(pk) w3.middleware_onion.inject(SignAndSendRawMiddlewareBuilder.build(acct2), layer0) # 之后来自 acct2 的交易会在中间件层自动签名 tx_hash w3.eth.send_transaction({ from: acct2.address, value: 3333333333, to: some_address, })中间件的组合逻辑见 web3/middleware/init.py 中的combine_middleware与async_combine_middleware它们按逆序把各中间件包装在 provider 请求函数外层。九、发送交易两种主流路径docs/transactions.rst 给出了发送交易的决策树离线签名 / 发送预签名交易使用sign_transaction()send_raw_transaction()固定账户高频发送配置SignAndSendRawMiddlewareBuilder中间件后用send_transaction()其他情况先用w3.eth.account.from_key(pk)加载账户再send_transaction()。测试环境下的快捷发送EthereumTesterProvider的测试账户由 eth-tester 自动签名from web3 import Web3, EthereumTesterProvider w3 Web3(EthereumTesterProvider()) acct1 w3.eth.accounts[0] # eth-tester 预置测试以太币 some_address 0x0000000000000000000000000000000000000000 tx_hash w3.eth.send_transaction({ from: acct1, to: some_address, value: 123123123123123 }) tx w3.eth.get_transaction(tx_hash) assert tx[from] acct1真实网络本地签名后发送# 加载账户私钥从环境变量读取 acct w3.eth.account.from_key(os.environ[PRIVATE_KEY]) # 方式一send_transaction配合签名中间件 tx_hash w3.eth.send_transaction({ from: acct.address, to: some_address, value: w3.to_wei(1, ether), }) # 方式二sign send_raw_transaction离线签名 signed acct.sign_transaction({ from: acct.address, to: some_address, value: w3.to_wei(1, ether), nonce: w3.eth.get_transaction_count(acct.address), gas: 21000, gasPrice: w3.eth.gas_price, }) tx_hash w3.eth.send_raw_transaction(signed.raw_transaction)发送后可用w3.eth.wait_for_transaction_receipt(tx_hash)等待并获取交易回执。十、智能合约、ENS 与批量请求合约部署与调用web3.py 支持部署、读取、执行已部署合约docs/overview.rst。部署需要先编译合约拿到 ABI 与 bytecodeExampleContract w3.eth.contract(abiabi, bytecodebytecode) tx_hash ExampleContract.constructor().transact() tx_receipt w3.eth.wait_for_transaction_receipt(tx_hash) tx_receipt.contractAddress # 部署后的合约地址 # 加载已部署合约并调用函数 deployed_contract w3.eth.contract(addresstx_receipt.contractAddress, abiabi) deployed_contract.functions.myFunction(42).transact() # 只读调用本地执行不上链 deployed_contract.functions.getMyValue().call() # 42 deployed_contract.caller().getMyValue() # 42ContractCaller 简洁写法合约对象的关键 APIContract.address、Contract.abi、Contract.bytecode、Contract.functions、Contract.events、Contract.constructor()、Contract.encode_abi()等。仓库内置了多份 Solidity 测试合约源码供参考见 web3/_utils/contract_sources/。ENS 域名解析web3.py 内置ens模块docs/ens_overview.rst可将ethereum.eth这类可读域名解析为地址。w3.ens实例按需自动创建基于ENS.from_web3(w3)例如 w3.ens.address(ethereum.eth) 0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe也支持独立创建from ens.auto import ns自动探测或ENS(provider)、ENS.from_web3(w3)异步场景使用AsyncENS。批量请求JSON-RPC 支持批量请求可用一个请求携带多个调用以减少与节点的往返docs/web3.main.rstwith w3.batch_requests() as batch: batch.add(w3.eth.get_block(6)) batch.add(w3.eth.get_block(4)) batch.add(w3.eth.get_block(2)) responses batch.execute() assert len(responses) 3十一、继续深入仓库文档地图README 指向的官方文档站点内容在本仓库 docs/ 目录下均有对应源文件可按需深读docs/quickstart.rst5 分钟上手教程docs/overview.rst全功能概览docs/providers.rst各 Provider 完整配置docs/transactions.rst交易发送决策树与示例docs/middleware.rst中间件体系详解docs/web3.eth.rstweb3.ethAPI 全量参考docs/ens_overview.rstENS 使用指南docs/release_notes.rst版本变更日志docs/migration.rst跨大版本迁移指南如 v6 → v7 的 WebSocketProvider 演进。仓库测试套件位于 tests/例如 tests/core/web3-module/test_import_and_version.py 验证了web3.__version__的存在与类型集成测试在 tests/integration/ 下含 Geth HTTP/IPC/WS 场景。若要参与贡献可阅读根目录 CONTRIBUTING.md 与 docs/contributing.rst。至此你已经掌握了 web3.py 的安装、Provider 选型与配置、首次链上查询、中间件机制和交易发送全流程。下一步建议直接运行一个EthereumTesterProvider示例再逐步切换到本地 Geth 或远程节点把本文的代码片段改造成自己的第一个 dapp 应用。赞分享Web3区块链【免费下载链接】web3.pyA python interface for interacting with the Ethereum blockchain and ecosystem.项目地址https://gitcode.com/gh_mirrors/we/web3.py点击查看免费下载相关推荐为什么选择LLMs-Zero-to-Hero初学者到大模型专家的快速通道 为什么选择LLMs Zero to Hero初学者到大模型专家的快速通道 LLMs Zero to Hero是一个专为 大模型初学者 设计的开源项目提大模型人工智能预训练示例工程教程TabPFN-3与scikit-learn无缝集成5个实际案例展示其强大功能TabPFN 3与scikit learn无缝集成5个实际案例展示其强大功能 TabPFN 3作为一款革命性的表格预测基础模型通过其与scikit learNewton与Python集成脚本控制与自动化仿真的完整指南Newton与Python集成脚本控制与自动化仿真的完整指南 Newton是一款基于NVIDIA Warp构建的开源GPU加速物理仿真引擎专为机器人学家和仿物理引擎机器人上一篇RVC变声器用10分钟语音训练出你的第一个AI音色模型下一篇Windows 11任务栏拖放功能终极修复指南如何快速恢复高效操作体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。