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是有提示的,如下圖:
在這裏插入圖片描述
       這裏提示輸入一個數字和一個字符串,返回一個整數。注意,這個字符串是指以太坊上的單位,比如etherGwei等。

       文檔中列出的基礎API除了檢查是否可編碼外,平常開發中都會經常使用。

       Web3.py第一章總覽就學習結束了。本次學習內容不多,重點是掌握web3.py的安裝和連接以太坊節點的方法。同時也要對基礎的API有一些瞭解,畢竟要經常使用的。

       期待下一次的學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章