extraData 字段是 97 字节,但应该是 32。很有可能你连接的是 POA 链

Иль*_*я 14 python ethereum go-ethereum web3py

我通过 geth 部署了一个私有网络,并在那里发布了一个智能合约。账户设置在创世区块中

在此输入图像描述

我正在创建一个 python 函数,我想在其中调用智能合约函数

import web3
import json
class Estate():
    with open("abi.txt", 'r') as file:
        abi = json.load(file)
    contract_address = "0x4FD52ce1140d67b8c721AB7967eeca44FE56c883"
    contract_address = web3.Web3.toChecksumAddress(contract_address)
    w3 = web3.Web3(web3.HTTPProvider('http://127.0.0.1:8545'))
    con = w3.eth.contract(address=contract_address, abi=abi)

    def create_estate(self, address, info, square):
        address = web3.Web3.toChecksumAddress(address)
        print(self.con.functions.create_estate(address, info, square).transact())
        #self.w3.eth.waitForTransactionReceipt(tx)

c = Estate()
c.create_estate("0xE64021f5387Dc5FA859e0641437a45542D511e7E","street", 200)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

web3.exceptions.ExtraDataLengthError:字段 extraData 是 97 字节,但应该是 32。很可能您连接到了 POA 链。有关更多详细信息,请参阅http://web3py.readthedocs.io/en/stable/middleware.html#geth-style-proof-of-authority 。完整的额外数据为: HexBytes('0xda83010a0d846765746888676f312e31372e328777696e646f7773000000000053ea481c4aca3824d51d3c8103abe60179d3f1c4ec68a0c87d5 533e8e0580e14433b6cf8a285b519add550d59e70e60619721861b2d855cb7a175978610bb65500')

Sam*_*eau 28

该错误来自于您的私有 geth 网络(或 Rinkeby 等公共测试网络)和主网络之间的块格式差异。

您可以通过向对象添加中间件来解决此问题Web3

from web3.middleware import geth_poa_middleware
Run Code Online (Sandbox Code Playgroud)

然后注入中间件:

w3 = web3.Web3(web3.HTTPProvider('http://127.0.0.1:8545'))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
Run Code Online (Sandbox Code Playgroud)

我遇到了和你一样的错误,并根据这里的解决方案修复了它:

https://github.com/blockchain-etl/ethereum-etl/issues/178

web3文档也提到了这一点:

https://web3py.readthedocs.io/en/stable/middleware.html#why-is-geth-poa-middleware-necessary