Was ist der schnellste Weg, um alle internen Transaktionen zu exportieren?

Ich weiß, dass die "internen Transaktionen" nicht in der Blockchain enthalten sind und nur abgerufen werden können, indem die Transaktionen wiedergegeben und CALL, CALLCODEund andere ähnliche Opcodes angehört werden. Sowohl Parity als auch Geth stellen hierfür Mittel bereit .

Ich habe jedoch Probleme, eine vollständige Synchronisierung von Geth / Parity durchzuführen. Geth brauchte über einen Monat zum Synchronisieren, verwendet ~800 GB und will seit gestern nicht mehr laufen, weil es mit Fatal: Error starting protocol stack: missing block number for head header hash. Ich konnte keine Lösung finden, da Resync für mich nicht wirklich eine Option ist. Auf der anderen Seite habe ich vor etwa einer Woche mit der Synchronisierung von Parity begonnen, und der Prozess, der zunächst schnell war, verlangsamte sich bei etwa Block # 2393000 zu einem Kriechen.

Soweit ich weiß, kann ich Warp / Fast Sync nicht verwenden, wenn ich interne Transaktionen erhalten möchte. Außerdem kann ich Infura nicht verwenden, da es keine geeignete JSON-RPC-Schnittstelle bietet. Ich könnte Etherscan verwenden, aber das scheint Betrug zu sein - was bringt ein dezentrales System, wenn Sie Ihre Daten von einem zentralen Endpunkt abrufen? Ich muss es vielleicht verwenden, wenn alles andere fehlschlägt, aber ich würde mich über einige Hinweise freuen. Ich bin mir sicher, dass ich nicht der Einzige bin, der das versucht.

TL;DR: Was ist der schnellste Weg, Knoten zu synchronisieren, damit ich die internen Transaktionen von ihnen abrufen kann? Wenn dies nicht möglich ist, welche anderen Möglichkeiten gibt es, um diese Daten zu erhalten?

Es ist höllisch schwierig, interne Transaktionen zu erhalten. Dafür schreibe ich einen ganzen Blockchain-Explorer. Sie müssen jede Transaktion analysieren, ausführen und den Stapel der virtuellen Maschine reproduzieren, um den korrekten Geldfluss herauszufinden. Nicht nur CALL/CALLCODE, sondern auch SELFDESTRUCT wirken sich auf das Gleichgewicht aus. Sie könnten Etherescan verwenden oder warten, bis mein Explorer draußen ist. Es wird nach Postgres exportiert. Erscheint in ein paar Wochen mehr.
@Nulik Danke für den Tipp über SELFDESTRUCT! Ich mache mir keine Sorgen um den Explorer selbst, ich benutze dafür eine Python-App und Neo4j. Das Abrufen der internen TXS aus der Blockchain ist jedoch ... langsam, zumindest über JSON RPC. Wird Ihr Explorer in der Lage sein, interne TXs irgendwie schneller zu bekommen? Wenn ja, würde mich wirklich interessieren, wie...
Mein Explorer ist in Golang geschrieben, es ist eine modifizierte Version von geth, also ist es schnell, obwohl ich mich noch nicht auf die Code-Optimierung konzentriert habe. Die Verarbeitung des Genesis-Blocks mit 8893-Konten dauert einige Minuten, hauptsächlich weil jedes INSERT separat ist und Lookups durchgeführt werden, da ich Adressen durch uintIDs ersetze, um Platz zu sparen und die Leistung zu steigern. Ich habe mit Neo4j gearbeitet, es ist schnell, aber es macht keinen Sinn, Daten von einem NoSQL-Format (LevelDB) in ein anderes NoSQL-Format wie Neo4j zu exportieren. Der Schlüssel ist, es in SQL zu exportieren, da es viel flexibler ist als NoSQL.
Ich möchte nur sagen, dass ich Ihren Kommentar über "Was ist der Sinn eines dezentralisierten Systems ..." sehr mag. Ich spreche seit Monaten genau über dieses Problem und bin nicht der Erste, der es anspricht. Hier ist ein Beispiel: github.com/ethereum/go-ethereum/issues/2104 Leider scheinen Ethereum-Entwickler den Kopf in den Sand stecken zu wollen.
Sie möchten sich auf jeden Fall QuickBooks ansehen. Wir haben dieses Problem vollständig gelöst. Einschließlich der Anhäufung von Transaktionslisten pro Konto, intern und extern, und wir können Blockabrechnungen durchführen.
@ThomasJayRush Danke, QuickBlocks sieht nach einem coolen Projekt aus, aber ich bleibe wahrscheinlich bei meinem eigenen Skript - ich muss Daten ändern, während sie abgerufen werden, und es ist am einfachsten für mich und meine Kollegen, wenn das in Python ist, nicht in C++. Allerdings würde mich wirklich interessieren, wie Sie das Problem des langsamen Abrufens interner Transaktionen gelöst haben? (Ich sehe aus Ihrem anderen Kommentar , dass Sie keine Tracer verwenden;))

Antworten (2)

Es stellt sich heraus, dass die Parität auf der SSD-Festplatte viel schneller synchronisiert wird .

EDIT : ... ist es, aber das Abrufen interner Transaktionen ist sehr langsam. Kürzlich kam Geth 1.8.0 heraus, das schneller zu synchronisieren scheint (obwohl es auf der Festplatte immer noch sehr langsam ist) und Tracer unterstützt . Wir werden sehen, wie das geht.

Schön,

Gemäß dem Geth-Hilfedokument gibt es drei Möglichkeiten, wie Sie eine Synchronisierung mit dem Netzwerk durchführen können:

  1. --syncmode full: Geth-Client lädt Blockheader + Blockdaten + vollständige Validierung herunter [Wird eth full node genannt]

  2. --syncmode fast: Der Geth-Client lädt Block-Header + Blockdaten + Validierung für die letzten 1.000 Transaktionen herunter.

  3. --syncmode light: Der Geth-Client lädt den aktuellen Status herunter + fragt die Knoten nach Bedarf ab. [Light node [Es wird fehlende Blöcke von vollständigen Knoten anfordern]

Sie können den Syncmode ändern, indem Sie --syncmode zusammen mit der Eingabeaufforderung angeben. schnell ist gut. Aber wenn Sie keine Zeit und keinen Platz haben, versuchen Sie, Licht zu verwenden.

Vielen Dank für die Antwort, aber ich verstehe nicht, wie dies auf meine Frage zutrifft? AFAIK Ich muss syncmode fulldie internen Transaktionen abrufen und suche nach einem schnelleren Weg, dies zu erreichen, da syncmode fuller sehr langsam ist.