Erste Bindung für Exonum: Warum wir uns für Java entschieden haben

Der Kern unseres Frameworks für die Entwicklung privater Exonum-Blockchains ist in Rust geschrieben, da sich dieser PL auf die Sicherheit der Arbeit mit dem Speicher konzentriert. Neben vielen Vorteilen bietet Rust jedoch eine Reihe von Funktionen, die die "Interaktion" damit erschweren: Die Syntax ist für viele Entwickler ungewöhnlich, und die Eintrittsschwelle ist recht hoch.

Um die Arbeit mit der Exonum-Plattform zu vereinfachen und dem Publikum zugänglicher zu machen, haben wir beschlossen, eine verbindliche Bibliothek zu schreiben. Die Sprache für die Bindung ist Java geworden.

Warum wir uns für Java entschieden haben, erzählen wir unter einer Katze.


/ Exonum

Ein paar Worte zu Exonum


Exonum ist unser Open Source Framework für die Entwicklung privater Blockchains. Die Blockchain auf Exonum ist viel schneller als öffentliche Blockchains und kann bis zu 5.000 Transaktionen pro Sekunde verarbeiten. Zum Vergleich: In Ethereum sind es mehrere Dutzend , in Bitcoin sogar noch weniger .

Exonum verwendet einen byzantinischen Konsensalgorithmus, um Daten zu schützen. Es erfordert kein Mining und garantiert die korrekte Ausführung von Transaktionen, selbst wenn ein Drittel der Netzwerkknoten gefährdet ist.

Die Exonum-Plattform kann in allen Bereichen eingesetzt werden: finanziell, technologisch, rechtlich. Das Framework eignet sich insbesondere zur Erstellung digitaler Rechteverwaltungssysteme (eine Demo finden Sie auf der offiziellen Website ) und zur Organisation von Abstimmungen ( Demo ). In beiden Fällen sind alle auftretenden Prozesse so transparent wie möglich und durch kryptografische Mechanismen geschützt.

Im vergangenen Jahr wurde mithilfe der Exonum-Plattform das Staatslandkataster der Ukraine implementiert. Zuvor wurde in Exonum ein Landmanagementprojekt in Georgia gestartet. Wir verhandeln auch mit Dutzenden von Fortune 500-Unternehmen und der Europäischen Union über die Implementierung unseres Systems in ihre Geschäftsprozesse.

Der Kern von Exonum ist in Rust geschrieben. Die Wahl wird durch die Tatsache gerechtfertigt, dass sich dieser PL auf Sicherheit und Geschwindigkeit konzentriert - er funktioniert bei einigen Aufgaben schneller als Java, Go, C und C ++. Gleichzeitig garantiert Rust die Speichersicherheit und verhindert Rennen, wenn zwei Threads versuchen, auf dieselben Daten zuzugreifen.

Der Rust-Compiler wurde entwickelt, um die Anzahl der Fehler zu minimieren, die durch den Einfluss des menschlichen Faktors verursacht werden. Beispielsweise werden mehrere Fehlerklassen auf Kosten des Konzepts der Lebensdauer und des Besitzes beseitigt.

Alle Werte in Rust haben eine "Eigentumsdomäne". Wenn ein Name diesen Bereich überschreitet, wird die zugehörige Ressource freigegeben. Hier ist ein Beispielcode, der in der offiziellen Rust-Dokumentation enthalten ist:

fn use_vec() { let vec = make_vec(); //   print_vec(vec); //   print_vec for i in vec.iter() { //   vec println!("{}", i * 2) } } 

Wenn Sie es dem Compiler "zuführen", wird ein Fehler generiert:

 error: use of moved value: `vec` for i in vec.iter() { ^~~ 

Dies deutet darauf hin, dass vec nicht verfügbar ist, da sich sein Eigentumsbereich geändert hat. Daher wird es viel schwieriger, sich im Entwicklungsprozess ein Bein zu schießen.

Warum wir uns entschieden haben, Bindung zu schaffen


Laute Syntax

Rust bietet eine bequeme und breite Palette von Datentypen, die miteinander kombiniert werden können. Auf diese Weise können Wertesätze im Code optimiert und der Zugriff auf Daten eingeschränkt werden, um sie vor unbefugtem Zugriff zu schützen.

Diese Funktionen sind sehr wichtig, wenn Sie mit intelligenten Verträgen in Exonum arbeiten. Dank ihnen bieten die „intelligenten“ Verträge unseres Frameworks mehr Leistung und Speicherzugriffssicherheit als beispielsweise Ethereum-Lösungen.

Im Allgemeinen ähnelt Rust anderen imperativen Sprachen (insbesondere ähnelt die Rust-Syntax C / C ++), repräsentiert jedoch eine große Anzahl innovativer Konzepte. Es hat Zyklen, Bedingungen, Funktionen, aber gleichzeitig erscheinen Eigentumsbereiche und Typen. Daher kann es für diejenigen, die noch nie mit diesem PL gearbeitet haben, schwierig sein, Programme darauf zu lesen.

Auf den ersten Blick wirken sie „fremd“. "Pain" fügt eine ungewöhnliche Speicherverwaltung hinzu (im Vergleich zu anderen Sprachen), die Rust so sicher macht. Im vergangenen Herbst veröffentlichten die Macher von Rust eine Umfrage unter 5.000 Mitgliedern der Community. Fast ein Viertel der Befragten gab an, dass es schwierig sei, mit Rust zu arbeiten.

Zu anspruchsvoller Compiler

Wie bereits erwähnt, besteht die Aufgabe des Rust-Compilers darin, die Anzahl der Fehler im Code zu reduzieren. Der Compiler hält sich strikt an den Text des Programms, zeigt jedoch Optionen zur Fehlerbehebung an. In diesem Fall zeigt der Compiler sogar Warnungen bezüglich des Programmierstils an.

Dieser Ansatz ermöglicht es Ihnen, zuverlässigen Code zu schreiben (was bei der Arbeit mit Blockchains im Allgemeinen wichtig ist), hat aber auch eine Kehrseite der Münze. Manchmal müssen Sie Programme in Rust schreiben, damit der Compiler „versteht“, dass Sie keine verbotenen Speicheroperationen ausführen. Und da die Sprache noch jung ist und sich weiterentwickelt, gibt es möglicherweise keine etablierten Praktiken. Daher müssen, wie der Entwickler von Exonum Ilya Bogdanov sagt, viele Muster durch die Methode des wissenschaftlichen Stocherns gefunden werden.

Kleine Gemeinde

Der dritte Grund für die Erstellung von Bindemitteln war die kleine Rust-Community. Obwohl die Gemeinschaft dieser Sprache sehr freundlich ist und ihre Mitglieder immer bereit sind, Fragen zu beantworten, leidet die Sprache unter einer kleinen Menge an Literatur und Bibliotheken. Es ist jedoch fair anzumerken, dass dieses Problem schrittweise gelöst wird.

In den letzten Jahren hat Rust Mozilla und Samsung aktiv beworben , was sich positiv auf die Anzahl der zu entwickelnden Bibliotheken und neuen „Wrapper“ für bestehende Lösungen aus der C / C ++ - Welt auswirkt. Sprachliche „Lehrbücher“ erscheinen ebenfalls allmählich. Von den bereits existierenden ist es wert, die „ Rust Fundamentals “ von Ivo Balbaert hervorzuheben, einen Online-Leitfaden auf der offiziellen Website und das kürzlich erschienene Buch eines der Entwickler des Rust-Projekts, Steve Klabnik, „ The Rust Programming Language “.

Warum Java wählen?


Einer der Hauptgründe für die Wahl war die große Community dieses PL. Laut einer Studie, die letztes Jahr auf der Stack Overflow-Site durchgeführt wurde, steht Java an dritter Stelle der Popularität (nur JavaScript und SQL haben es bestanden). Von den 64.000 befragten Entwicklern schreiben fast 40% in Java.

Aufgrund der Größe der Community hat dieser PL eine umfangreiche Reihe von Tools erworben. Dies umfasst IDEs, analytische Lösungen, Benchmark-Frameworks usw. Es gibt so viele davon, dass einige Unternehmen Entwickler dazu verpflichten , nur bestimmte IDEs und Frameworks zu verwenden, um eine Aufteilung der Arbeitsumgebung zu vermeiden.

Gleichzeitig verfügt Java über eine einfache Syntax und eine Java Native Interface (JNI), die mit der C Application Binary Interface (ABI) zusammenarbeiten kann. Darüber hinaus ermöglicht Java die Verwendung anderer Sprachen im JVM-Stack: Scala, Kotlin, Clojure.

Und schließlich ist die Java-Maschine plattformübergreifend: Java-Code wird in Byte-Code ausgeführt, der auf Windows-, MacOS- und Linux-Plattformen interpretiert und ausgeführt wird. Gleichzeitig ist die Java-Sprache stärker an Open Source gebunden (im Vergleich beispielsweise zu C #). Die Java-Entwicklertools sind größtenteils kostenlos: Sie sind sowohl das JDK als auch die darauf basierenden integrierten Entwicklungsumgebungen - JDeveloper, NetBeans, Eclipse usw. Gleichzeitig finden Sie eine Vielzahl von Open Source-Projekten auf speziellen Ressourcen (z. B. auf GitHub ). Es gibt auch viele Handbücher zum Arbeiten mit Open Source-Technologien.

Wichtige Herausforderungen bei der Entwicklung von Java Binding


Die Entwicklung von Java Binding war lang und komplex (und dauert noch an). Wir mussten alle Funktionen berücksichtigen, die Rust und Java so unterschiedlich machen.

Eine der Herausforderungen war beispielsweise die Organisation des Ressourcenmanagements. Der Punkt ist, dass es in Java einen Garbage Collector gibt, aber nicht in Rust. Es wurde in einer der früheren Versionen entfernt, als die Entwickler zu dem Schluss kamen, dass sie mit einem Typsystem das gleiche Maß an Zuverlässigkeit bieten können.

Java GC ist sehr praktisch, obwohl es den Ressourcenverbrauch erhöht hat (es zwingt alle Funktionen, nicht verwendete Objekte zurückzugeben, um potenzielle Speicherlecks zu vermeiden). Daher mussten wir einen Mechanismus zur Ressourcenbereinigung implementieren, den Java-Entwickler wünschen.

Eine weitere Schwierigkeit hing mit den spezifischen Datenstrukturen in Exonum-Merkle-Bäumen zusammen. Exonum verwendet sie, um Blockchain-Zustände zu einem einzigen Hash zu kombinieren. Dies ermöglicht den Nachweis der Authentizität von Transaktionen, ohne mit mehreren vollständigen Netzwerkknoten kommunizieren zu müssen. Diese Funktionalität ist wichtig für die Arbeit unserer Light-Clients, daher musste sie auch in Java interpretiert werden.

Die Java-API wiederholt die Rust-API fast vollständig. Dies geschieht, um uns die Anpassung der Dokumentation zu erleichtern und die Arbeit für die Benutzer zu vereinfachen. Wir haben eine separate Anleitung zum Konfigurieren und Ausführen des Exonum-Knotens mit der Java Binding App erstellt.

Um Dienste in Java zu erstellen , können Sie den Vorlagengenerator von Projekten verwenden. Sie müssen Maven 3 installieren und den folgenden Befehl ausführen:

 $ mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype \ -DgroupId=com.example.myservice \ -DartifactId=my-service \ -Dversion=1.0 

Sie können den interaktiven Modus verwenden:

 $ mvn archetype:generate \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype 

Eine vollständige Anleitung mit Beispielen zum Einrichten eines Java-Dienstes finden Sie in der Dokumentation auf der offiziellen Exonum-Projektwebsite. Es gibt Empfehlungen zum Starten des Exonum-Knotens im Repository auf GitHub .


/ Exonum

Zukunftspläne


Während Java Binding in Alpha ist. Wir planen, es in naher Zukunft als vollwertiges und vorgefertigtes Feature zu veröffentlichen. Jetzt sammeln wir Feedback von Benutzern, um potenzielle Probleme in der Bibliothek zu verfolgen und Korrekturen vorzunehmen.

Außerdem wird an der Dokumentation gearbeitet, Beispielprojekte und SDKs geschrieben, um die Integration in die Anwendung in der Blockchain zu vereinfachen und UX im Allgemeinen zu verbessern. Die vollständige Roadmap des Projekts finden Sie im Repository auf GitHub .

Dort können Sie alle Quellen nutzen , um Java Binding zu testen und Ihren Java-Dienst für Exonum zu schreiben. Bei Fragen wenden Sie sich bitte an unser Entwicklungsteam bei Gitter . Sie werden so weit wie möglich erzählen und helfen.

Source: https://habr.com/ru/post/de423441/


All Articles