Web3.py 学习(一)

一、什么是Web3.py

       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

       我以前已经安装过了web3.py,所以就直接按照文档中的应用进行测试了。没想到会遇到一些问题,记录如下,以供出现同样问题的读者参考。

2.1 设置环境变量

       打开终端,默认就在~目录,运行 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来使刚才的环境变量设置生效。

2.2 解决各种错误

       在终端中执行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

       等待升级完成。好了,这下没有问题了。

2.3 连接以太坊节点

       在终端重新运行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

       熟悉基础API时我建议大家不要在终端执行python3来进入解释器,而是运行IDLE程序。因为在IDLE里,API是有提示的,如下图:
Web3.py 学习(一)_第1张图片
       这里提示输入一个数字和一个字符串,返回一个整数。注意,这个字符串是指以太坊上的单位,比如etherGwei等。

       文档中列出的基础API除了检查是否可编码外,平常开发中都会经常使用。

       Web3.py第一章总览就学习结束了。本次学习内容不多,重点是掌握web3.py的安装和连接以太坊节点的方法。同时也要对基础的API有一些了解,毕竟要经常使用的。

       期待下一次的学习。

你可能感兴趣的:(以太坊)