# Implémentation de Duniter en Rust?

**URL:** https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543
**Category:** Dunitrust
**Created:** [2 November 2017 15:25 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543 "2017-11-02T15:25:07Z")
**Posts on this page:** 20
**Page:** 2

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [3 November 2017 15:54 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/21 "2017-11-03T15:54:15Z")

</div>

> [@cgeek](#):
>
> > [@](#):
> >
> > Est-ce qu’il ne serait pas plus simple de directement stocker les clés publiques, ce qui serait aussi plus pratique pour l’implémentation complète en Rust ?
> 
> L’idée de wotb est de permettre une exécution la plus rapide et essentielle possible, car les calculs seront rapidement très coûteux (je n’ai pas la complexité algorithmique associée au calcul de distance, quelqu’un pourrait peut-être te la donner ?).

Je confirme que l’application de la règle de distances est exponentiellement croissance en besoin de calculs, il faut impérativement travailler sur des entiers, même en Rust sinon ça va vraiment ramer et beaucoup plus tôt que d’ici 2/3 ans!

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [3 November 2017 16:08 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/22 "2017-11-03T16:08:22Z")

</div>

Stocker les nœuds avec un id temporaire ou par leur clé publique réelle ne devrait pas changer la tempe de calcul, mais l’empreinte mémoire. Mais oui un `u32` est très bien. Pour accélérer l’accès aux nœuds, je vais par contre utiliser une `HashMap<u32, Node>` au lieu d’un `Vec<Node>` pour éviter de parcourir tout le tableau pour trouver le nœud voulu.

J’ai aussi changé la création de nœud pour pouvoir supprimer n’importe quel nœud sans poser de problème avec les index. D’ailleurs le code en C++, est-ce qu’il y a une vérification de la suppression des certifications données par le nœud supprimé ?

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [3 November 2017 16:10 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/23 "2017-11-03T16:10:09Z")

</div>

Super que tu te lance ! Pour wotb je ne peut hélas pas t’aider je n’ai jamais contribuer au dev de ce module 😕

---

<div class="post-metadata">

### Author: ![Inso](https://forum.duniter.org/user_avatar/forum.duniter.org/inso/32/1229_2.png) [@Inso](https://forum.duniter.org/u/Inso)
#### Post date: [3 November 2017 16:23 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/24 "2017-11-03T16:23:17Z")

</div>

L’objet Vec je serait il pas plus adapté? en s’appuyant sur le principe que l’identifiant du Node est sa position dans le Vector, l’accès se ferait en O(1) au lieu de O(log(n)) ?

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [3 November 2017 16:31 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/25 "2017-11-03T16:31:22Z")

</div>

Oui en effet, et je comprends mieux pourquoi on ne pouvait qu’insérer et supprimer en tête. Logiquement je devrais pouvoir accéder à l’index n d’un `Vec`, donc je vais modifier ça 🙂

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [3 November 2017 16:32 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/26 "2017-11-03T16:32:31Z")

</div>

> [@nanocryk](#):
>
> et je comprends mieux pourquoi on ne pouvait qu’insérer et supprimer en tête.

En effet !

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [3 November 2017 16:48 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/27 "2017-11-03T16:48:46Z")

</div>

Du coup j’en déduis que l’utilisation d’un document de révocation ne supprime pas le nœud, mais passe `enabled` à `false`, c’est bien ça ?

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [3 November 2017 17:12 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/28 "2017-11-03T17:12:40Z")

</div>

Tout à fait 🙂

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [5 November 2017 12:02 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/29 "2017-11-05T12:02:11Z")

</div>

Je viens de finir de “traduire” le calcul de distance de la WoT. Est-ce qu’il y a une WoT de test avec les résultats attendus disponibles quelque part pour écrire des tests unitaires ? Ca serait bien que mon code donne les même résultats que le votre 😛

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [5 November 2017 15:18 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/30 "2017-11-05T15:18:35Z")

</div>

Oui, dans le même projet : [https://github.com/duniter/wotb/blob/master/tests/test.js](https://github.com/duniter/wotb/blob/master/tests/test.js)

Mais comme tu le vois, c’est du JS. Tu pourras toujours traduire, ce sont juste des appels à l’API que tu as développé.

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [6 November 2017 08:15 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/31 "2017-11-06T08:15:01Z")

</div>

Merci. Je vais quand même le traduire (ou au moins une grosse partie) pour être sûr que le code Rust fait ce qu’il faut, et qu’un problème ne vienne pas du binding JS.

Tu as eu le temps de regarder vite fait ce que j’ai fait ?

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [6 November 2017 09:05 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/32 "2017-11-06T09:05:24Z")

</div>

Non, mais je vais le faire aujourd’hui !

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [6 November 2017 10:38 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/33 "2017-11-06T10:38:19Z")

</div>

J’ai jeté un coup d’œil. Le moins que je puisse dire : c’est concis ! Sans être illisible, au contraire. Bon point.

Je retrouve les concepts identiques à la version C++ de wotb (notamment le Node stocke les certifications _reçues_, ce qui n’est pas forcément naturel d’ailleurs), tu as aussi conservé les noms, merci ça aide à faire le rapprochement.

Bon je n’ai pas réussi à déboguer les TU (je ne sais pas quel fichier faire exécuter par LLDB), si tu sais comment faire je suis preneur 🙂

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [6 November 2017 10:42 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/34 "2017-11-06T10:42:32Z")

</div>

Super. Je suis en train de _traduire_ le test unitaire en JS, il me manque beaucoup de fonctions mais c’est super, je pourrais les faire en TDD du coup. Avec les structures paramétrées de Rust, j’ai même plus d’informations à l’ajout/suppression d’un lien 😛

Je code avec Visual Studio Code avec les plugins suivants :  
 ![](https://forum.duniter.org/uploads/default/original/2X/c/c57e034238d5cf5da46308caca23d431944d28db.png)

Ma config de debugging pour un autre projet est la suivante :

```json
{
        "version": "0.2.0",
        "configurations": [

            {
                "name": "(Windows) Launch",
                "type": "cppvsdbg",
                "request": "launch",
                "program": "${workspaceRoot}/target/debug/rs_renderer-3e2f419a9401b449.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${workspaceRoot}",
                "environment": [],
                "externalConsole": true
            }
        ]
    }

```

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [6 November 2017 10:46 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/35 "2017-11-06T10:46:58Z")

</div>

> [@nanocryk](#):
>
> j’ai même plus d’informations à l’ajout/suppression d’un lien 😛

Que veux-tu dire ?

> [@nanocryk](#):
>
> Pour le debug j’avoue que j’avais galéré avec un autre projet. Je vais regarder comment j’avais fait et je te dis ça.

En fait je pense que j’ai tout ce qu’il faut, simplement je ne sais pas quel fichier lancer (j’utilise VSCode). Voici la config que j’utilise, mais qui n’exécute rien :

```json
{
  // Utilisez IntelliSense pour en savoir plus sur les attributs possibles.
  // Pointez pour afficher la description des attributs existants.
  // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug",
      "program": "${workspaceRoot}/target/debug/wotb-e4f8fbca1d60d40c",
      "args": [],
      "cwd": "${workspaceRoot}"
    }
  ]
}

```

Résultat :

```
Process exited with code 0

```

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [6 November 2017 10:49 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/36 "2017-11-06T10:49:43Z")

</div>

> [@cgeek](#):
>
> Que veux-tu dire ?

```rust
// should add certs only in the boundaries of max_cert
        assert_eq!(
            wot.add_link(NodeId(0), NodeId(1)),
            NewLinkResult::Ok(1)
        );
        assert_eq!(
            wot.add_link(NodeId(0), NodeId(2)),
            NewLinkResult::Ok(2)
        );
        assert_eq!(
            wot.add_link(NodeId(0), NodeId(3)),
            NewLinkResult::Ok(3)
        );
        assert_eq!(
            wot.add_link(NodeId(0), NodeId(4)),
            NewLinkResult::AllCertificationsUsed(3)
        );

```

(J’ai la même chose pour la suppression d’un lien dans mon code de travail, dès que j’ai fini d’écrire le test (non compilable) je le commit)

> [@cgeek](#):
>
> Résultat :
> 
> Process exited with code 0

Tu dois compiler avec la commande `cargo test`, puis utiliser l’exécutable comme target.

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [6 November 2017 10:55 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/37 "2017-11-06T10:55:28Z")

</div>

Ah oui en effet, la structure de résultat de fonction est très parlante, j’aime beaucoup 🙂

> [@nanocryk](#):
>
> Tu dois compiler avec la commande cargo test, puis utiliser l’exécutable comme target.

Parfait !

![image](https://forum.duniter.org/uploads/default/original/2X/b/be547882a232c021e680ccab5452c0321816fbff.png)

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [6 November 2017 11:00 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/38 "2017-11-06T11:00:55Z")

</div>

C’est aussi pour ça que j’ai fait une _tuple struct_ `NodeId(usize)` pour empécher de passer des valeurs qui ne sont pas explicitement des id de nœuds. Le code en est beaucoup plus lisible, surtout dans les tests.

```auto
assert_eq!(wot.exists_link(NodeId(2), NodeId(0)), true);

```

Je pense que je vais faire quelques wrappers supplémentaires pour avoir les _link sentries distance_ et les _max distances_, car c’est pas très clair dans les tests (vous avez utilisez des constants pour rendre ça explicite, mais j’aimerais éviter d’en utiliser).

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [6 November 2017 14:11 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/39 "2017-11-06T14:11:39Z")

</div>

La méthode `wot.addLink(...)` retourne bien le nombre de certifs utilisées ?

Le test [wotb/tests/test.js at master · duniter/wotb · GitHub](https://github.com/duniter/wotb/blob/master/tests/test.js#L160) ne devrait pas tester une valeur de retour de 1 ?

EDIT : Okay, on dirait que c’est le nombre de certifs reçues par la destination. Pas très clair tout ça xD  
EDIT 2 : Ca marche mieux, mais chez moi le test [wotb/tests/test.js at master · duniter/wotb · GitHub](https://github.com/duniter/wotb/blob/master/tests/test.js#L202) ne passe pas (j’ai 3 au lieu de 1). Une idée ?  
Mon code actuel est commit si tu veux regarder directement dans mon code, le test qui échoue est a la ligne 667 :

```auto
running 2 tests
test wot::tests::node_tests ... ok
test wot::tests::wot_tests ... FAILED

failures:

---- wot::tests::wot_tests stdout ----
        thread 'wot::tests::wot_tests' panicked at 'assertion failed: `(left == right)`
  left: `Ok(3)`,
 right: `Ok(1)`', src\wot.rs:667:8
note: Run with `RUST_BACKTRACE=1` for a backtrace.

failures:
    wot::tests::wot_tests

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out

```

> [@cgeek](#):
>
> Il semble possible d’avoir des ponts similaires (et plus simples j’ai l’impression) pour Rust :
> 
> [GitHub - neon-bindings/neon: Rust bindings for writing safe and fast native Node.js modules.](https://github.com/neon-bindings/neon)  
> [GitHub - wtfil/rust-in-node: Running compiled rust from node](https://github.com/wtfil/rust-in-node)

J’ai regardé Neon, c’est incroyable à quel point ça devient simple à faire.

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [6 November 2017 17:14 UTC](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543/40 "2017-11-06T17:14:04Z")

</div>

> [@nanocryk](#):
>
> Ca marche mieux, mais chez moi le test [wotb/tests/test.js at master · duniter/wotb · GitHub](https://github.com/duniter/wotb/blob/master/tests/test.js#L202) ne passe pas (j’ai 3 au lieu de 1). Une idée ?

J’ai tenté de déboguer, mais je n’arrive pas à avoir un environnement de débogage correct pour aller plus loin, tout ce que je sais est que j’arrive là :

 ![image](https://forum.duniter.org/uploads/default/original/2X/d/ddfa608848c72d71f8bf27b2da7d5f356807186b.png)

Comme on peut le voir, les espions ne donnent rien. Mon environnement a besoin d’être installé correctement, mais là je suis perdu connaissant trop peu Rust.

[Previous page](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543.md?page=1)

[Next page](https://forum.duniter.org/t/implementation-de-duniter-en-rust/3543.md?page=3)
