J’ai passé les dernières semaines à étudier l’encodeur TLV en Rust : la longueur, la valeur… la vieille astuce pour packager des données afin qu’elles puissent grandir sans casser les anciens lecteurs. Une fois que j’ai réfléchi à tout ça pour Dusk, la raison m’a sauté aux yeux. Une chaîne comme @Dusk fait transiter des messages sans arrêt, pendant que des pairs chuchotent des rumeurs, négocient des contrats, appellent des portefeuilles et se synchronisent. Tout cela a besoin d’un format qui survit à quelqu’un qui ajoutera un nouveau champ deux ans plus tard.
Rust rend la partie pénible presque ennuyeuse, et c’est exactement l’idée. Vérification des bornes. Refuser de faire confiance à un octet de longueur qui prétend lire 4 Go.
Un parseur qui panique sur une entrée incohérente est un parseur que tu ne peux pas exécuter sur un réseau où des octets aléatoires apparaissent sans invitation. Je m’en tiens aux simples tranches &[u8] : je saute les copies tant que je n’en ai pas vraiment besoin, et je m’appuie sur un enum pour l’octet de type afin que le compilateur signale tout cas que j’oublierais.
Ne saute pas le code moche qui pousse les octets. Écris-le d’abord, et écris-le de façon paranoïaque. Tout le reste que tu construis dépend du fait qu’il ne te mente pas. #dusk
$DUSK