Implémentation de Duniter en Rust?

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!

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é ?

1 « J'aime »

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 :confused:

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)) ?

2 « J'aime »

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 :slight_smile:

2 « J'aime »

En effet !

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 ?

Tout à fait :slight_smile:

1 « J'aime »

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 :stuck_out_tongue:

1 « J'aime »

Oui, dans le même projet : 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é.

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 ?

1 « J'aime »

Non, mais je vais le faire aujourd’hui !

1 « J'aime »

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 :slight_smile:

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 :stuck_out_tongue:

Je code avec Visual Studio Code avec les plugins suivants :

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

{
        "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
            }
        ]
    }
1 « J'aime »

Que veux-tu dire ?

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 :

{
  // 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
// 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)

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

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

Parfait !

image

2 « J'aime »

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.

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).

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

Le test 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 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 :

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

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

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à :

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.