一、什麼是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是有提示的,如下圖:
這裏提示輸入一個數字和一個字符串,返回一個整數。注意,這個字符串是指以太坊上的單位,比如ether
、Gwei
等。
文檔中列出的基礎API除了檢查是否可編碼外,平常開發中都會經常使用。
Web3.py第一章總覽就學習結束了。本次學習內容不多,重點是掌握web3.py的安裝和連接以太坊節點的方法。同時也要對基礎的API有一些瞭解,畢竟要經常使用的。
期待下一次的學習。