Go-Ethereum

Rinkeby web3.py 失敗——無法將值“0x …”格式化為欄位“extraData”

  • August 20, 2021

我正在嘗試使用 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)

如何修復連接以獲取塊數據?

版本:

  • geth1.8.2
  • web3.pyv4.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在返回之前修改塊數據以縮短一點。

引用自:https://ethereum.stackexchange.com/questions/44130