Première liaison pour Exonum: pourquoi nous avons choisi Java

Le cœur de notre cadre de développement de chaînes de blocs Exonum privées est écrit en rouille, car ce PL est axé sur la sécurité du travail avec la mémoire. Cependant, avec de nombreux avantages, Rust possède un certain nombre de fonctionnalités qui compliquent "l'interaction" avec lui: sa syntaxe est inhabituelle pour de nombreux développeurs, et le seuil d'entrée est assez élevé.

Pour simplifier le travail avec la plateforme Exonum et le rendre plus accessible au public, nous avons décidé d'écrire une bibliothèque de reliures. Le langage de liaison est devenu Java.

Pourquoi nous avons choisi Java, nous le disons sous un chat.


/ Exonum

Quelques mots sur Exonum


Exonum est notre framework open source pour développer des blockchains privées. La blockchain sur Exonum est beaucoup plus rapide que les blockchains publiques et est capable de traiter jusqu'à 5 000 transactions par seconde. À titre de comparaison, dans Ethereum, ce chiffre est de plusieurs dizaines , tandis que Bitcoin en a encore moins .

Exonum utilise un algorithme de consensus byzantin pour protéger les données. Il ne nécessite pas d'exploration et garantit la bonne exécution des transactions, même si un tiers des nœuds du réseau sont compromis.

La plateforme Exonum peut être utilisée dans tous les domaines: financier, technologique, juridique. En particulier, le cadre est adapté à la création de systèmes de gestion des droits numériques (une démonstration peut être trouvée sur le site officiel ) et à l'organisation du vote ( démo ). Dans les deux cas, tous les processus qui se produisent sont aussi transparents que possible et sont protégés par des mécanismes cryptographiques.

L'année dernière, en utilisant la plate-forme Exonum, le cadastre foncier d'État d'Ukraine a été mis en œuvre. Et avant cela, un projet de gestion des terres en Géorgie a été lancé à Exonum. Nous négocions également avec des dizaines d'entreprises du Fortune 500 et l'Union européenne pour mettre en œuvre notre système dans leurs processus commerciaux.

Le noyau d'Exonum est écrit en rouille. Le choix est justifié par le fait que ce PL se concentre sur la sécurité et la vitesse - il fonctionne plus rapidement sur certaines tâches que Java, Go, C et C ++. Dans le même temps, Rust garantit la sécurité de la mémoire et empêche les courses lorsque deux threads tentent d'accéder aux mêmes données.

Le compilateur Rust est conçu pour minimiser le nombre de bogues causés par l'influence du facteur humain. Par exemple, il élimine plusieurs classes d'erreurs au détriment du concept de durée de vie et de possession.

Toutes les valeurs de Rust ont un «domaine de propriété». Lorsqu'un nom dépasse cette portée, la ressource associée est libérée. Voici un exemple de code fourni dans la documentation officielle de Rust:

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

Si vous le «transmettez» au compilateur, cela générera une erreur:

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

Cela suggère que vec n'est pas disponible car son domaine de propriété a changé. Ainsi, «se tirer une jambe» dans le processus de développement devient beaucoup plus difficile.

Pourquoi nous avons décidé de créer une reliure


Syntaxe bruyante

Rust propose une large gamme de types de données pratiques et combinables entre eux. Cela permet de rationaliser les ensembles de valeurs dans le code et de restreindre l'accès aux données, en les protégeant contre tout accès non autorisé.

Ces fonctionnalités sont très importantes lorsque vous travaillez avec des contrats intelligents dans Exonum. Grâce à eux, les contrats «intelligents» de notre framework ont ​​plus de performances et de sécurité d'accès mémoire que par exemple les solutions Ethereum.

En général, Rust est similaire à d'autres langages impératifs (en particulier, la syntaxe de Rust ressemble à C / C ++), mais elle représente un grand nombre de concepts innovants. Il a des cycles, des conditions, des fonctions, mais en même temps des domaines de propriété et des types apparaissent. Par conséquent, il peut être difficile pour ceux qui n'ont jamais travaillé avec ce PL de lire des programmes dessus.

Au début, ils semblent «étrangers». «Pain» ajoute une gestion de mémoire inhabituelle (par rapport aux autres langages) qui rend Rust si sûr. L'automne dernier, les créateurs de Rust ont publié un sondage auprès de 5 000 membres de la communauté. Près d'un quart des répondants ont dit qu'il était difficile de travailler avec Rust.

Compilateur trop exigeant

Comme nous l'avons déjà noté, la tâche du compilateur Rust est de réduire le nombre de bogues dans le code. Le compilateur est strict pour le texte du programme, mais il affiche des options de dépannage. Dans ce cas, le compilateur affiche même des avertissements concernant le style de programmation.

Cette approche vous permet d'écrire du code fiable (ce qui est important lorsque vous travaillez avec des blockchains en général), mais elle a également un revers à la médaille. Parfois, vous devez écrire des programmes dans Rust pour que le compilateur «comprenne» que vous n'effectuez pas d'opérations de mémoire interdites. Et puisque la langue est encore jeune et continue d'évoluer, il peut ne pas y avoir de pratiques établies. Par conséquent, comme le dit le développeur d'Exonum Ilya Bogdanov, de nombreux modèles doivent être trouvés par la méthode du piquer scientifique.

Petite communauté

La troisième raison de la création de classeurs était la petite communauté de Rust. Bien que la communauté de cette langue soit assez sympathique et que ses membres soient toujours prêts à répondre aux questions, la langue «souffre» d'une petite quantité de littérature et de bibliothèques. Cependant, il sera juste de noter ici que ce problème est progressivement résolu.

Ces dernières années, Rust a activement promu Mozilla et Samsung , ce qui a un effet positif sur le nombre de bibliothèques en cours de développement et de nouveaux «wrappers» pour les solutions existantes du monde C / C ++. Les «manuels» linguistiques commencent également à apparaître progressivement. Parmi ceux qui existent déjà, il convient de souligner les « principes fondamentaux de Rust » d'Ivo Balbaert, un guide en ligne sur le site officiel et le livre récent de l'un des développeurs du projet Rust, Steve Klabnik, « The Rust Programming Language ».

Pourquoi choisir Java


L'une des principales raisons qui ont déterminé le choix a été l'immense communauté de ce PL. Selon une étude menée sur le site Stack Overflow l'année dernière, Java occupe la troisième place en popularité (seuls JavaScript et SQL l'ont adopté). Sur les 64 000 développeurs interrogés, près de 40% écrivent en Java.

En raison de la taille de la communauté, ce PL a acquis un ensemble complet d'outils. Cela inclut les IDE, les solutions analytiques, les cadres de référence, etc. Il y en a tellement que certaines entreprises obligent les développeurs à n'utiliser que des IDE et des cadres spécifiques pour éviter de diviser l'environnement de travail.

Dans le même temps, Java a une syntaxe simple et possède une interface native Java (JNI) qui peut fonctionner avec l'interface d'application binaire C (ABI). De plus, Java permet d'utiliser d'autres langages sur la pile JVM: Scala, Kotlin, Clojure.

Enfin, la machine Java est multiplateforme: le code Java est exécuté en code octet, qui est interprété et exécuté sur les plates-formes Windows, MacOS et Linux. Dans le même temps, le langage Java est plus lié à l'open source (par rapport, par exemple, à C #). Les outils de développement Java sont pour la plupart gratuits: ce sont à la fois le JDK et les environnements de développement intégrés qui en dépendent - JDeveloper, NetBeans, Eclipse, etc. En même temps, vous pouvez trouver un grand nombre de projets open source sur des ressources spécialisées (par exemple, sur GitHub ). Il existe également de nombreux manuels sur l'utilisation des technologies open source.

Défis clés dans le développement de Java Binding


Le développement de Java Binding a été long et complexe (et toujours en cours). Nous avons dû considérer toutes les fonctionnalités qui rendent Rust et Java si différents.

Par exemple, l'un des défis était d'organiser la gestion des ressources. Le fait est qu'il y a un Garbage Collector en Java, mais pas en Rust. Il a été supprimé dans l'une des versions antérieures, les développeurs étant parvenus à la conclusion qu'ils pouvaient fournir le même niveau de fiabilité en utilisant un système de type.

Java GC, bien qu'il ait augmenté la consommation de ressources (il oblige toutes les fonctions à lui renvoyer des objets inutilisés pour éviter d'éventuelles fuites de mémoire), est assez pratique. Par conséquent, nous devions implémenter un mécanisme de nettoyage des ressources que les développeurs Java souhaiteraient.

Une autre difficulté s'est avérée liée aux structures de données spécifiques présentées dans les arbres Exonum - Merkle. Exonum les utilise pour combiner les états de la chaîne de blocs en un seul hachage. Cela permet de prouver l'authenticité des transactions sans avoir à communiquer avec plusieurs nœuds de réseau complets. Cette fonctionnalité est importante pour le travail de nos clients légers, elle devait donc également être interprétée en Java.

L'API Java répète presque complètement l'API Rust. Ceci est fait pour nous faciliter l'adaptation de la documentation et simplifier le travail des utilisateurs. Nous avons préparé un guide séparé pour configurer et exécuter le nœud Exonum avec Java Binding App.

Pour créer des services en Java, vous pouvez utiliser le générateur de modèles de projets. Vous devez installer Maven 3 et exécuter la commande:

 $ 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 

Vous pouvez utiliser le mode interactif:

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

Vous trouverez un guide complet avec des exemples de configuration d'un service Java dans la documentation sur le site officiel du projet Exonum. Il existe des recommandations pour démarrer le nœud Exonum dans le référentiel sur GitHub .


/ Exonum

Plans futurs


Alors que Java Binding est en alpha. Nous prévoyons de le publier en tant que fonctionnalité à part entière et prête à l'emploi dans un avenir proche. Nous collectons maintenant les commentaires des utilisateurs afin de suivre les problèmes potentiels dans la bibliothèque et d'apporter des corrections.

Des travaux sont également en cours sur la documentation, la rédaction d'exemples de projets, les SDK pour simplifier l'intégration avec l'application sur la blockchain et améliorer l'UX en général. Vous pouvez trouver la feuille de route complète du projet dans le référentiel sur GitHub .

Là, vous pouvez prendre toutes les sources pour essayer Java Binding et écrire votre service Java pour Exonum. Si vous avez des questions, veuillez contacter notre équipe de développement chez Gitter . Ils vous le diront et vous aideront dans la mesure du possible.

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


All Articles