Sommaire de la page
Parcours 04

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émentRôleTechnologie
NavigateurDessin pixel-exact, atelier d’animation, profil, vue RéseauNext.js, canvas, moteur de dessin pur
ServeurAdmission des candidats, quorum, chaîne, distribution des framesRoutes API Next.js sans état (Vercel)
RegistreCandidat courant, votes, blocs, appareils (sans expiration pour les blocs)Upstash Redis
AppareilInterroge le serveur, relit, calcule, signe, afficheESP8266 ou UNO R4 WiFi, Ed25519, SHA-256
ÉcranAffiche l’œuvre et son cartelOLED 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
1

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

2

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.

3

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.

4

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.

5

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.

6

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.

7

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.

8

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

CarteVariante d’écranVote recalculéÉtat
ESP8266e-ink 2,9″ BWROuiTesté en réel
ESP8266multiscreen e-ink 2,7″ + OLEDOuiTesté en réel
ESP8266TFT 1,8″OuiTesté en réel
ESP8266e-ink 2,7″ seulOui (code livré)À essayer
UNO R4 WiFie-ink 2,9″ BWROuiTesté en réel
UNO R4 WiFie-ink 2,7″ seul · e-ink 2,7″ + OLED · TFT 1,8″Oui (code livré)À essayer
UNO R4 WiFiTFT 2,8″ tactileOuiTesté en réel
La chaîne de blocs et ses preuves

Un bloc contient :

  • l’imageHash, l’actionsHash et 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 ?
NiveauPromesseCe qui existeLimite 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.
N1Intégrité attestée : plusieurs appareils indépendants ont reçu ces octets exacts et signé leur hashLes 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.
N2Règles objectives : format valide, image non uniforme, pas de bruit purAppliquées par le firmware ; refus enregistrés mais non bloquants.Pas encore revérifiées par le serveur ; motif du refus non signé.
N3Authenticité du geste : le dessin a été tracé à la mainVé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
ÉcranGrille de calculContenu brut
OLED 0,96″128 × 64, 1 bit1 024 o
e-ink 2,7″ noir/blanc176 × 264, 1 bit5 808 o
e-ink 2,9″ noir/blanc/rouge128 × 296, deux plans9 472 o
TFT 1,8″128 × 160, RGB56540 960 o
TFT 2,8″ tactile240 × 320, RGB565153 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.