关于 web3-py
web3-py 是供 Python 应用和脚本与 Ethereum 交互的库,可连接节点并查询链上数据、调用合约、管理账户和处理交易。
主要功能
- 01通过 HTTP、WebSocket 或 IPC 连接
- 02查询余额、区块和事件
- 03使用 ABI 与合约交互
- 04管理账户并签署交易
- 05估算交易 Gas
适用场景
- 01读取 Ethereum 账户余额
- 02调用智能合约函数
- 03从 Python 发送已签名交易
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ alphaonedev/ openclaw-graph --skill web3-py安装后在 Claude Code 中输入/web3-py确认已加载。
详细介绍
web3-py
用途
web3-py 是一个用于通过 Web3 协议与 Ethereum 区块链交互的 Python 库。它支持以编程方式访问区块链数据、智能合约和交易。
适用场景
构建需要查询 Ethereum 数据、部署智能合约或处理交易的 Python 应用时,请使用此库。适用于 dApp、区块链分析,或与 Ethereum 节点交互的自动化脚本。
主要功能
- 通过 HTTP、WebSocket 或 IPC 提供程序连接到 Ethereum 节点。
- 管理账户、签署交易并处理 Gas 估算。
- 使用 ABI 定义与智能合约交互。
- 查询区块链状态,包括余额、区块和事件。
- 支持 Binance Smart Chain 等兼容 Ethereum 的链。
使用模式
始终导入 web3-py,并使用提供程序初始化一个 Web3 实例。对于敏感密钥,请使用环境变量,例如在 shell 中设置 INFURA_API_KEY。使用 web3.async 处理异步操作,以提升性能。在生产环境中,使用 try-except 代码块封装调用,并使用可靠的提供程序 URL。
常用命令/API
- 获取账户余额:使用
web3.eth.get_balance(address)。示例:from web3 import Web3 w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/' + os.getenv('INFURA_API_KEY'))) balance = w3.eth.get_balance('0xYourAddress') - 发送交易:使用
w3.eth.send_transaction(transaction)。示例:tx = {'from': account.address, 'to': '0xRecipient', 'value': w3.to_wei(1, 'ether')} signed_tx = w3.eth.account.sign_transaction(tx, private_key=os.getenv('ETH_PRIVATE_KEY')) tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) - 调用智能合约函数:使用
contract.functions.myFunction().call()。示例:contract = w3.eth.contract(address='0xContractAddress', abi=contract_abi) result = contract.functions.balanceOf('0xAddress').call() - 估算 Gas:使用
w3.eth.estimate_gas(transaction)。传入包含 'from'、'to' 和 'data' 键的字典。
集成说明
使用 pip install web3 安装 web3-py,即可将其集成到项目中。使用类似 https://mainnet.infura.io/v3/$INFURA_API_KEY 的 URL 配置提供程序,以连接 Infura。使用环境变量存储密钥:例如,使用 os.getenv('INFURA_API_KEY') 访问 API。对于本地节点,请使用 IPC:Web3(Web3.IPCProvider('/path/to/geth.ipc'))。确保与 Ethereum 版本兼容;在交易中指定链 ID,以防止重放攻击。在生产环境部署前,先在 Ganache 等沙盒中测试集成。
错误处理
使用 try-except 处理 ConnectionError 等连接错误,例如:
try:
w3.eth.get_block('latest')
except web3.exceptions.ConnectionError:
print("Node unreachable; check provider URL and network status.")
对于交易失败,请捕获 ValueError,以处理资金不足或 Gas 问题:
try:
tx_hash = w3.eth.send_transaction(tx)
except ValueError as e:
if 'insufficient funds' in str(e):
raise Exception("Add funds to account before retrying.")
使用前请通过 w3.is_address(address) 等方式验证地址等输入。记录包含错误码等详细信息的错误日志(例如提供程序返回的 RPC 错误),以便调试。
具体使用示例
- 查询代币余额:若要获取 Ethereum 主网上某个地址的 ERC-20 余额,请使用 Infura 初始化 Web3,加载代币合约,然后调用 balanceOf 函数。在脚本中的示例用法:设置
INFURA_API_KEY环境变量,然后运行上文“常用命令/API”中调用合约的代码片段。 - 部署简单的智能合约:将 Solidity 合约编译为 ABI 和字节码,然后使用
w3.eth.contract进行部署。示例:在代码中创建合约实例,并发送包含字节码的交易;处理 Gas 限制的方式参见 send_transaction 示例。
图关系
- 相关集群:blockchain(例如,与其他区块链工具共享功能)。
- 关联标签:web3(直接 API 交互)、python(基于 Python 实现)、ethereum(专用于 Ethereum 生态系统)。
- 链接到:smart-contracts(通过合约处理功能),如嵌入提示所示。