Die Blockchain in deiner Java Anwendung

kurzes Vorwort

Dieser Artikel befasst mit der Integration von Blockchain Mechanismen in Java Anwendungen. Hierbei befassen wir uns nicht mit Preisen oder insgesamt einzelnen Kryptowährungen, dies ist mir wichtig zu Beginn zu erwähnen. Im Verlaufe des Artikels nenne ich Blockchain Netzwerke, sodass ich klarstellen möchte, es handelt sich hierbei ausdrücklich nicht um Anlageberatung oder Werbung für diese Netzwerke und deren Kryptowährungen. Es handelt sich um eine technische Erklärung der Integration von Blockchain in Java mit Web3j.

Blockchain

Den Grundgedanken von verteilten Systemen, welche über eine gemeinsame Datenhaltung verfügen und diese gemeinsam verwalten, existiert schon sehr lange. Veröffentlichung des ersten Whitepaper zum bisher größten und bekanntesten Blockchain-Netzwerk Bitcoin war am 1. November 2008 über eine Mailing Liste durch das Pseudonym Satoshi Nakamoto und ist heute noch online einsehbar. Der erste Block, der sogenannter Genesis Block, wurde anschließend am 03. Januar 2009 “gemined”. Durch diesen ersten Block wurde das Bitcoin Netzwerk in Betrieb genommen wurde.

Die Blockchain ist eine verteilte Hauptbuch(Ledger)-Technologie, verwaltet von einem Peer-to-Peer-Netzwerk. Im Wesentlichen handelt es sich um eine dezentrale bzw. verteilte Datenbank, welche allen Beteiligten den Zugriff und die Verifizierung ermöglicht, wodurch ein vertrauenswürdiger und transparenter Austausch von Daten gewährleistet ist. Dieser dezentrale Ansatz steht im Gegensatz zu traditionellen, zentralisierten Systemen, in denen eine einzelne Instanz Kontrolle über die Datenbank erlangen oder ausüben kann.

Zusammengesetzt wird der Begriff Blockchain bekanntermaßen aus den Begriff “Block” und “Chain”. Ein Block beinhaltet verschiedene Daten, welche in den meisten Blockchain Netzwerken durch Transaktionen widergespiegelt werden. Eine gewisse Anzahl an Transaktionen zusammen mit spezifische Daten wie einer Schwierigkeit, Blocknummer, Blockhash usw ergibt einen Block. Die Chain kommt dann ins Spiel, wenn der zweite Block den ersten referenziert (dessen Blockhash). Durch diese Verlinkung ist eine gesicherte, simple Reihenfolge gegeben und die Blöcke verknüpft (siehe folgende Abbildung).

Blockchain_hash_explained

Analog zur Funktionsweise des Internets, welches den freien Austausch von Informationen ermöglicht, fördert die Blockchain den nahezu ungehinderten Austausch von digitalen Werten. Im Gegensatz zum Internet genügt allerdings nicht nur Zugriff auf das Netzwerk, sondern ich benötige auch eine sogenannte Wallet (speziell den privaten Schlüssel), um neue Transaktionen in die Blockchain zu verteilen. Mit Hilfe des privaten Schlüssels kann ich nun eine Nachricht an das Netzwerk signieren. Mit dieser Signatur ist sichergestellt, dass jeder Teilnehmer die Legitimtät und Herkunft dieser Nachricht überprüfen kann.

Blockchain hat den Sektor der Finanztransaktionen grundlegend revolutioniert und beeinflusst, sie ermöglicht sichere, transparente und effiziente Transaktionen. Im Laufe der Zeit sind jedoch auch zahlreiche andere Anwendungsbereiche hinzugekommen, zu nennen sind hier die Immobilienwirtschaft, das Lieferkettenmanagement, Wahlsysteme und der Schutz geistigen Eigentums.

Smart Contracts

Ein Smart Contract ist ein formfreier digitaler Vertrag, welcher unter anderem einen eigenen Akteuer in einer Blockchain darstellt. Als eigener Akteuer mit eigener Blockchain Adresse kann er dann in der Regel auch Kryptowerte wie bsplw. Tokens empfangen, verwalten und wieder versenden. Die Ausführung der Funktionen geschieht dezentral auf einer Vielzahl von Knotenpunkten des Netzwerkes, wobei das Ergebnis für alle Parteien identisch bleibt. Ein Smart Contract ist wie andere Transaktionen auf der Blockchain ebenfalls transparent und unveränderlich.

Ein passendes Beispiel, welches ich mal bei dem Linux Foundation Decentralized Trust gelesen habe, ist ein Verkaufsautomat. Ich gebe etwas in den Automaten/Contract hinein (2 Euro Münze / einen Anteil einer Kryptowährung) und der Automat ist so programmiert, dass ich dafür einen Gegenwert erhalte (Flasche Wasser / Finanzprodukt wie zB eine Aktie).

Zusammengefasst sind Smart Contracts eine innovative Möglichkeit, Verträge effizient und sicher abzuwickeln, indem sie die Vorteile der Blockchain-Technologie nutzen.

Beliebte Smart Contract Programmiersprachen sind Solidity, Vyper, Yul, Cairo und Rust.
Wobei Solidity vermutlich die verbreiteteste dieser Sprachen ist und Rust außerhalb der Blockchain Thematik die bekannteste Sprache der genannten darstellen dürfte.

Um einen ersten Eindruck zu Solidity zu erhalten, gibt es hier einen kurzes Minimalbeispiel:

pragma solidity 0.8.15;

contract HelloWorld {
 
    function getHelloWorld() public pure returns (string memory) {
        return "Hello World";
    }
}

Web3j Bibliothek

Eine Transatkion in bspwl. dem Ethereum Netzwerk kann auf den ersten Blick sehr komplex wirken. Hierbei gibt es die Möglichkeiten eines Transfers von Ether (der Währung innerhalb Ethereums), eines Smart Contract Deployments oder eines Smart Contract Funktionsaufrufs. All diese Vorgänge sind Transaktionen innerhalb der Blockchain. In der kommenden Abbildung ist eine solche schematische Darstellung einer Transaktion zu sehen.

Ethereum Blockchain Transaktion - Web3j

Wenn wir allerdings uns einen Standard HTTPS Aufruf vorstellen, gibt es hier ebenfalls verschiedenen Ebenen zu beachten und einen Austausch von Zertifikaten für den SSL Handshake. Im Endeffekt sind wir hier gar nicht so weit von diesem Gedanken entfernt, es ist nur eine etwas andere Herangehensweise.

Nachdem eine solche Transaktion nun zusammengestellt ist, kann sie durch den Sender mit Hilfe seines privaten Schlüssel signiert werden. Diese Signatur sollte eine Applikation immer lokal erzeugen, sodass private Schlüssel nicht weitergegeben werden und in ausschließlich privatem Besitz und Zugriff bestehen bleiben. Der gesamte Prozess rund um das Erstellen und Signieren der Transaktion müsste ohne gesonderte Bibliothek zur Integration in Java einzeln durchgeführt werden.

Die Web3j Bibliothek abstrahiert und übernimmt zu großen Teilen diese Komplexität. Die nachfolgende Abbildung visualisiert diese Abstraktion und verdeutlicht die Vereinfachung.

Web3j Netzwerk

Der Entwickler kann sich nun wieder auf die Entwicklung der eigentlichen Java Applikation und deren Use Cases konzentrieren. Ein genauer Einblick in die Smart Contracts und Transaktionsdurchführung ist an dieser Stelle nicht zwingend notwendig. Im folgenden Abschnitt wird außerdem ein Java Beispiel aufgezeigt, bei dem dies klar wird.

Integration in Java mit Maven

Die Integration von Web3j in Java kann über Maven erfolgen, indem lediglich das entsprechende Maven Repository als Dependency in der pom.xml eingetragen werden muss.

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>${web3j-core.version}</version>
</dependency>

Zusätzliche empfiehlt es sich, das Web3j Maven Plugin noch als Build Plugin aufzunehmen.

<build>
    <plugins>
        <plugin>
            <groupId>org.web3j</groupId>
            <artifactId>web3j-maven-plugin</artifactId>
            <version>${web3j-maven-plugin.version}</version>
            <configuration>
                <soliditySourceFiles/>
            </configuration>
        </plugin>
    </plugins>
</build>

Eine detaillierte Beschreibung zur Parametrisierung existiert auf der offiziellen Docs Seite von Web3j. Mit diesem Setup können wir nun aus Smart Contracts Java Wrapper Klassen generieren. Der Befehl zur Generierung lautet wie folgt:

mvn web3j:generate-sources

Unterhalb ein Beispiel für eine generierte HelloWorld Java Wrapper Klasse für den weiter oben geschriebenen Solidity Smart Contract:

public class HelloWorld extends Contract {

    public RemoteFunctionCall<String> getHelloWorld() {...}

    public static HelloWorld load(....) {...}
    public static RemoteCall<HelloWorld> deploy(....) {...}
}

Diese generierten Klassen beinhalten immer die Funktionen “load” und “deploy” und alle extern (external oder public) möglichen Funktionsaufrufe. Load bezieht sich dabei auf das Laden der Struktur eines Smart Contracts und Hinterlegen der Contract Addresse. Deploy bezieht sich auf das Packen und Veröffentlichen eines neuen Contracts auf der Blockchain – analog vorstellbar zu einem Constructor oder einem HTTP Post.

<contract name>.<function name>([param1, ...., paramN]).[send() | sendAsync()];

Um in unserem Beispiel aus dem Smart Contract Abschnitt zu bleiben, wäre der ein mögliches Szenario, um den generierten Java Code nutzen zu können, folgendes:

Web3j web3j = Web3j.build(new HttpService("someAddress.de"));
Credentials credentials = WalletUtils.loadCredentials("password", keyFile);
DefaultGasProvider gasProvider = new DefaultGasProvider();

HelloWorld helloWorld = HelloWorld.deploy(web3j, credentials, gasProvider).send();
helloWorld.getHelloWorld().send();

> "Hello World"

Der o.g. Code beinhaltet unter anderem auch den Verbindungsaufbau zu einem Blockchain Knotenpunkt, die Credentials (Adresse, Public & Private Key) zur Generierung der Signatur und die Transaktionsgebühren (GasFee). Anschließend wird der “HelloWorld” Smart Contract als Java Objekt aufgerufen und deployed. Nach dem Deployment folgt noch der “getHelloWorld” Aufruf. Dieser Funktionsaufruf liefert einen String zurück, welcher in der Java Applikation weiter genutzt und verwertet werden kann.

Schwierigkeiten der Integration

So einfach integrieren wir die Blockchain in Java mit Web3j. Naja fast, natürlich benötigen wir auch ein passendes WalletFile, eine Verbindung zu einer Blockchain Node und etwas der Währung, um unsere Transaktionen auch bezahlen zu können.

Manche Blockchain Systeme nehmen uns auch Teile dieser “Probleme” ab, indem zB Transaktionsgebühren durch andere Kostenmodelle oder andere Beteiligte getragen werden. Teils bieten auch Dienstleister Schnittstellen an und vereinfachen diese Zugriffe. Aber brauchen wir dann noch Blockchain, wenn wir dem Dienstleister vertrauen müssen, dass er unsere Transaktion wie von uns erwartet ausführt? Möchten wir die volle Souveränität der Transaktionen, sollten wir diese auch selber erstellen und in das Netzwerk geben. Nur so können wir sicher sein, dass sie dort auch wie gewünscht ankommen und in unserem Sinne handeln.

Beispielprojekt

Verlinkt wird an dieser Stelle noch ein Projekt meines persönlichen GitHub Accounts. In diesem Projekt wurde die Einbindung der Web3j Bibliothek gemeinsam mit der automatisierten Generierung von Java Code vereint. Inbegriffen ist hier auch ein Wallet mit genügend Testnetzwerk Währung, um etwas herumzuspielen. Sollte es zu Problemen oder Schwierigkeiten kommen, helfe ich gerne.

Beispiel aus der Praxis

In der Praxis können wir viele Firmen sehen, welche sich mit Begriffen rund um Blockchain, NFTs, Smart Contracts, usw schmücken. Welche Technologien dann konkret hinter den Publikationen stecken, sehen wir nur sehr selten.

Als ein sehr positives Beispiel lässt sich hierbei ein offener Standard der DZ BANK AG nennen, welche nach eigenen Angaben Finanzprodukte über Smart Contracts rechtlich bindend gehandelt haben. Ein solches Finanzprodukt ist hierbei der sogenannte Smart Derivative Contract, unter welchem noch weitere Publikationen mit technischen Beschreibungen und ersten Referenzimplementierungen existieren.

Fazit

Viele Java Entwickler stellen sich an diesem Moment sicherlich die Frage, ob sie ebenfalls in einem Blockchain Projekt arbeiten könnten.

Generell gibt es natürlich Hürden für die Verknüpfung von Blockchain in Java mit Web3j, welche durch die Abstraktion von Web3j deutlich erleichtert werden, sodass sich ein Java Entwickler in der Regel sehr gut in die Thematik einleben kann.
Ein bestimmtes Vorwissen in diesem Bereich ist nicht immer zwingend notwendig, entscheidend sind die konkreten Aufgaben. Interesse und eine gewisse Begeisterung können jedoch – wie in vielen anderen Themen – den Einstieg und ein Grundverständnis der Aufgaben erleichtern.
In entsprechenden Projekten kann der Entwickler dann auch sehr viel über Blockchain und deren Anwendungszwecke lernen.

Ein Minimalbeispiel ist hier zügig umsetzbar und sehr anschaulich, wie im oberen Java Beispiel gezeigt.

In diesem Sinne, keine Angst, spielt damit herum und erkundet die Welt der Blockchain. Oder um es in Simon Seiters abschließenden Worten einer Konferenz Panel Discussion zu sagen: “sail the ships […] leave your island and discover the free world of public chains”

Total
0
Shares
Previous Post

MockServer NeoLight: Eine schlanke Alternative für API-Tests mit Testcontainers

Next Post

Wie und warum man das klassische Observer-Pattern in Vaadin verwenden soll

Related Posts