概述
官方文档:https://web3py.readthedocs.io/en/stable/overview.html
配置
通过pip安装完web3后,除了默认值之外,你还需要指定provider和一些中间件。
providers
providers是web3连接区块链的方式。web3库有以下内置几个providers:
- web3.IPCProvider:用于连接基于ipc套接字的 JSON-RPC 服务器
- web3.HTTPProvider:用于连接基于http和https的 JSON-RPC 服务器
- web3.WebsockerProvider:用于连接基于ws和wss的websocker的 JSON-RPC服务器
>>> from web3 import Web3
## IPCProvider:
>>> w3 = Web3(Web3.IPCProvider('./path/to/geth.ipc'))
## HTTPProvider:
>>> w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
## WebsocketProvider:
>>> w3 = Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))
>>> w3.isConnected()
True
更多信息(如连接到远程节点;provider自动检测;使用测试provider)参考(https://web3py.readthedocs.io/en/stable/providers.html#providers)
中间件
可以通过中间件配置web3实例。
就像剥洋葱一样,每一层中间件都可能影响入参request 和 出参。
该文档包含了一些可视化的东西。
有些中间件是默认加载的。
你可以 添加/注入/替换 任何一个中间件,也可以 禁用/删除/清除 任何一个中间件。
你的keys
想要进行交易,那么 私钥 必不可少。你 密钥的安全方式 将决定你在web3中如何 创建交易 和 发送交易。
像Geth这种的本地节点,会帮你管理你的密钥。你可以通过使用 web3.eth.account 来引用你的密钥。
像Infura这样的托管(远程)节点,不知道你的密钥是多少。这种情况下,你需要使用你本地的私钥 来 签署事务。
关于密钥之间的区别,可参考这里
基础api
Web3类包含很多实用的函数。
编码解码函数
- Web3.is_encodable()
- Web3.toBytes()
- Web3.toHex()
- Web3.toInt()
- Web3.toJSON()
- Web3.toText()
地址函数
- Web3.isAddress()
- Web3.isChecksumAddress()
- Web3.toChecksumAddress()
货币换算
- Web3.fromWei()
- Web3.toWei()
加密哈希
- Web3.keccak()
- Web3.solidityKeccak()
eth的api
与以太坊交互的最常用的api可以在web3.eth命名空间下找到。完整示例参考
获取数据
查看帐户余额(getBalance)、事务(getTransaction)和块数据(getBlock)是Web3.py中最常见的起点。
- web3.eth.getBalance()
- web3.eth.getBlock()
- web3.eth.getBlockTransactionCount()
- web3.eth.getCode()
- web3.eth.getProof()
- web3.eth.getStorageAt()
- web3.eth.getTransaction()
- web3.eth.getTransactionByBlock()
- web3.eth.getTransactionCount()
- web3.eth.getUncleByBlock()
- web3.eth.getUncleCount()
执行交易
最常用的有 sendTransaction 或者 signTransaction 和 sendRawTransaction 的组合。
如果与智能合约进行交互,则存在专用的API。参考
- web3.eth.sendTransaction()
- web3.eth.signTransaction()
- web3.eth.sendRawTransaction()
- web3.eth.replaceTransaction()
- web3.eth.modifyTransaction()
- web3.eth.waitForTransactionReceipt()
- web3.eth.getTransactionReceipt()
- web3.eth.sign()
- web3.eth.signTypedData()
- web3.eth.estimateGas()
- web3.eth.generateGasPrice()
- web3.eth.setGasPriceStrategy()
合约
合约最常用是:在已部署的合约上部署和执行功能。
部署合约需要先编译,这个编译不一定要在本地完成,可以使用:
一旦合约对象被实例化了,可调用构造函数contructor的transact方法来发布一个合约实例,如下:
## 声明合约对象
ExampleContract = w3.eth.contract(abi=abi, bytecode=bytecode)
## 发布合约,得到交易hash
tx_hash = ExampleContract.constructor().transact()
## 发起等待交易,得到等待交易的对象
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
## 等待交易的地址
tx_receipt.contractAddress
一旦加载到合约对象中,已发布的合约对象的方法在w3.eth命名空间中可用,具体表现如下:
## 根据待交易的地址和abi获取合约对象
deployed_contract = w3.eth.contract(address=tx_receipt.contractAddress, abi=abi)
deployed_contract.functions.myFunction(42).transact()
如果你想从合约中获取数据(或者在本地查看事务结果,而不是在网络上执行),你可以使用:
ContractFunction.call方法
或者
ContractCaller方法
deployed_contract.functions.getMyValue().call()
## 或者
deployed_contract.caller().getMyValue()
想要了解更多,参考 https://web3py.readthedocs.io/en/stable/contracts.html#contracts
- web3.eth.contract()
- Contract.address
- Contract.abi
- Contract.bytecode
- Contract.bytecode_runtime
- Contract.functions
- Contract.events
- Contract.fallback
- Contract.constructor()
- Contract.encodeABI()
- web3.contract.ContractFunction
- web3.contract.ContractEvents
日志和过滤器
当 新块被挖出 或者 合约发出特定的事件 时,你想做出一些反应,可以用web3过滤器。
## 刷选新块
new_filter = web3.eth.filter('latest')
## 合同事件(名为“MyEvent”)过滤器
new_filter = deployed_contract.events.MyEvent.createFilter(fromBlock='latest')
## 检索结果过滤
new_filter.get_all_entries()
new_filter.get_new_entries()
想要了解更多,参考 https://web3py.readthedocs.io/en/stable/filters.html#filtering
- web3.eth.filter()
- web3.eth.getFilterChanges()
- web3.eth.getFilterLogs()
- web3.eth.uninstallFilter()
- web3.eth.getLogs()
- Contract.events.your_event_name.createFilter()
- Contract.events.your_event_name.build_filter()
- Filter.get_new_entries()
- Filter.get_all_entries()
- Filter.format_entry()
- Filter.is_valid_entry()
Net API
一些基本的网络属性,可用web3.net查看
- web3.net.listening
- web3.net.peer_count
- web3.net.version
ethPM
- 打包合同,以重复使用
- 使用另一个受信任的注册表中的合同
想要了解更多,参考:https://web3py.readthedocs.io/en/stable/ethpm.html#ethpm
ENS
Ethereum Name Service (ENS) 提供了人类可读地址的结构。如:你可以把资金发送到ethereumfoundation.eth。web3支持ens,详细参考:https://web3py.readthedocs.io/en/stable/ens_overview.html#ens-overview
快速开始
官方网站:https://web3py.readthedocs.io/en/stable/quickstart.html
安装
使用pip命令安装:
$ pip install web3
使用
该库依赖于以太坊节点的连接,如:本地开发的时候,启动的一个ganache-cli。
我们称这些连接为providers,并且有很多方式可以去配置他们。具体参考(https://web3py.readthedocs.io/en/stable/providers.html#providers)
provider: 本地Geth节点
显示指定连接方式
显示的连接本地Geth节点有三种方式,分别如下
IPC连接
最安全的
from web3 import Web3
w3 = Web3(Web3.IPCProvider('./path/to/geth.ipc'))
HTTP连接
端口8545
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
websocket连接
端口8546
from web3 import Web3
w3 = Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))
隐式自动连接
如果你坚持使用 默认端口 或者 本地IPC文件,可以自动检测provider。参考:(https://web3py.readthedocs.io/en/stable/providers.html#automatic-provider)
from web3.auto import w3
查看连接状态
w3.isConnected()
provider: Infura
在实际生产环境中,要与 以太坊区块链 交互的最快的方式,是使用 远程节点,如:Infura。你可以通过指定节点(当你创建了一个账户后,有Infura提供)与远程节点连接,如:
显示连接
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/<infura-project-id>'))
隐式连接
先将你的Infura项目id设置为环境变量
$ export WEB3_INFURA_PROJECT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
from web3.auto.infura import w3
w3.eth.blockNumber
获取区块链信息
可以使用w3与以太坊区块链进行交互。
web3可以帮助你:
- 读取块数据
- 签署
- 发送事务
- 合约部署
- 合约交互
- 等等...
使用w3.eth做很多事情
如果你想 进入合约/部署合约,请查看(https://web3py.readthedocs.io/en/stable/contracts.html#contracts)