Wie erkunde ich alle Transaktionen für ein bestimmtes Konto?

Nachdem ich Kontostände überprüfen konnte, suche ich nach einer Methode, um alle Transaktionen für ein bestimmtes Ethereum-Konto über das json-rpc-Protokoll aufzulisten. Auf https://github.com/ethereum/wiki/wiki/JSON-RPC habe ich dafür keine geeignete Methode gefunden .

Ähnlich wie bei https://etherscan.io/txs?a=0xbb9bc244d798123fde783fcc1c72d3bb8c189413 versuche ich, einen Explorer zu erstellen, der alle Transaktionen von einem bestimmten Konto anzeigt.

Unter Wie können alle an eine Adresse gesendeten Transaktionen gefunden werden? Eine ähnliche Frage wird gestellt, aber ich suche nicht nach einer Lösung durch einen Drittanbieter, sondern durch direkte Abfrage an meinen Ethereum-Knoten über das JSON-RPC-Protokoll.

Übersehe ich etwas? Ist das über die json-rpc-Schnittstelle möglich?

Meine Vermutung ist, dass sie die Transaktionen entlang dieser fromImmobilie extern indizieren. Es gibt eine Menge anderer Indizes, die tatsächlich erstellt werden müssen. Kannst du einen Link zu deinem Code hinzufügen? Klingt nach einem interessanten Projekt.

Antworten (3)

Wenn Sie eine Erkundung wie erstellen möchten etherscan.io, müssen Sie alle Daten im Ethereum-Netzwerk crawlen und alle TXs in der Datenbank speichern.

Es gibt keine direkte RPC-Methode, um alle mit dem Konto verbundenen Transaktionen zu erhalten.

Warum nochmal in db crawlen und speichern? Ethereum-Kunden pflegen bereits ihre DB. Wir brauchen nur eine API, um diese Daten herauszubekommen. Es wäre also besser, den bevorzugten Ethereum-Client zu wählen und die gewünschte API hinzuzufügen.

Die akzeptierte Antwort auf Wie können alle an eine Adresse gesendeten Transaktionen gefunden werden? keinen Dritten einbezieht.

Das Skript in der Antwort verwendet die Web3-JavaScript-API , die:

Unter der Haube kommuniziert es über RPC-Aufrufe mit einem lokalen Knoten. web3.js funktioniert mit jedem Ethereum-Knoten, der eine RPC-Schicht verfügbar macht.

Zum Beispiel, wo das Skript Folgendes tut:

var block = eth.getBlock(i, true);

Sie können JSON-RPC verwendeneth_getBlockByNumber

Gibt Informationen über eine Block-für-Block-Nummer zurück.

Parameter

  1. QUANTITY|TAG – Ganzzahl einer Blocknummer oder die Zeichenfolge „earliest“, „latest“ oder „pending“, wie im Standardblockparameter.
  2. Boolean - Wenn wahr, werden die vollständigen Transaktionsobjekte zurückgegeben, wenn falsch, nur die Hashes der Transaktionen.

Die Javascript-API macht es einfacher, als JSON-RPC-Anforderungen auszugeben, aber Sie können das Skript in eine andere Sprache portieren und JSON-RPC-Anforderungen ausgeben. Beachten Sie außerdem den Kommentar zur akzeptierten Antwort, dass Sie mehr als ein Skript benötigen, um "interne Transaktionen" zu erhalten .

Meinen Sie also, dass ich, um übereinstimmende Transaktionen (von oder zu einer bestimmten Adresse) herauszufinden, ein Skript benötigen würde, das die gesamte Blockchain vollständig scannt? Ist der Geth-Knoten nicht in der Lage, die passenden Transaktionen herauszufiltern, nach denen ich suche? Sind sie nicht irgendwie auf der Blockchain oder dem Knoten selbst indiziert? Danke!
@JuanIgnacioPérezSacristán Nein, Ethereum hat nicht so weit vorausgedacht ;)
@JuanIgnacioPérezSacristán, Ethereum verwendet eine NoSQL-Datenbank (LevelDB). Es speichert keine Tabellenbeziehungen wie eine relationale Datenbank. Die Verwendung einer relationalen Datenbank würde die Leistung beeinträchtigen, da die Datenmenge groß ist. Sie scannen also entweder die gesamte DB oder erstellen eine relationale DB aus der Blockchain und fragen sie mit SQL ab.
Die zum Analysieren aller Blöcke für eine gegebene Adresse erforderliche Zeit ist ziemlich groß.
Wollen Sie ernsthaft sagen, dass es notwendig ist, den gesamten Block herunterzuladen, bevor Sie nach Transaktionen suchen können? Was ist, wenn sich die Transaktionen auf separaten Blöcken befinden?
@MelbourneDeveloper Eine Transaktion befindet sich vollständig innerhalb eines Blocks. Wenn Sie einen mobilen oder leichten Client haben, kann er Ihre Transaktionen überprüfen, ohne den gesamten Block zu benötigen (er kann Block-Header verwenden).
Ja, aber ich brauche alle Transaktionen. Nicht nur die eine.

Bekannten Ethereum-Knoten fehlt die Funktionalität zum Abrufen der Transaktionsliste für die ETH-Adresse (Konto).

Um das Problem zu lösen, gibt es eine kostenlose Open-Source-Drittanbieterlösung – Ethereum Transaction Indexer: https://github.com/Adamant-im/ETH-transactions-storage

Der Indexer ermöglicht es, Transaktionen nach Ethereum-Adresse zu durchsuchen und eine Historie jedes Benutzers|Wallet in nur einem Zug zu erhalten, wie es Etherscan tut. Indexer ist in Python geschrieben. Es funktioniert als Dienst im Hintergrund:

  • verbindet sich mit dem Ethereum-Knoten (funktioniert gut mit Geth oder Parität, andere wurden nicht getestet)
  • speichert alle Transaktionen in der Postgres-Datenbank (einschließlich Smart-Contract-Transaktionen)
  • stellt Daten für die API bereit, um Transaktionen nach Adresse abzurufen

Der Indexer stellt eine Verbindung zum Ethereum-Knoten her und ruft Transaktionen mithilfe von JSON RPC ab, wodurch der Transaktionsindex in der Postgres-Datenbank erstellt wird. First Indexer speichert Transaktionen ab dem von Ihnen angegebenen Block. Danach wird alle 20 Sekunden nach neuen Blöcken gesucht und der Index aktualisiert. Sie können das Intervall ändern.

Die API für den Ethereum-Transaktionsindexer wird vom Postgrest-Tool veröffentlicht. Wenn Sie eine öffentliche API bereitstellen müssen, verwenden Sie einen beliebigen Webserver wie nginx und richten Sie einen Proxy für den Postgrest-Port in der Konfiguration ein.

Nachdem der Index erstellt wurde, können Sie Anfragen wie verwenden

curl -k -X GET "http://localhost:3000/?and=(contract_to.eq.,or(txfrom.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094,txto.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094))&order=time.desc&limit=25"

oder

https://yourserver.com/ethtxs?and=(contract_to.eq.,or(txfrom.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094,txto.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094))&order=time.desc&limit=25

Die Anfrage zeigt 25 letzte Transaktionen für die Ethereum-Adresse 0x6b924750e56a674a2ad01fbf09c7c9012f16f094, sortiert nach Zeitstempel.