Rinkeby-Fehler mit web3.py – Wert „0x...“ konnte nicht als Feld „extraData“ formatiert werden

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_HEXsind viele Hex-Zeichen, wie 194)

Wie repariere ich meine Verbindung, um Blockdaten zu erhalten?

Versionen:

  • geth1.8.2
  • web3.pyv4.0.0-beta.13

Hinweis: Zusätzlich zum Rinkeby-Netzwerk erhalte ich dieselbe Ausnahme, nachdem ich mich mit einem Knoten verbunden habe, mit dem begonnen wurdegeth --dev

Antworten (2)

Lösung

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'

Warum ist geth_poa_middlewarenotwendig?

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, um extraDatasie 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_stackwurde umbenannt in: middleware_onion.

Danke für den Verbesserungsvorschlag! Wenn Sie eine vorhandene Antwort verbessern, ist sie besser als Kommentar zu dieser Antwort strukturiert.
Richtig, aber dafür muss man 50 Punkte Ruf haben, was ich nicht habe! :-) (grausame Welt) In der Tat, was optimal ist, habe ich gerade erkannt, ich scheine in der Lage zu sein, Ihre Antwort tatsächlich zu bearbeiten . nächstes Mal.. Lektion gelernt.