Cet article est un tutoriel d’initiation au code source du logiciel Duniter4j. Celui-ci vous permettra d’installer l’environnement de développement, et compiler et de lancer un noeud ElasticSearch avec le plugin Duniter4j.
A la fin de ce tutoriel, vous serez donc capable de modifier le logiciel.
Le projet Duniter4j est composé de plusieurs sous-modules :
duniter4j-core-shared: Classes utilitaires Java. Réutilisable dans d’autres projets Java autour de Duniter.
duniter4j-core-client: Ensemble de services Java permettant d’accéder à un réseau Duniter (c’est à dire une API Java client Duniter) . Cette partie est réutilisable dans d’autres applications Java.
Ce premier niveau consiste à créer votre propre version des sources du logiciel et de récupérer cette copie sur votre ordinateur. Vous y produirez :
Votre propre compte GitLab
Votre propre version du logiciel, votre fork
Une copie locale des fichiers de code source provenant de votre fork
Si vous disposez déjà d’un compte GitHub, vous pouvez passer cette étape.
Rendez-vous sur https://git.duniter.org (site en anglais). Renseigner les 3 champs proposés :
Nom d’utilisateur
Mot de passe
Vous recevrez probablement un e-mail de confirmation qu’il vous faudra valider. Une fois cette étape passée, vous devriez disposer d’un compte GitHub .
Rendez-vous à l’adresse https://git.duniter.org/clients/java/duniter4j. Cliquez sur le bouton « Fourcher » (en haut de la page)
L’installation de Git dépend de votre système d’exploitation. Suivez simplement les indications présentes sur : https://git-scm.com/
A ce stade, vous êtes en mesure de récupérer votre version du code source (votre fork), afin de pouvoir travailler dessus.
Pour récupérer le code source, lancez Git en mode console.
Sous Linux et MacOS, ouvrez tout simplement le Terminal
Sous Windows lancez le programme Git Bash :
Retournez sur la page web GitHub, puis trouvez le bouton « Clone or download » : Cliquez dessus, vous pourrez alors copier l’URL de clonage en cliquant sur l’icône de valise.
Vous n’avez plus qu’à retourner dans votre console Git et saisir :
git clone <coller l'URL copiée>
ce qui donne dans mon cas :
git clone git@git.duniter.org:clients/java/duniter4j.git Cloning into 'duniter4j'... (...) Checking connectivity... done.
Si vous êtes arrivés à un comportement similaire, bravo, vous posséder désormais le code source du projet !
Ce second niveau vise à obtenir les outils de base pour exécuter le code source, et vérifier son bon fonctionnement. Vous y réaliserez :
l’installation de Java Development Kit (JDK);
la compilation du code;
la vérification du bon fonctionnement du code source via le lancement de l’application, dans un terminal.
Si l’application se lance, vous aurez dores et déjà un environnement entièrement fonctionnel !
Sous Windows : Téléchargez puis installez un JDK (version 8 ou +) depuis le site web d’Oracle
Sous Linux (Debian) : Lancez la commande suivante :
sudo apt-get install openjdk-8-jdk
libsodium est une librairie de cryptographie.
Sous Windows : Aucune instalation nécessaire (fichier sodium.dll déjà présent dans duniter4j-core-shared/lib);
Sous Linux : suivre les notes d’installation (anglais).
Après installation, vérifiez que le fichier libsodium.so existe bien dans /usr/local/lib ou /opt/local/lib.
S’il existe, mais à une autre eplacement, veuillez créez un lien symbolique à l’un ou l’autre de ces emplacements.
Installer les outils nécessaires pour la compilation :
sudo apt-get install maven
Pour développer en Java, vous pouvez utiliser l’IDE de votre choix, par exemple :
Ce troisième niveau permet de découvrir les quelques commandes que vous utiliserez tout le temps si vous développez sur Duniter4j. Vous y apprendrez :
à configurer le projet, notamment les paramètres réseau (du noeud ES, du noeud Duniter, etc.);
à compiler le projet;
à lancer votre noeud ElasticSearch avec le plugin Duniter4j;
La configuration utilisée pour le développement est visible dans le fichier : /duniter4j-client/src/main/filtered-resources/duniter4j-client.config
Si vous avez un noeud Duniter qui est lancé localement, configurez le en modifiant les propriétés suivantes :
# # Duniter node: # duniter.node.host=localhost duniter.node.port=10901 <- à remplacer par le port de votre noeud
Si vous n’avez pas de noeud local, utiliser la configuration suivante :
# # Duniter node: # duniter.node.host=g1.duniter.org duniter.node.port=10901
La compilation du projet utilise Maven, par la commande mvn (à ne pas confondre avec nvm).
Executez la commande suivante pour compiler l’ensemble du projet :
mvn install
Si tout c’est bien passé, vous devriez obtenir quelque chose qui ressemble à cela :
(...) [INFO] Building jar: /media/data/home/blavenie/git/duniter/duniter4j/duniter4j-client/target/duniter4j-client-1.0.4-SNAPSHOT.jar [INFO] [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ duniter4j-client --- [INFO] Installing /media/data/home/blavenie/git/duniter/duniter4j/duniter4j-client/target/duniter4j-client-1.0.4-SNAPSHOT.jar to /home/blavenie/.m2/repository/org/duniter/duniter4j-client/1.0.4-SNAPSHOT/duniter4j-client-1.0.4-SNAPSHOT.jar [INFO] Installing /media/data/home/blavenie/git/duniter/duniter4j/duniter4j-client/pom.xml to /home/blavenie/.m2/repository/org/duniter/duniter4j-client/1.0.4-SNAPSHOT/duniter4j-client-1.0.4-SNAPSHOT.pom [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Duniter4j .......................................... SUCCESS [ 0.466 s] [INFO] Duniter4j :: Core Shared ........................... SUCCESS [ 1.790 s] [INFO] Duniter4j :: Core Client API ....................... SUCCESS [ 9.069 s] [INFO] Duniter4j :: Client ................................ SUCCESS [ 3.383 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 48.733 s [INFO] Finished at: 2016-11-17T11:06:16+01:00 [INFO] Final Memory: 74M/741M [INFO] ------------------------------------------------------------------------
Bravo, vous avez compilé le projet avec succès !
Il ne vous reste plus qu’à lancer un noeud local ElasticSearch, intégrant les plugins Duniter4j.
Lancez la commande suivante :
mvn install -Prun -pl duniter4j-es-assembly
Vous devriez avoir maintenant :
[2016-11-17 13:29:35,874][INFO ][transport ] [Att-Lass] publish_address {127.0.0.1:9300}, bound_addresses {[::1]:9300}, {127.0.0.1:9300} [2016-11-17 13:29:35,882][INFO ][discovery ] [Att-Lass] duniter4j-elasticsearch-TEST/HjDNQrTTSuyfmzGEbY7qNQ [2016-11-17 13:29:38,956][INFO ][cluster.service ] [Att-Lass] new_master {Att-Lass}{HjDNQrTTSuyfmzGEbY7qNQ}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-join(elected_as_master, [0] joins received) [2016-11-17 13:29:38,990][INFO ][http ] [Att-Lass] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200} [2016-11-17 13:29:38,991][INFO ][node ] [Att-Lass] started [2016-11-17 13:29:39,515][INFO ][gateway ] [Att-Lass] recovered [6] indices into cluster_state [2016-11-17 13:29:41,655][INFO ][cluster.routing.allocation] [Att-Lass] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[registry][1], [registry][1]] ...]). [2016-11-17 13:29:45,756][INFO ][node ] Checking Duniter indices... [2016-11-17 13:29:45,766][INFO ][node ] Checking Duniter indices... [OK] [2016-11-17 13:29:58,052][INFO ][duniter.blockchain ] [g1-test] [cgeek.fr:9330] Indexing last blocks...
Pour vérifier le bon fonctionnement de votre noeud ES, ouvrez un navigateur à l’adresse suivante : http://127.0.0.1:9200 (il s’agit de l’adresse par défaut d’ElasticSearch).
Vous devriez voir le contenu suivant :
Bravo, votre noeud ElasticSearch Duniter4j est fonctionnel !
Cette erreur indique qu’ElasticSearch n’a pas pu démarrer sur le port demandé.
Vous pouvez changer de port (ou l’IP), en éditant les propriétés suivantes du fichier /duniter4j-elasticsearch/src/test/es-home/config/elasticsearch.yml :
# ---------------------------------- Network ----------------------------------- # # Set the bind address to a specific IP (IPv4 or IPv6): # network.host: 192.168.233.1 <-- Remplacez par votre IP # # Set a custom port for HTTP: # http.port: 9200 <-- Remplacez par un port libre de votre machine (plage 9200-9300 par défaut)
Ouvrir votre IDE, et ouvrir le projet Duniter4j.
Dans le répertoire duniter4j-es-core/src/main/java, cherchez et répérez dans le code :
les controlleurs REST : package org.duniter.elasticsearch.rest
les services d’indexation : package org.duniter.elasticsearch.service.
Il existe un service d’indexation par type de stockage. Par exemple : BlockchainService, UserService, etc.
Dans le répertoire duniter4j-core-client/src/main/java, cherchez et répérez dans le code :
Duniter4j s’appuie sur ElasticSearch en version 2.4. D’excellentes documentations sont présentes sur le web : https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index.html.
Nous allons requeter l’indexation de la BlockChain g1-test, qui s’est fait dès le démarrage de votre noeud ElastiSearch. Nous appellons cette indexation l’ES API.
Il existe plusieurs manière de requéter un noeud ES :
Requêtes HTTP GET
Requêtes HTTP POST
En utilisant un navigateur, vous allez requêter .
Etudiez ensuite le format du résultat :
{ "_index":"g1-test", "_type":"block", "_id":"0", "_version":1, "found":true, "_source": { "number": 0, "...": "..." } }
Observez qu’ElasticSeach a ajouté des informations : _index, _type, etc.
Notez que le bloc courant est accessible en /g1-test/block/current
Notez que vous pouvez avoir une meilleure présentation en ajoutant “&pretty” dans l’adresse;
Vous pouvez rechercher sur n’importe quelle chaine (recherche full-text), via cet option “q=”
Les requetes de type POST permettent des filtrage beaucoup plus fins. C’est généralement ce type de requêtes qui est utilisées dans des logiciels clients. On peut par exemple ajouter une mise en surbrillance; requêter plusieurs index en une seule fois, etc.
Nous utiliserons curl pour requeter notre noeud ElasticSearch. Si vous ne l’avez pas encore installé, executer simplement (sous Linux) :
sudo apt-get install curl
Dans un terminal, exécuter les commandes suivantes :
curl -XGET 'http://localhost:9200/g1-test/block/_search?pretty' -d '{ "query": { "filtered" : { "filter": { "exists" : { "field" : "dividend" } } } }, "_source": ["number", "dividend", "hash", "membersCount"], size: 10000 }'
curl -XGET 'http://localhost:9200/g1-test/block/_search' -d '{ "query": { "bool": { "should": { "range":{ "number":{ "lte":100 } } } } } }'
Voici la documentation pour aller plus loin :
Duniter4j permet aussi de stocker et d’indexer les données hors BlockChain, comme celles utilisées par Cesium+ :
La document de l’API HTTP est disponible ici.
Nous allons requêter le noeud g1-test.data.duniter.fr déployé sur la monnaie Ğ1-test.
Note : Ce noeud est configuré AVEC la couche de sécurité Duniter4j. Les accès sur des URL non autorisés renverront une page vide (erreur HTTP 404).
[GET-5] Liste des pages avec le mot boulangerie : /page/record/_search?pretty&q=boulangerie
[GET-5] Liste des messages à destination de la clef 5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of : /message/inbox/_search?pretty&receiver=38MEAS…
Observez que le contenu des messages est chiffré. Seul le destinataire (recipient) peut y accéder.
curl -XPOST "https://g1-test.data.duniter.fr/page/record/_search?pretty" -d' { "query": { "bool":{ "filter": [ {"term":{ "issuer":"5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of" } } ] } }, "_source": ["title", "description", "time"], "from":0, "size":100 }'
Normalement, vous devriez récupérer au moins une page.
Note : Dans Cesium+, ce même contenu est visible ici
Notez que l’option dans cette adresse utilise q= pour la recherche full text.
Copiez la valeur du champ _id, et utilisez la dans la prochaine requête :
curl -XPOST "https://g1.data.duniter.fr/page/comment/_search?pretty" -d' { "query": { "bool":{ "filter": [ {"term":{ "record": " ... " <-- mettre ICI la valeur [_id] de la page } } ] } } }'