OS:win7
web3.py: 6.20.0
python使用web3.py操作bsc时报错了:
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#proof-of-authority for more details. The full extraData is: HexBytes('0xd883010002846765746888676f312e31332e34856c696e757800000000000000924cd67a1565fdd24dd59327a298f1d702d6b7a721440c063713cecb7229f4e162ae38be78f6f71aa5badeaaef35cea25061ee2100622a4a1631a07e862b517401')
按照这个github提示以及stackoverflow介绍,得到了解决:
from web3.middleware import geth_poa_middleware ---导入这个
rpc_url = BSC_RPC_LIST[random.randrange(0, len(BSC_RPC_LIST))] web3 = Web3(Web3.HTTPProvider(rpc_url))
web3.middleware_stack.inject(geth_poa_middleware, layer=0)
但在ubuntu下则并没有得到解决,报错信息是:
NameError: name 'geth_poa_middleware' is not defined
区别是web3.py版本不一致,
web.py: 7.3.0
而加入import之后:from web3.middleware import geth_poa_middleware
报错信息是:
ImportError: cannot import name 'geth_poa_middleware' from 'web3.middleware'
最终在这里找到了答案
发现7.3.0版本做了一些修改,如下:
from web3.middleware import ExtraDataToPOAMiddleware
w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0)
修改后,就可以正常运行了。
同样的polygon的rpc也需要加上poa的设置,具体参考web3.py的版本。