Der beste Weg, um Blocktransaktionen zu verfolgen, während sie passieren

Ich habe dieses Repo gefunden, das die aktuellen Gaspreise mit web3 abruft:

https://github.com/ethgasstation/gasstation-express-oracle/blob/master/gasExpress.py

Ich möchte ein ähnliches Skript schreiben, das weiterhin ausgeführt wird und jedes Mal einen Rückruf erhält, wenn ein neuer Block mit allen Transaktionen im Block auftritt, und einen laufenden Durchschnitt der Gaspreise behält, anstatt all diese Anrufe jedes Mal aufzurufen, wenn wir dies benötigen prüfen.

Scheint, als gäbe es in der web3-Bibliothek eine Websockets-Serveroption. Ich kämpfe damit, wie ich das testen kann. Erlaubt mir testrpc, Blockänderungen automatisch zu beobachten? Wenn das so ist, wie?

Da Blöcke relativ selten erstellt werden (etwa alle 15 Sekunden), ist einfaches Abfragen eine gute Möglichkeit. web3.eth.getBlockNumber()teilt Ihnen die neueste Blocknummer mit, und wenn Sie diese noch nicht gesehen haben, können Sie den Block bearbeiten. Ich empfehle dies nur, weil die Websocket-Unterstützung noch nicht großartig ist. Zum Beispiel unterstützen es bisher weder ganache-cli(ehemals ) noch Infura.testrpc

Antworten (1)

Das Abrufen von Änderungen mit einem Filter ist der einzige Standard, der universell über Knoten hinweg unterstützt wird. In diesem Fall würden Sie einen neuen Blockfilter erstellen und Ihren Knoten von Zeit zu Zeit abfragen. Immer wenn neue Blöcke eingehen, erhalten Sie als Antwort die Liste der neuen Blöcke. In web3.py könnte das so aussehen:

block_filter = web3.eth.filter('latest')

# get list of new blocks:
latest_blocks = web3.eth.getFilterChanges(block_filter.filter_id)

# wait a few seconds, and then again:
latest_blocks = web3.eth.getFilterChanges(block_filter.filter_id)

Es gibt knotenspezifische Implementierungen, die ein Modell im Pub/Sub-Stil haben, wie z. B. parity's parity_subscription. Auf diese Weise können Sie Änderungen im neuesten Block „abonnieren“ und neue Daten erhalten, wenn sie erscheinen. Aber es ist kein Standard, daher ist die Unterstützung in den web3 * -Varianten schwach / nicht vorhanden. Sie müssten die Low-Level-Interaktion mit der json-rpc-Schnittstelle verwalten.

IMO, es lohnt sich nicht, sie anzupassen, da Sie durch die Abfrage nicht viel Zeit gegen 15-sekündige Blockzeiten verlieren.