Иль*_*я 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