Bonjour,
le projet « Cocorico » (la plateforme de vote) avance à vive allure, notamment en raison de son utilisation pour le 1er tour de LaPrimaire.org qui s’est terminé le 6/11 ! Un article plus détaillé sur le déroulement de ce premir tour sera publié par la suite (comprendre : quand j’aurais eu le temps de l’écrire). Voilà déjà un récapitulatif sommaire des changements apportés depuis le 6/10.
Merci à Thibauld pour son travail d’intégration/test dans LaPrimaire.org.
Les résultats de ce premier tour sont disponibles ici :
1. Passage à l’échelle
De grosses portions du code ont été réécrites pour répondre à des problèmes de performance/passage à l’échelle. Notamment le service qui gère l’enregistrement des bulletins de vote dans la blockchain (cf 7.).
Au final, le 1er tour aura permis d’effectuer 53 000 votes, soit presque 160 000 transactions blockchain. C’est l’équivalent de 3 jours complets de fonctionnement mondial de la blockchain Ethereum. Ce qui classe très probablement ce 1er tour dans le top des plus « grosses » applications blockchain réalisées à ce jour.
2. Cache entre l’API Web et la blockchain
Une fois le vote terminé, la récupération des résultats et l’exploration de l’urne numérique était relativement lente/couteuse : chercher/trouver/récupérer plusieurs milliers de transactions blockchain a chaque affichage de page s’est révélè être trop couteux.
Un système de cache a été mis en place pour éviter que chaque chargement de page de résultat aille interroger directement la blockchain.
Ce cache ne concerne que la lecture des données de la blockchain une fois le vote terminé.
3. Modération automatique
Plusieurs attaques ont été constatées pendant le déroulement du 1er tour de LaPrimaire.org. Je ne rentrerais pas dans les détails ici, mais pour faire simple :
- deux vecteurs d’attaque ont été décelés dans l’API Web, notamment pour tenter de forger de fausses identités, probablement dans le but de bourrer les urnes;
- un autre, plus générique, a été décelé dans des tentatives de bruteforce pour se connecter aux serveurs en tant qu’administrateur ;
- enfin, il y’a également eu des tentatives de vol de mon compte Facebook ou d’autres comptes (Dropbox, email) des organisateurs de LaPrimaire.org.
Bien qu’aucune de ces attaques n’aie à priori réussie, elles représentaient un risque inutile et, surtout, utilisaient énormément de ressources. Certaines IPs avaient par exemple tenté plusieurs dizaines de millier d’authentifications invalides…
Un système de modération automatisée a été mis en place pour couper le traffic venant d’adresses IP « suspicieuses ». La documentation correspondante est ici.
Il est également possible de blacklister/whitelister manuellement des adresses IP via l’interface d’admin.
4. Gestion du temps de vie des sessions
Pour des raisons de sécurité, les utilisateurs avaient 10 minutes pour voter. Au delà de cette limite, leur jeton d’identité n’était plus valide. Ce cas précis n’était pas géré dans l’interface, et un vote effectué avec un jeton d’identité périmé - bien que n’étant jamais enregistré - faisait entrer l’application Web dans un état dégénéré.
Cela a également provoqué un certain nombre de faux positifs de modération automatisée, et certains utilisateurs (une infime minorité) ont été blacklistés à tort (ils ont ensuite été dé-blacklistés à la main).
Pour éviter ces deux problèmes, l’application Web détecte maintenant que le jeton d’identité est périmé et prévient l’utilisateur qu’il n’a pas/plus le droit de voter.
5. Support d’Opéra
Opéra est maintenant supporté en version 41.
6. Rotation des fichiers de log
Les fichiers de logs sont aujourd’hui archivés jour par jour, pour éviter d’avoir des fichiers de log de plusieurs Go (pendant le 1er tour, certains fichiers de log ont atteints plus de 30Go).
7. Réécriture complète du service d’enregistrement des bulletins sur la blockchain
En cas de plantage, l’implémentation précédente du service d’enregistrement des bulletins de vote sur la blockchain n’était pas très résiliente. Par exemple, les bulletins en cours de traitement lors du plantage avaient de forte chance de ne pas être traités correctement lorsque le service récupérait/redémarrait (un certain nombre de sécurités étant en place, ça ne pouvait pas donner lieu à un double vote mais plutot à des bulletins bloqués).
Une infime minorité de bulletins sont concernés (ça a relativement peu planté vu que je ne dormais quasiment pas pour tout mettre sur pause au moindre problème ). Mais, au delà d’un plantage éventuel, il était primordial de pouvoir redémarrer ce service (après une mise à jour par exemple) sans avoir ce genre de soucis.
Le traitement de chaque bulletin de vote est maintenant divisé en étapes bien séparées et indépendantes, et lorsque le service redémarre il peut reprendre à l’étape correspondante pour chaque bulletin.
8. Réécriture en ES6
Le code de l’API Web et des services a été entièrement réécrit en EcmaScript6, un standard JavaScript plus moderne, pour une meilleure lisibilité/maintenabilité.
A votre disposition si vous avez des questions !