Web3.py is a python library for interacting with Ethereum. Its API is derived from the Web3.js Javascript API and should be familiar to anyone who has used web3.js.
Web3.py是连接以太坊的python库,它的API从web3.js中派生而来。如果你用过web3.js,你会对它的API很熟悉。但惭愧的是,作为一个以太坊上Dapp的开发者,我几乎没有直接使用过web3.js,也没有看过它的API。
虽然我以前在本地环境(比如Ganache)中开发Dapp时已经使用过web3.py,但只是很简单的应用,并没有系统的学习过(部分原因是我也没有系统学过python,只是看了大约10个小时文档)。今天把web3.py的官方文档打开,准备系统的学习一下。
笔者的学习环境为 Mac OS + python 3.7.3。
我以前已经安装过了web3.py,所以就直接按照文档中的应用进行测试了。没想到会遇到一些问题,记录如下,以供出现同样问题的读者参考。
打开终端,默认就在~
目录,运行 vim .bash_profile
,按i
插入,在最后一行增加:
export WEB3_INFURA_PROJECT_ID=your_infura_key
这其中your_infura_key
是连接infura节点所需要的key。如果没有,去https://infura.io/ 新建一个工程就可以得到了。
按下esc
,接着是:
,然后wq
保存退出。再运行source .bash_profile
来使刚才的环境变量设置生效。
在终端中执行python3
,进入解释器,或者运行IDLE
应用程序也可。执行以下代码:
>>> from web3.auto.infura import w3
>>> w3.eth.blockNumber
然而,几秒的等待后,报如下错误:
certificate verify failed: unable to get local issuer certificate
Google了一下,是因为python3.6和3.7不再依赖于Mac OS的openSSL,它使用自己的openSSL,解决办法有两种:
1、运行python自带的安装程序
cd /Applications/Python\ 3.7/
./Install\ Certificates.command
2、安装certifi
包
pip install certifi
其实这两种方法是等效的。好了,这个问题就是这样解决的。
重新执行脚本来获取当前块高度,然而又报错了:
websockets.exceptions.InvalidStatusCode: Status code not 101: 401
继续Google,是讲websockets
这个库6.0和7.0有区别。看来我的库是6.0的,这个好办,升级它:
pip install --upgrade websockets
成功的将websockets
从6.0升级到了8.0。然而升级的过程中又提示:
ERROR: web3 4.8.1 has requirement websockets<7.0.0,>=6.0.0,
but you'll have websockets 8.1 which is incompatible.
无语了,看来得继续升级我的web3.py。运行:
pip install --upgrade web3
等待升级完成。好了,这下没有问题了。
在终端重新运行phthon3
,进行解释器,然后执行:
>>> from web3.auto.infura import w3
>>> w3.eth.blockNumber
短时间的等待后会输出当前区块高度,测试的时候为:9462097。
查看最新区块详细信息:
>>> w3.eth.getBlock('latest')
很快就会有输出,显示当前区块的一些信息,连接以太坊节点的测试通过。
平常我们使用本地开发环境(Ganache)时,怎么连接本地以太坊呢?文档中给出了一种方法,使用HTTPProvider
:
>>> w3 = Web3(HTTPProvider('http://localhost:8545'))
不过我们可以不使用这个方法,推荐使用另一种:
>>> from web3.auto import w3
>>> w3.isConnected()
True
>>> w3.eth.blockNumber
46
>>>
熟悉基础API时我建议大家不要在终端执行python3
来进入解释器,而是运行IDLE
程序。因为在IDLE
里,API是有提示的,如下图:
这里提示输入一个数字和一个字符串,返回一个整数。注意,这个字符串是指以太坊上的单位,比如ether
、Gwei
等。
文档中列出的基础API除了检查是否可编码外,平常开发中都会经常使用。
Web3.py第一章总览就学习结束了。本次学习内容不多,重点是掌握web3.py的安装和连接以太坊节点的方法。同时也要对基础的API有一些了解,毕竟要经常使用的。
期待下一次的学习。