Synthèse de la technologie
Tout Proof-of-Draw sur une seule page : ce que le système fait, comment les appareils calculent et votent, ce que la chaîne garantit et ce qu’elle ne garantit pas encore. Le travail restant est détaillé dans la feuille de route, tout en bas de la page.
En une page
Proof-of-Draw est un réseau ouvert où des artistes dessinent dans un navigateur ; de petits ordinateurs (ESP8266, Arduino UNO R4 WiFi) relisent l’œuvre, recalculent son empreinte et des mesures de complexité, et signent leur vote ; l’œuvre rejoint alors une chaîne de blocs et s’affiche sur des écrans physiques (e-ink, OLED, TFT).
Architecture : qui fait quoi
| Élément | Rôle | Technologie |
|---|---|---|
| Navigateur | Dessin pixel-exact, atelier d’animation, profil, vue Réseau | Next.js, canvas, moteur de dessin pur |
| Serveur | Admission des candidats, quorum, chaîne, distribution des frames | Routes API Next.js sans état (Vercel) |
| Registre | Candidat courant, votes, blocs, appareils (sans expiration pour les blocs) | Upstash Redis |
| Appareil | Interroge le serveur, relit, calcule, signe, affiche | ESP8266 ou UNO R4 WiFi, Ed25519, SHA-256 |
| Écran | Affiche l’œuvre et son cartel | OLED 0,96″, e-ink 2,7″ / 2,9″, TFT 1,8″ / 2,8″ |
Les appareils n’ouvrent jamais de port : ils appellent le serveur (architecture « pull »). Ils fonctionnent donc derrière n’importe quel routeur, sans exposer d’adresse locale.
Du dessin au bloc, étape par étape
Dessiner
Le navigateur (Pod Studio) produit une image pixel-exacte pour l’écran visé et enregistre la séquence de gestes. Le serveur la reçoit avec une session signée (HMAC-SHA256).
Soumettre
Le serveur rejette les séquences trop automatiques, calcule l’empreinte de l’image (SHA-256), celle des gestes et un score de dessin, puis publie UN candidat à la fois.
Annoncer
Pour une image fixe, le candidat porte une spécification « v2 » : type d’écran, taille en octets et SHA-256 du contenu brut. Les cartes la lisent dans une réponse très légère.
Relire
Chaque carte télécharge le contenu brut du candidat (octets exacts de l’écran, servis par un CDN) et le lit en flux : le firmware évite de recopier l’image dans un second buffer complet.
Recalculer
Pendant la lecture, la carte calcule le SHA-256 et trois métriques entières. Elle décide d’un verdict objectif puis signe son vote en Ed25519.
Voter
Le serveur vérifie la signature et refuse tout « accepte » dont le hash ou une métrique diffère d’un seul ppm. Le vote est écrit de façon atomique.
Miner
Au quorum (51 % des appareils appairés, actifs et déclarés capables de valider), le serveur crée le bloc, relié par hash au précédent, et tire au sort le mineur parmi les validateurs.
Afficher
L’œuvre est diffusée aux écrans compatibles. Chaque carte récupère la frame au prochain contact, l’affiche (avec le cartel) puis accuse réception.
Ce que les cartes calculent réellement
Chaque carte lit le contenu brut du candidat en flux, par petits morceaux, et met à jour ses compteurs au fur et à mesure. Elle n’a pas besoin d’un second buffer complet de l’image ; seuls l’OLED (1 Ko) et l’e-ink 2,9″ (4,7 Ko) utilisent un petit espace de travail borné, employé pendant la lecture. La durée totale, réseau compris, est relevée au port série. Chaque carte produit :
hash = SHA-256( octets bruts du contenu ) e = entropie binaire du taux de pixels allumés (table fixe, en ppm) t = proportion de voisins horizontaux/verticaux différents (ppm) r = racine de (nombre de plages continues / nombre de pixels) (ppm) score s = (4·e + 4·t + 2·r) / 10 (ppm, plafonné à 1 000 000) message signé = pod-vote-v2 | appareil | candidat | hash | version | e | t | r | verdict
Le calcul est entièrement entier (aucun nombre à virgule) pour que le serveur, l’ESP8266 et la R4 obtiennent exactement le même résultat. Cette parité est vérifiée par un test automatisé qui compile le code des cartes et le compare à la version TypeScript. Le verdict est « refuse » si le hash diffère, si l’image est uniforme (toute blanche ou toute pleine) ou si elle ressemble à du bruit pur ; sinon « accepte ». Aucun critère esthétique n’est jamais appliqué.
| Carte | Variante d’écran | Vote recalculé | État |
|---|---|---|---|
| ESP8266 | e-ink 2,9″ BWR | Oui | Testé en réel |
| ESP8266 | multiscreen e-ink 2,7″ + OLED | Oui | Testé en réel |
| ESP8266 | TFT 1,8″ | Oui | Testé en réel |
| ESP8266 | e-ink 2,7″ seul | Oui (code livré) | À essayer |
| UNO R4 WiFi | e-ink 2,9″ BWR | Oui | Testé en réel |
| UNO R4 WiFi | e-ink 2,7″ seul · e-ink 2,7″ + OLED · TFT 1,8″ | Oui (code livré) | À essayer |
| UNO R4 WiFi | TFT 2,8″ tactile | Oui | Testé en réel |
La chaîne de blocs et ses preuves
Un bloc contient :
- l’
imageHash, l’actionsHashet le score de dessin ; - le
parentHash(hash du bloc précédent), d’où la chaîne ; - les identifiants des validateurs, le score, la date, l’artiste et le titre ;
- son propre
blockHash= SHA-256 de l’ensemble canonique.
Modifier un ancien bloc change tous les hash suivants : l’intégrité de l’historique est réelle. En revanche, les votes signés complets ne sont pas conservés dans le bloc (seul un résumé l’est) : un tiers ne peut pas, aujourd’hui, revérifier seul qu’un quorum a bien approuvé ces octets. Le code qui conserve ces reçus signés dans le bloc et le vérificateur public existent, mais sont éteints par défaut et pas encore essayés sur le réseau réel : tant qu’ils ne sont pas activés, la phrase ci-dessus reste vraie.
Niveaux d’assurance : où en est-on ?
| Niveau | Promesse | Ce qui existe | Limite actuelle |
|---|---|---|---|
| N0 | « N appareils étaient en ligne » | Ancien fonctionnement : le vote recopiait le score du serveur. | Encore le cas des animations et des appareils à firmware ancien. |
| N1 | Intégrité attestée : plusieurs appareils indépendants ont reçu ces octets exacts et signé leur hash | Les cartes v2 le font pour les images fixes. | Atteint partiellement : les votes anciens (écho) sont encore comptés, et les reçus signés ne sont pas conservés dans le bloc. |
| N2 | Règles objectives : format valide, image non uniforme, pas de bruit pur | Appliquées par le firmware ; refus enregistrés mais non bloquants. | Pas encore revérifiées par le serveur ; motif du refus non signé. |
| N3 | Authenticité du geste : le dessin a été tracé à la main | Vérifiée par le serveur seul (rythme des gestes, replay). | Pas encore refaisable par un tiers : phase « auditeurs » de la feuille de route. |
Principe : les appareils attestent N1 et N2 (objectif, calculable, reproductible) ; N3 reste confié au serveur puis à des auditeurs plus puissants (navigateur, Raspberry Pi). Le réseau ne juge jamais le goût.
Identité, signatures et sécurité
- Clés : chaque carte génère une paire Ed25519 au premier démarrage et la garde en mémoire permanente.
- Votes v2 : la signature est obligatoire et couvre l’appareil, le candidat, le contenu, les métriques et le verdict.
- Vote atomique : un script Redis enregistre chaque vote d’un seul tenant ; un double vote est ignoré.
- Session du navigateur : cookie signé qui prouve la possession d’un écran, sans compte ni mot de passe.
- Mémoire des cartes : l’ESP8266 n’a qu’environ 80 Ko ; le chiffrement de la connexion en réclame une grande part, d’où le calcul en flux.
Animations
Une animation suit le même parcours qu’un dessin : atelier plein écran (3 modes, 7 brosses, fantôme avant/après), clip compact « PBC1 » de 128×64 en 1 bit (9 Ko au plus, images codées en différences), candidat, votes, bloc de type animation, puis diffusion automatique aux écrans dynamiques (TFT 2,8″, TFT 1,8″, OLED) dont le firmware sait la jouer ; jamais aux e-ink.
Écrans, formats et contraintes
| Écran | Grille de calcul | Contenu brut |
|---|---|---|
| OLED 0,96″ | 128 × 64, 1 bit | 1 024 o |
| e-ink 2,7″ noir/blanc | 176 × 264, 1 bit | 5 808 o |
| e-ink 2,9″ noir/blanc/rouge | 128 × 296, deux plans | 9 472 o |
| TFT 1,8″ | 128 × 160, RGB565 | 40 960 o |
| TFT 2,8″ tactile | 240 × 320, RGB565 | 153 600 o |
Cartels e-ink : le firmware grave l’heure, l’artiste et le titre dans les bandes haute et basse après avoir reçu l’image. Sur l’e-ink 2,9″, cela masque environ 22 % de la hauteur ; une zone sûre puis un réglage par appareil sont prévus.
Coûts et garde-fous
- Quotas Redis : toute nouveauté est chiffrée en commandes par heure avant d’être codée ; lectures groupées, cadence adaptative (5 minutes en activité, 15 au repos), contenu des candidats servi par un CDN.
- Mémoire ESP8266 : les tampons d’image destinés à l’affichage sont alloués après la fermeture de la connexion chiffrée ; pour la validation, un espace de travail borné (1 à 4,7 Ko selon l’écran) sert pendant la lecture en flux ; messages en mémoire flash ; relevé du tas au démarrage.
- Mémoire UNO R4 : tampons statiques seulement, pile principale d’un kilo-octet.
- Secrets : les identifiants Wi-Fi vivent dans un fichier local ignoré par git, jamais dans les sketches publiés.
Ce que PoD n’est pas (encore)
- Une blockchain décentralisée : un registre unique, un serveur qui choisit candidat, quorum et mineur.
- Un consensus résistant aux identités multiples : le vote est par appareil, pas par profil.
- Un taux de menteurs mesuré : aucune réputation persistante n’existe ; seul un drapeau « suspect » temporaire.
- Une validation des animations par calcul.
- Une preuve que le dessin est fait à la main vérifiable par un tiers.
- Un système à mise à jour à distance : chaque carte se reflashe encore par câble.
Chacun de ces points est une ligne de la feuille de route, avec son statut.
Glossaire
- Candidat
- Dessin soumis, en attente de validation. Un seul à la fois.
- Bloc
- Enregistrement permanent d’une œuvre validée : hash de l’image, des gestes, du bloc précédent, validateurs, score, date.
- Quorum
- Nombre minimal de votes d’approbation : ⌈ 0,51 × appareils appairés, actifs et déclarés capables de valider ⌉, au moins 1.
- ppm
- Partie par million : les métriques sont des entiers entre 0 et 1 000 000, pour obtenir exactement le même résultat sur toutes les cartes.
- Mineur
- Validateur tiré au sort (poids inverse du nombre de blocs déjà minés) qui reçoit la propriété du bloc. Tirage fait par le serveur.
- Canari
- Essai volontairement limité d’une nouveauté avant de l’étendre.
- OTA
- Mise à jour d’un firmware à distance, sans câble.