Interaktion mit der Ethereum-Blockchain und Erstellen einer Datenbank mit Python und SQL

Einführungsworkshops über Blockchain beginnen häufig mit der leicht verdaulichen Geschichte von Peer-to-Peer-Netzwerken und Bankbüchern und führen dann direkt zum Codieren intelligenter Verträge, was ziemlich abrupt ist. Stellen Sie sich stattdessen vor, Sie gehen in einen Dschungel und betrachten die Ethereum-Blockchain als eine seltsame Kreatur, die Sie gerade studieren werden. Heute werden wir die Kreatur beobachten, mit ihr interagieren und alle Daten darüber in einem zentralen Speicher für Ihren eigenen Gebrauch sammeln.

Vorbereitung für die erste Begegnung

Zunächst müssen Sie web3py installieren. Web3py ist eine Python-Bibliothek zum Verbinden mit der Ethereum-Blockchain. Was Sie vorher wissen müssen, ist, dass es kein zentrales Verwaltungssystem gibt, von dem die Daten heruntergeladen werden können. Die miteinander verbundenen Knoten („Peers“), die Ressourcen gemeinsam nutzen, speichern eine überprüfte Kopie der Daten (oder ihres Teils). Das Netzwerk führt das Ethereum-Protokoll aus, das die Regeln für die Interaktion der Knoten untereinander und / oder für intelligente Verträge über dieses Netzwerk definiert.

Wenn Sie auf Informationen zu Transaktionen, Salden, Blöcken oder anderen Elementen zugreifen möchten, die in die Blockchain geschrieben sind, die Sie noch nicht kennen, müssen Sie für das Protokoll eine Verbindung zu den Knoten herstellen. Die Knoten teilen ständig neue Daten miteinander und überprüfen diese. Auf diese Weise erhalten Sie sicher 1) Daten, die nicht manipuliert wurden, und 2) die aktuellsten.

Es gibt zwei grundlegende Kategorien von Knoten, die Sie bei Ihrer ersten Annäherung an die Kreatur verwenden können: lokal oder gehostet. Ein lokaler Knoten kann auf Ihrem Computer ausgeführt werden. Dies bedeutet, dass Sie zuerst einen Client wie geth herunterladen müssen, der die Blockchain mit Ihrem Gerät synchronisiert, Speicherplatz belegt und sich Zeit für die Fertigstellung nimmt. Für die erste Begegnung ist ein gehosteter Knoten die bessere Wahl - er wird von jemand anderem gesteuert, aber Sie können sich problemlos mit ihm verbinden und selbst mit der Blockchain herumspielen.

Gehen Sie zu Infura und erstellen Sie Ihr eigenes kostenloses Konto, um auf einen solchen gehosteten Knoten zuzugreifen. Wenn Sie fertig sind, sehen Sie eine Liste der Netzwerke, zu denen Sie eine Verbindung herstellen können: das Hauptnetz (die Ethereum-Blockchain) und eine Reihe von Testnetzen, die dazu dienen, Ihre intelligenten Verträge im Grunde zu testen, damit Sie Fehler machen können auf ihnen und korrigieren Sie sie, bevor Sie kostspieligen Code im Mainnet bereitstellen.

Zeit für den ersten Anflug. Importieren Sie das Web3-Objekt und stellen Sie eine HTTP-Verbindung her.

aus Web3 importieren Web3
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

Und Sie sind fertig! Jetzt können Sie die Datenstruktur mit der web3-API untersuchen.

Informationen zu bestimmten Blöcken werden abgerufen ...

# aktuelle Blocknummer
>>> web3.eth.blockNumber
5658173
#den Inhalt des zuletzt extrahierten Blocks abrufen
>>> web3.eth.getBlock ('latest')

Dieser Befehl gibt die AttributeDict-Datenstruktur zurück, bei der es sich um ein Wörterbuch mit Schlüssel-Wert-Paaren handelt, das wie folgt aussieht:

Nicht alle diese Variablen werden Ihnen sofort von Nutzen sein, da einige recht technisch sind und ihre Bedeutung erst dann Sinn macht, wenn Sie ein tieferes Verständnis dafür haben, wie Blockchain tatsächlich funktioniert. Sie können mehr darüber im sogenannten "Gelben Papier" lesen oder sie vorerst überspringen und mit den leicht verständlichen arbeiten.

Kurz gesagt, ein Block enthält den Blockheader, eine Liste der verifizierten Transaktionen und eine Liste der Onkel (Blockkennungen von Minenarbeitern, die mit ihren Blöcken etwas zu langsam waren, um in die Hauptblockkette zu gelangen, für die sie aber dennoch mit Ether belohnt wurden) Rechenaufwand). Nachfolgend können Sie nachlesen, welche Bedeutung die einzelnen Variablen haben, die ich in Unterkategorien unterteilt habe.

Allgemeines

Bergbaubezogen

Onkel

Technisch

… Transaktionen und deren Belege

Jetzt können wir auch einzelne Transaktionen in einem Block anhand ihrer eindeutigen Kennungen, d. H. Transaktions-Hashes, nachschlagen.

Wie zuvor gibt uns web3py ein Attributwörterbuch zurück. In der folgenden Tabelle ist zusammengefasst, wofür die einzelnen Tasten stehen.

Schließlich können wir auch Transaktionsbelege prüfen:

Ein Transaktionsbeleg enthält einige wiederholte und neue Einträge. die neuen werden unten erklärt.

Als Referenz habe ich neben dem Gelben Papier verschiedene zusätzliche Ressourcen zur Erstellung dieser Tabellen aufgenommen [2, 3, 4, 5].

Wie Sie sehen, können Sie mit wenigen einfachen Befehlen bereits eine Verbindung zum Netzwerk herstellen und grundlegende Informationen zu Transaktionen, Blöcken oder Zuständen im Rohformat abrufen. Dies öffnet ein neues Fenster, was mit solchen Daten gemacht werden kann!

Datenbankverwaltungssystem

Wenn Sie planen, Ihre Daten in eine ordnungsgemäße Datenbank zu schreiben, werden Sie wahrscheinlich feststellen, dass es viele Lösungen für Managementsysteme für Python-Enthusiasten gibt, z. B. serverloses SQLite oder serverbasiertes MySQL, PostgreSQL oder Hadoop. Je nachdem, was Sie vorhaben, müssen Sie festlegen, welche Option für Ihr Projekt am besten geeignet ist. Im Allgemeinen habe ich folgende Punkte für hilfreich befunden:

  • Was ist die beabsichtigte Größe der Datenbank (d. H. Kann sie auf einem einzelnen Maschinensystem verarbeitet werden)?
  • Werden die Einträge häufig bearbeitet oder bleiben sie unverändert?
  • Soll die Datenbank von mehreren Parteien / Apps gleichzeitig aufgerufen und bearbeitet werden?

Die Ethereum-Blockchain wächst mit der Zeit stetig und nähert sich ab Juni 2018 1 TB an. Dies ist klein und daher für ein verteiltes Verarbeitungssystem wie Hadoop nicht optimal. Die Blockchain-Datenbank wird einmal geschrieben und dann nur mit neuen Einträgen erweitert, wobei alte Einträge unverändert bleiben. Der beabsichtigte Anwendungsfall dieser Datenbank besteht darin, von einem Kanal geschrieben zu werden und von den anderen Kanälen schreibgeschützt darauf zuzugreifen, sodass wir sie nicht wirklich auf einem Server ausführen müssen. Wenn Sie die Datenbank lokal auf Ihrem Computer belassen, können Sie sie schnell auslesen, was mit einem serverlosen Managementsystem wie SQLite wünschenswert und erreichbar ist. Und Python verfügt über eine integrierte Bibliothek sqlite3, sodass wir nicht einmal neue Pakete installieren müssen.

Datenbank Design

Der nächste Schritt ist das Entwerfen Ihrer Datenbank. Denken Sie daran, welche Datenfelder für Ihre Analyse am relevantesten sind, und optimieren Sie sowohl die Suche als auch die Speicherung. Wenn Sie beispielsweise stateRoot nicht verwenden möchten, können Sie es vollständig überspringen oder in einer separaten Tabelle aufbewahren. Eine Tabelle mit weniger Spalten kann schneller durchsucht werden, und wenn Sie später feststellen, dass Sie tatsächlich einen Anwendungsfall für den stateRoot haben, können Sie trotzdem darauf zugreifen. Möglicherweise möchten Sie auch die Blockinformationen von den Transaktionsinformationen trennen. Andernfalls werden Blockeigenschaften wie timestamp N-mal für alle Transaktionen im Block wiederholt, wodurch viel Speicherplatz verschwendet wird. Das Zuordnen einer Transaktion zu ihren Blockeigenschaften ist später mit der Operation JOIN einfach.

Die von mir gestaltete Datenbank besteht aus 3 Tabellen:

  • Schnell: Relevante Transaktionsinformationen für schnellen Zugriff und Analyse
  • TX: alle restlichen Transaktionsinformationen,
  • Block: blockspezifische Informationen.

Die Namenskonvention von Variablen wurde in Bezug auf das ursprüngliche web3py geringfügig geändert, um Mehrdeutigkeiten zu beseitigen, z SQL hat eine andere Bedeutung und würde das Programm zum Absturz bringen.

Transaktionswerte, Salden und andere große Zahlen müssen als Zeichenfolgen in der Datenbank gespeichert werden. Der Grund dafür ist, dass SQLite nur Ganzzahlen mit Vorzeichen verarbeiten kann, die in bis zu 8 Bytes gespeichert sind, mit einem Maximalwert von 2⁶³-1 = 9223372036854775807. Dies ist häufig viel niedriger als die Transaktionswerte in wei (z. B. nur 1 ETH = 10¹⁸ wei).

Erstellen Sie Ihre Mini-Datenbank

Den vollständigen Code finden Sie auf GitHub. Es organisiert die Blockchain-Informationen gemäß dem oberen Schema und gibt eine blockchain.db-Datei aus, die Daten einer festgelegten Anzahl von Blöcken enthält. Gehen Sie zum Testen zur Datei database.py und wählen Sie eine angemessene Anzahl für die Anzahl der zu schreibenden Blöcke aus, z.

Nblocks = 10000

Standardmäßig sollten Sie das web3-Objekt auf Ihren Infura-Endpunkt verweisen. Sie können auch zum IPC-Anbieter wechseln, wenn Sie einen haben (d. H. Ihren lokalen Knoten), indem Sie einfach die Zeile auskommentieren

# oder Verbindung über Knoten auf der VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

und fixieren Sie den Pfad. Dann starte einfach in deiner Kommandozeile python database.py. Der Code speichert die Nummer des zuletzt geschriebenen Blocks in der Datei lastblock.txt, falls Sie dort neu starten müssen, wo Sie aufgehört haben.

Wie benutzt man die Datenbank?

Sobald Sie die ersten Einträge in die Datenbank geschrieben haben, können Sie über die IPython-Shell mit ihr kommunizieren. Um beispielsweise die ersten 5 Zeilen der Tabelle "Quick" zu drucken, können Sie den folgenden Code ausführen.

Lokaler Knoten vs. Infura

Wenn Sie eine große Datenbank erstellen möchten, sollten Sie geth herunterladen und einen Knoten synchronisieren. Die Synchronisation kann in 3 Grundmodi durchgeführt werden:

Wenn Sie keinen früheren Kontostand benötigen, können Sie Ihren Knoten im Schnellmodus synchronisieren [6].

Nachfolgend sehen Sie eine grafische Darstellung der Geschwindigkeit, mit der dieser Code in eine Datenbank schreibt und mit dem vollständig synchronisierten Knoten lokal (IPC) im Vergleich zu einer Adresse auf Infura (Infura) kommuniziert. Wie Sie sehen, zahlt es sich aus, diesen Code auf einem lokalen Knoten auszuführen, da Sie den Geschwindigkeitsschub von fast 2 Größenordnungen (auch bekannt als 100x) erhalten!

Die Zeit, die zum Schreiben von 10 Transaktionsblöcken zwischen den Blöcken 2000000 und 2000400 benötigt wird. Die Zeit liegt auf der logarithmischen Skala (10⁰ = 1, 10¹ = 10 usw.).

Zusammenfassung

Jetzt, da Sie eine eigene lokale Datenbank haben, die beschreibt, was in der Blockchain passiert ist, können Sie damit beginnen, sie zu erkunden. Sie können zum Beispiel die Anzahl der Transaktionen seit ihrer Entstehung zählen und sehen, wie viele Adressen als Funktion der Zeit generiert werden. Der Himmel ist die Grenze für das, was Sie über Ihre Kreatur lernen können. Wir haben gerade die Voraussetzungen für Ihren Data Science-Spielplatz geschaffen. Probieren Sie es einfach aus oder informieren Sie sich in den nächsten Beiträgen über mögliche Anwendungen.

Wenden Sie sich an analytics@validitylabs.org, wenn Sie an Blockchain-Analysediensten von Validity Labs interessiert sind.