web3.py接入POA網絡錯誤及解決方案

當使用web3.py接入採用POA共識的以太坊節點時,可能會出現錯誤The field extraData is 97 bytes, but should be 32...,本文將介紹如何解決這一問題。

用自己熟悉的語言學習 以太坊開發Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、Web3.py ExtraData故障現象

當使用Web3.py接入Rrinkeby測試鏈或接入使用geth --dev命令啓動的開發私鏈時,代碼會提示如下錯誤信息:

web3.exceptions.ExtraDataLengthError: The field extraData is 97 bytes, 
but should be 32. It is quite likely that you are connected to a POA chain. 
Refer to http://web3py.readthedocs.io/en/stable/middleware.html#geth-style-proof-of-authority 
for more details. 

The full extraData is: HexBytes('0xd88301010084676...21465292f')

這是因爲POA共識算法在extraData字段添加了一些額外的數據從而導致該字段超過以太坊的黃皮書約定的32字節長度,而Web3.py默認情況下是按照以太坊黃皮書的約定來檢查extraData字段的長度,這造成了不一致並拋出異常。

2、Web3.py ExtraData故障的解決方法

Web3.py提供了中間件geth_poa_middleware來解決這一兼容性問題,只要引入該中間件並將其注入web3對象即可,例如:

from web3 import Web3
from web3.middleware import geth_poa_middleware

w3 = Web3('http://localhost:8545')
w3.middleware_onion.inject(geth_poa_middleware, layer=0)  # 注入poa中間件

原文鏈接:The field extraData is 97 bytes, but should be 32 — 匯智網

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