欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Web3.py 学习(一)

程序员文章站 2022-07-07 13:31:30
...

一、什么是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 学习(一)
       这里提示输入一个数字和一个字符串,返回一个整数。注意,这个字符串是指以太坊上的单位,比如etherGwei等。

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

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

       期待下一次的学习。