Go-Ethereum
Rinkeby web3.py 失敗——無法將值“0x …”格式化為欄位“extraData”
我正在嘗試使用 web3.py 連接到 Rinkeby。但是當我呼叫一個方法時,例如
w3.version.node
,它會拋出一個以以下結尾的異常:... File "/home/hacker/venv/lib/python3.5/site-packages/web3/utils/formatters.py", line 69, in apply_formatters_to_dict raise type(exc)("Could not format value %r as field %r" % (item, key)) from exc ValueError: Could not format value '0x{LONG_HEX}' as field 'extraData'
(哪裡
LONG_HEX
有很多十六進製字元,比如 194)如何修復連接以獲取塊數據?
版本:
geth
1.8.2web3.py
v4.0.0-beta.13注意:除了 Rinkeby 網路之外,在連接到以
geth --dev
解決方案
在 web3.py v5+ 中插入一個特殊的中間件來處理 geth 風格的權威證明,如下所示:
py> from web3 import Web3, IPCProvider # connect to the default geth --dev IPC location py> w3 = Web3(IPCProvider('/tmp/geth.ipc')) py> from web3.middleware import geth_poa_middleware # inject the poa compatibility middleware to the innermost layer py> w3.middleware_onion.inject(geth_poa_middleware, layer=0) # confirm that the connection succeeded py> w3.version.node 'Geth/v1.8.2-stable-b8b9f7f4/linux-amd64/go1.9.4'
為什麼是
geth_poa_middleware
必要的?web3.py 文件的略微修改版本:
目前還沒有關於單一權威證明 (PoA) 標準的強烈社區共識。不過,有些節點已經成功執行了實驗。一個是 go-ethereum (geth),它使用原型 PoA 的開發模式和 Rinkeby 測試網路。
不幸的是,原型確實偏離了黃皮書規範,該規範將
extraData
每個塊中的欄位限制為最大 32 字節。Geth 的 PoA 使用超過 32 個字節,這導致 web3.py 中的驗證失敗。該中間件extraData
在返回之前修改塊數據以縮短一點。