Python開發以太坊的類庫Web3.py V4的新功能
Web3.py第4版的第一個測試版於2017年11月中旬釋出,此後又釋出了5個版本,目前已經穩定釋出到4.6。主要版本變化意味著一些向後相容的更改,以及這些更改啟用的一些全新功能。感興趣的話請繼續閱讀本概述。
如何安裝
等不及要玩了嗎?現在用pip安裝。Pip預設不會安裝測試版,因此請使用--pre標誌立即獲取v4:
pip install --pre web3
Python3.5以上
其中一個更重要的變化是現在需要Python 3.5。你的專案仍然停留在py2上嗎?立即升級程式碼。它比你想象的要快2to3。Python 3提供了許多有用的功能和庫,並且它消除了bytes
和str
的歧義,這為升級鋪平了道路。
更直觀的引數和返回型別
全域性特徵
如果瀏覽在v3中返回十六進位制字串的函式,你會發現它們中的大多數在v4中返回類似bytes
的物件。下面示例中的HexBytes
類是內建字bytes
型的子類,因此可以在bytes
所在的任何位置使用。
>>> from web3.auto import w3 >>> block_hash = w3.eth.getBlock(4359745).hash HexBytes('0x03087766bf68e78671d1ea436ae087da74a12761dac020011a9eddc4900bf13b') # get the first byte: >>> block_hash[0] 3 # show how many bytes are in the hash >>> len(block_hash) 32 # hex-encode the hash >>> w3.toHex(block_hash) '0x03087766bf68e78671d1ea436ae087da74a12761dac020011a9eddc4900bf13b' # cast back to the basic `bytes` type >>> bytes(block_hash) b"\x03\x08wf\xbfh\xe7\x86q\xd1\xeaCj\xe0\x87\xdat\xa1'a\xda\xc0 \x01\x1a\x9e\xdd\xc4\x90\x0b\xf1;"
合約引數
如果合約返回ABI bytes
型別,那麼將獲得python bytes值。如果它返回ABI 字串
型別,那麼你將得到一個python str。同樣,合約函式的引數也會匹配對應。
如果提供的引數型別與相應的ABI型別不完全匹配,則將嘗試轉換它。 例如:
- 傳送到ABI字串型別的位元組值將是UTF-8解碼的
- 傳送到ABI位元組型別的str值將被轉換為十六進位制
合約函式
合同函式的v3 API有點違反直覺,在指定函式之前指定如何處理函式,例如:contract.call().balanceOf(...)
。我們使用類似web3.js的格式轉換這些格式:v1:contract.functions.balanceOf(...).call()
使用私鑰簽署訊息和交易
現在可以在沒有任何客戶端連線的情況下對訊息和原始交易進行簽名以及驗證它們。
以下是簽署一個資訊的的示例:
>>> from web3 import Account, Web3
>>> msg = "I♥SF"
>>> key = b"\xb2..."
>>> Account.sign(message_text=msg, private_key=key)
{'message': b'I\xe2\x99\xa5SF',
'messageHash': HexBytes('0x1476abb745d423bf09273f1afd887d951181d25adc66c4834a70491911b7f750'),
...
'signature': HexBytes('0xe6ca9bba58c88611fad66a6ce8f996908195593807c4b38bd528d2cff09d4eb33e5bfbbf4d3e39b1a2fd816a7680c19ebebaf3a141b239934ad43cb33fcec8ce1c')}
準備簽名的交易
在v3中,沒有很好的方法來建立合約交易物件。這並不重要,因為除了廣播這個交易之外別無他法,這已經很容易了。但是,在第4版中,我們可能希望在廣播之前在本地簽署該交易物件。所以添加了buildTransaction()
選項,如下所示:
>>> from web3.auto import w3
>>> token = w3.eth.contract(abi=...)
>>> transfer = token.functions.transfer("ethereumfoundation.eth", 1).buildTransaction()
>>> signed = w3.eth.account.signTransaction(transfer, key)
>>> w3.eth.sendRawTransaction(signed.rawTransaction)
更可預測的過濾器
在第3版中,過濾器從未按照人們想要的方式執行。標準JSON-RPC API僅支援輪詢更新篩選器。因此,為了模擬回撥機制,Web3.py必須以執行緒為主,並支援多種方法(如stdlib或gevent)。它很麻煩,容易出現故障。這些失敗很難在執行時除錯和捕獲。
在v4中,Web3.py將使用者的選擇新增到監視執行緒,並在你的應用程式合適時呼叫get_new_entries()
。這允許你捕獲可能引發的Exception
,並除錯你的過濾器。新系統更可靠,更容易追蹤正在發生的事情,但還有更多的改進空間。因此,請注意v4中的更多過濾更新以及v5中的更新。
無處不在以太坊名稱服務
在可以輸入地址的任何地方,v4都接受作為一個名稱。然後Web3.py將為你查詢該地址。有關以太坊名稱服務的更多詳細資訊,請參閱此文章,瞭解ENS如何適合Web3.py。
例如,我們可以在ethereumfoundation.eth
獲得地址的餘額:
>>> from web3.auto import w3
>>> w3.eth.getBalance('ethereumfoundation.eth')
2963803006730275571720
自動初始化
猜測連線到普通客戶端需要哪些引數並不難。然而,在第3版中,有必要指定使用哪個介面,例如:
from web3 import Web3, IPCProvider
w3 = Web3(IPCProvider())
也許你從之前的例子中注意到,在v4中,這可以通過單行實現:
from web3.auto import w3
此外,可以在沒有任何介面的情況下初始化Web3,這具有相同的效果:
from web3 import Web3
w3 = Web3()
自動介面檢測可以猜測生產網路的常見IPC和HTTP連線設定。它還會檢查你是否設定了環境變數。
地址校驗無處不在
EIP55定義了十六進位制地址的校驗和機制,它將一些十六進位制字元轉換為大寫字母。Web3.py
選擇支援該機制有一段時間,它現在是所有地址所必需的。全小寫十六進位制地址將被拒絕為無效(除了在校驗和產生全小寫十六進位制地址的極少數情況下)。
此外,現在從所有方法返回校驗地址。這樣做的好處是地址相等性測試可以簡單地使用addr1 == addr2
,因為只有一個EIP 55地址的有效表示。
gas價格估算
感謝https://ethgasstation.info/釋出他們的演算法。我們將其中的一個版本合併到Web3.py中的新gas價格估算的後端程式碼中。這樣:
from web3 import Web3, middleware
from web3.gas_strategies.time_based import medium_gas_price_strategy
w3 = Web3()
w3.eth.setGasPriceStrategy(medium_gas_price_strategy)
w3.middleware_stack.add(middleware.time_based_cache_middleware)
w3.middleware_stack.add(middleware.latest_block_based_cache_middleware)
w3.middleware_stack.add(middleware.simple_cache_middleware)
w3.eth.generateGasPrice()
你肯定會想要那些新的快取中介軟體,因為它會對你的節點進行大量呼叫。只有在自動獲得更好的價格估算時才進行此設定,這至關重要,值得花點兒時間。第一次估計測試計算大約50秒。
要檢視完整的更改列表,請訪問v4發行說明。
當然,python用web3.py庫開發以太坊來說非常的方便,有興趣的使用者可以關注我們的python以太坊教程,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
這裡是原文