python-web3py-bsc-extradata-poa-chain

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的版本。