Einführung in EthereumJ

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Einleitung

In diesem Artikel werfen wir einen Blick auf die EthereumJ-Bibliothek, mit der wir mithilfe von Java mit der Ethereum-Blockchain interagieren können.

Lassen Sie uns zunächst kurz darauf eingehen, worum es bei dieser Technologie geht.

2. Über Ethereum

Ethereum ist eine Kryptowährung, die eine verteilte Peer-to-Peer-Datenbank in Form einer programmierbaren Blockchain , der Ethereum Virtual Machine (EVM), nutzt. Es wird über unterschiedliche, aber verbundene Knoten synchronisiert und betrieben .

Ab 2017 synchronisieren Knoten die Blockchain durch Konsens, erstellen Münzen durch Mining ( Arbeitsnachweis ), überprüfen Transaktionen, führen in Solidity geschriebene intelligente Verträge aus und führen das EVM aus.

Die Blockchain ist in Blöcke unterteilt , die Kontostatus (einschließlich Transaktionen zwischen Konten ) und Arbeitsnachweise enthalten .

3. Die Ethereum- Fassade

Die Klasse org.ethereum.facade.Ethereum abstrahiert und vereint viele Pakete von EthereumJ zu einer benutzerfreundlichen Oberfläche.

Es ist möglich, eine Verbindung zu einem Knoten herzustellen, um eine Synchronisierung mit dem gesamten Netzwerk durchzuführen. Sobald die Verbindung hergestellt ist, können wir mit der Blockchain arbeiten.

Das Erstellen eines Fassadenobjekts ist so einfach wie:

Ethereum ethereum = EthereumFactory.createEthereum();

4. Verbindung zum Ethereum-Netzwerk herstellen

Um eine Verbindung zum Netzwerk herzustellen, müssen wir zuerst eine Verbindung zu einem Knoten herstellen , dh zu einem Server, auf dem der offizielle Client ausgeführt wird. Knoten werden durch die Klasse org.ethereum.net.rlpx.Node dargestellt .

Der org.ethereum.listener.EthereumListenerAdapter verarbeitet Blockchain-Ereignisse, die von unserem Client erkannt wurden, nachdem die Verbindung zu einem Knoten erfolgreich hergestellt wurde.

4.1. Verbindung zum Ethereum-Netzwerk herstellen

Stellen wir eine Verbindung zu einem Knoten im Netzwerk her. Dies kann manuell erfolgen:

String ip = "//localhost"; int port = 8345; String nodeId = "a4de274d3a159e10c2c9a68c326511236381b84c9ec..."; ethereum.connect(ip, port, nodeId);

Die Verbindung zum Netzwerk kann auch automatisch über eine Bean hergestellt werden:

public class EthBean { private Ethereum ethereum; public void start() { ethereum = EthereumFactory.createEthereum(); ethereum.addListener(new EthListener(ethereum)); } public Block getBestBlock() { return ethereum.getBlockchain().getBestBlock(); } public BigInteger getTotalDifficulty() { return ethereum.getBlockchain().getTotalDifficulty(); } }

Wir können dann unsere EthBean in unsere Anwendungskonfiguration einfügen . Anschließend wird automatisch eine Verbindung zum Ethereum-Netzwerk hergestellt und der Download der Blockchain gestartet.

Tatsächlich wird die meiste Verbindungsverarbeitung bequem verpackt und abstrahiert, indem lediglich eine org.ethereum.listener.EthereumListenerAdapter- Instanz zu unserer erstellten org.ethereum.facade.Ethereum- Instanz hinzugefügt wird , wie wir es in unserer obigen start () -Methode getan haben :

EthBean eBean = new EthBean(); Executors.newSingleThreadExecutor().submit(eBean::start); 

4.2. Umgang mit der Blockchain mit einem Listener

Wir können den EthereumListenerAdapter auch in Unterklassen unterteilen , um von unserem Client erkannte Blockchain-Ereignisse zu verarbeiten.

Um diesen Schritt auszuführen, müssen wir unseren untergeordneten Listener erstellen:

public class EthListener extends EthereumListenerAdapter { private void out(String t) { l.info(t); } //... @Override public void onBlock(Block block, List receipts) { if (syncDone) { out("Net hash rate: " + calcNetHashRate(block)); out("Block difficulty: " + block.getDifficultyBI().toString()); out("Block transactions: " + block.getTransactionsList().toString()); out("Best block (last block): " + ethereum .getBlockchain() .getBestBlock().toString()); out("Total difficulty: " + ethereum .getBlockchain() .getTotalDifficulty().toString()); } } @Override public void onSyncDone(SyncState state) { out("onSyncDone " + state); if (!syncDone) { out(" ** SYNC DONE ** "); syncDone = true; } } } 

Die onBlock () -Methode wird für jeden neuen empfangenen Block (ob alt oder aktuell) ausgelöst. EthereumJ repräsentiert und verarbeitet Blöcke mit der Klasse org.ethereum.core.Block .

Die onSyncDone () -Methode wird ausgelöst, sobald die Synchronisierung abgeschlossen ist, wodurch unsere lokalen Ethereum-Daten auf den neuesten Stand gebracht werden.

5. Arbeiten mit der Blockchain

Jetzt, da wir uns mit dem Ethereum-Netzwerk verbinden und direkt mit der Blockchain arbeiten können, werden wir uns mit einigen grundlegenden, aber dennoch sehr wichtigen Operationen befassen, die wir häufig verwenden werden.

5.1. Senden einer Transaktion

Nachdem wir uns mit der Blockchain verbunden haben, können wir eine Transaktion senden. Das Einreichen einer Transaktion ist relativ einfach, aber das Erstellen einer tatsächlichen Transaktion ist ein langwieriges Thema für sich:

ethereum.submitTransaction(new Transaction(new byte[]));

5.2. Greifen Sie auf das Blockchain- Objekt zu

Die Methode getBlockchain () gibt ein Blockchain- Fassadenobjekt mit Gettern zurück, um aktuelle Netzwerkschwierigkeiten und bestimmte Blöcke abzurufen .

Da wir unseren EthereumListener in Abschnitt 4.3 eingerichtet haben, können wir mit der obigen Methode auf die Blockchain zugreifen:

ethereum.getBlockchain(); 

5.3. Rückgabe einer Ethereum-Kontoadresse

Wir können auch eine Ethereum- Adresse zurückgeben.

Um ein Ethereum- Konto zu erhalten, müssen wir zuerst ein öffentliches und ein privates Schlüsselpaar in der Blockchain authentifizieren.

Erstellen wir einen neuen Schlüssel mit einem neuen zufälligen Schlüsselpaar:

org.ethereum.crypto.ECKey key = new ECKey(); 

Und erstellen wir einen Schlüssel aus einem bestimmten privaten Schlüssel:

org.ethereum.crypto.ECKey key = ECKey.fromPivate(privKey);

Wir können dann unseren Schlüssel verwenden, um ein Konto zu initialisieren . Durch Aufrufen von .init () legen wir sowohl einen ECKey als auch die zugehörige Adresse für das Account- Objekt fest:

org.ethereum.core.Account account = new Account(); account.init(key);

6. Andere Funktionen

Das Framework bietet zwei weitere wichtige Funktionen, die hier nicht behandelt werden, die jedoch erwähnenswert sind.

Erstens haben wir die Möglichkeit, Solidity-Smart-Verträge zu kompilieren und auszuführen. Das Erstellen von Verträgen in Solidity und das anschließende Kompilieren und Ausführen von Verträgen ist jedoch ein eigenständiges umfangreiches Thema.

Zweitens, obwohl das Framework begrenztes Mining mit einer CPU unterstützt, ist die Verwendung eines GPU-Miners der empfohlene Ansatz, da erstere nicht rentabel sind.

Weiterführende Themen zu Ethereum selbst finden Sie in den offiziellen Dokumenten.

7. Fazit

In diesem kurzen Tutorial haben wir gezeigt, wie Sie eine Verbindung zum Ethereum-Netzwerk herstellen und welche wichtigen Methoden für die Arbeit mit der Blockchain gelten.

Wie immer ist der in diesem Beispiel verwendete Code auf GitHub zu finden.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs