Cet été je me suis amusé à développer un utilitaire Rust en ligne de commande: un explorateur de la DB de Duniter !
ATTENTION : Je vous déconseille très fortement de fournir un logiciel où un service basé sur la DB de Duniter directement, car tout changement dans la structure de la DB de Duniter pourra casser votre service où logiciel.
La structure de la base de donnée va notamment être entièrement refondue dans une prochaine version de Duniter, donc si vous utiliser dex pour de l’export automatisé votre code ne fonctionnera plus (vous devrez le réécrire conformément à la nouvelle structuration des données).
De plus, sachez que seuls les besoins de Duniter seront considérés dans la conception des futures versions de la base de donnée, les besoins spécifique à votre services ne seront pas considérés.
Si vous avez besoin qu’une continuité soit assurée, vous devez utiliser l’api GVA (en cours de développement).
Pourquoi Dex ?
L’idée m’est venue en utilisant SQLite Browser pour débuger Duniter. Je me suis dit que ce serait bien d’avoir l’équivalent pour leveldb (et pour sled à venir).
L’objectif premier est donc de débuger, ça peut avoir d’autres usages comme de l’export régulier de données à des fin de statistiques où à toute autre fin mais vous devez être bien conscient des risques avant de choisir d’utiliser dex
où non (cf intro).
Si quelqu’un veut ajouter le support du CSV je peux l’y aider
Comment compiler Dex
Prerequis
Vous aurez besoin d’une version récente de cmake
ainsi que des “buildessential tools”.
Si vous êtes sur debian/ubuntu où dérivé : apt install build-essential cmake
git clone https://git.duniter.org/nodes/typescript/duniter.git
cd duniter
cargo bdex
Le binaire exécutable se trouve alors ici : target/release/dex
.
Et le script d’autocomplétion là : target/release/dex.bash
zsh
et fish
sont également supportés, voir le README :
https://git.duniter.org/nodes/typescript/duniter/-/blob/feat/dex/rust-bins/duniter-dbex/README.md
Que permet Dex ?
Dex permet d’explorer les données brutes présentes dans la base de données de Duniter, de les filtrer avec des regex et autres options avancées, et de les exportées au format Json ou dans un tableau textuel.
Par exemple je peux lister tous les portefeuilles ayant au moins 20000 Ğ1 :
$ ./dex find wallet -o table-properties -p balance -v "balance\":[2-9][0-9]{6,}"
Database opened in 0.145758 seconds.
Search performed in 0.159494 seconds.
18 entries found.
+---------------------------------------------------+---------+
| Key | balance |
+=============================================================+
| SIG(2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ) | 3256534 |
|---------------------------------------------------+---------|
| SIG(2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT) | 2082576 |
|---------------------------------------------------+---------|
| SIG(4cAkMCd1N7gjz2JTA3ac5bxSCkgxUgWjpEmKkySCGRzQ) | 6927337 |
|---------------------------------------------------+---------|
| SIG(Cy49SCD2S9x6KFc8Jf9hypAXHn2SiSKF5B3xsdSgeXt2) | 2009555 |
|---------------------------------------------------+---------|
| SIG(D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx) | 2376030 |
|---------------------------------------------------+---------|
| SIG(F5cap3UX1yF1yQaA9rxCzYK9q7EMf3dwX4d6hWYp3Fh2) | 2000000 |
|---------------------------------------------------+---------|
| SIG(HjqcogJRhianwxihURoY4hpBuGm4W9voqD3dkxaWwzva) | 3147879 |
|---------------------------------------------------+---------|
| SIG(RML12butzV3xZmkWnNAmRwuepKPYvzQ4euHwhHhzvSY) | 3536832 |
|---------------------------------------------------+---------|
| SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS) | 2134988 |
|---------------------------------------------------+---------|
| SIG(c9t2jXgpPps9g32zmbEW9kYFdenGgoADC9nQrSTpZne) | 2223183 |
|---------------------------------------------------+---------|
| SIG(38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE) | 2371468 |
|---------------------------------------------------+---------|
| SIG(3zqbvxd6sDMbyHwpik56Hmsz1WUm9uiyNJnrHubzh152) | 5843396 |
|---------------------------------------------------+---------|
| SIG(4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj) | 3959018 |
|---------------------------------------------------+---------|
| SIG(78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8) | 9165199 |
|---------------------------------------------------+---------|
| SIG(CHosFQox9qTSBkPyLSVupRiHUcXawwTodYEU6iqkcZs3) | 2053529 |
|---------------------------------------------------+---------|
| SIG(GUpwrxqsYVBJru9orMteswESNoLAREzrK7xM75w42GD5) | 2080148 |
|---------------------------------------------------+---------|
| SIG(GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP) | 3035709 |
|---------------------------------------------------+---------|
| SIG(HHu6NZnpSvWtkGNnksz7ud2UtMYh7xM8KhL8JcvLvNJK) | 2071656 |
+---------------------------------------------------+---------+
Search results were displayed in 0.000842 seconds.
Comment l’utiliser
Il est nécessaire d’interrompre votre nœud Duniter afin de déverrouiller la base de données :
duniter stop
dex find <options>
duniter webstart
Vous pouvez également faire une copie de votre DB afin de pouvoir l’explorer tranquillement, attention dans ce cas il faut indiquer à dex où aller chercher la copie :
duniter stop
cp -r ~/.config/duniter/duniter_default/data ~/.config/duniter/copy1/data
duniter webstart
dex -p copy1 find <options>
Vous pouvez évidemment remplacer copy1
par le nom de votre choix
Pour les différentes commandes et options, faites dex --help
Pourquoi DBs au pluriel ?
Parce que je prévois qu’il y ait plusieurs DB leveldb (puis sled) dans le futur, notamment une pour la mempool et une pour les fiches de peer(afin de supprimer définitivement SQLite) et peut-être une pour GVA.
Dex permettra d’explorer toutes les futures DBs de Duniter, je j’ai codé de façon a ce que l’ajout d’une DB demande très peu de code coté Dex.