Ich versuche, mit web3.py eine Verbindung zu Rinkeby herzustellen. Aber wenn ich eine Methode aufrufe, wie w3.version.node
, wird eine Ausnahme ausgelöst, die endet mit:
... File "/home/hacker/venv/lib/python3.5/site-packages/web3/utils/formatters.py", line 69, in apply_formatters_to_dict raise type(exc)("Could not format value %r as field %r" % (item, key)) from exc ValueError: Could not format value '0x{LONG_HEX}' as field 'extraData'
(Wo LONG_HEX
sind viele Hex-Zeichen, wie 194)
Wie repariere ich meine Verbindung, um Blockdaten zu erhalten?
Versionen:
geth
1.8.2web3.py
v4.0.0-beta.13Hinweis: Zusätzlich zum Rinkeby-Netzwerk erhalte ich dieselbe Ausnahme, nachdem ich mich mit einem Knoten verbunden habe, mit dem begonnen wurdegeth --dev
Fügen Sie eine spezielle Middleware in web3.py v5+ ein, um den Proof-of-Authority im Geth-Stil zu handhaben, wie folgt :
py> from web3 import Web3, IPCProvider # connect to the default geth --dev IPC location py> w3 = Web3(IPCProvider('/tmp/geth.ipc')) py> from web3.middleware import geth_poa_middleware # inject the poa compatibility middleware to the innermost layer py> w3.middleware_onion.inject(geth_poa_middleware, layer=0) # confirm that the connection succeeded py> w3.version.node 'Geth/v1.8.2-stable-b8b9f7f4/linux-amd64/go1.9.4'
geth_poa_middleware
notwendig?Eine leicht modifizierte Version der web3.py-Dokumentation :
Es gibt noch keinen starken Community-Konsens über einen einzigen Proof-of-Authority (PoA)-Standard. Bei einigen Knoten laufen jedoch erfolgreiche Experimente. Eines davon ist go-ethereum (geth), das einen Prototyp-PoA für seinen Entwicklungsmodus und das Rinkeby-Testnetzwerk verwendet.
Leider weicht der Prototyp von der Yellow-Paper
extraData
-Spezifikation ab, die das Feld in jedem Block auf maximal 32 Byte beschränkt. PoA von Geth verwendet mehr als 32 Bytes, was zu einem Validierungsfehler in web3.py führt. Diese Middleware modifiziert die Blockdaten, umextraData
sie vor der Rückgabe etwas zu kürzen.
Ergänzung zur vorherigen Antwort: In web3py Version 5.xx müssen Sie es so ändern:
# inject the poa compatibility middleware to the innermost layer
w3.middleware_stack.inject(geth_poa_middleware, layer=0)
dazu:
# inject the poa compatibility middleware to the innermost layer
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
Ich meine, middleware_stack
wurde umbenannt in: middleware_onion
.
Schnitzer
Benutzer23752