Créateur du dessin
Dessine dans le navigateur et soumet son œuvre avec son propre ESP ou un écran public partagé.
- POST /api/draw
- Session signée HMAC-SHA256
- Détection des séquences automatisées
Cette partie rassemble la vue technique du protocole. Elle est indépendante du tutoriel de branchement et peut être lue comme un white paper synthétique.
Proof-of-Draw utilise une architecture pull-based : les ESP interrogent toujours le serveur, jamais l’inverse. Ils restent ainsi utilisables derrière n’importe quel routeur ou NAT sans exposer d’adresse locale.
POST /api/drawcandidate:current → RedisGET /api/pull · POST /api/validation-resultchain:block:{hash}GET /api/pull-framePour préserver la mémoire disponible sur l’ESP8266, GET /api/pull ne renvoie que des métadonnées. Le payload de l’image est récupéré uniquement lorsqu’un nouveau frameId est détecté.
Métadonnées légères indiquant l’action à effectuer.
{
"frameSource": "consensus",
"frameId": "abc…",
"pendingValidation": { "candidateId": "xyz…" }
}Payload binaire téléchargé seulement lorsqu’une nouvelle frame est disponible.
Content-Type: application/octet-stream Payload adapté au profil de l’écran
Chaque participant peut jouer un ou plusieurs rôles simultanément. Un même ESP peut être validateur, mineur et afficheur.
Dessine dans le navigateur et soumet son œuvre avec son propre ESP ou un écran public partagé.
L’ESP interroge le serveur, relit le contenu du candidat, recalcule son hash et des métriques entières, puis signe son vote (images fixes ; les animations sont encore votées en v1).
Un validateur est tiré au sort par le serveur à chaque quorum et son compteur de blocs minés est mis à jour.
L’application Next.js et Redis coordonnent les soumissions, la chaîne et la distribution des frames.
POST /api/draw encode le canvas en 1 bit par pixel pour les e-ink et OLED, ou en RGB565 little-endian pour le TFT. Le serveur vérifie la session, applique les limites et publie le candidat.
Les validateurs détectent le candidat, téléchargent son contenu brut, recalculent le SHA-256 et les métriques entières (entropie, transitions, runs), signent leur verdict puis l’envoient à POST /api/validation-result. Le serveur refuse tout « accepte » dont le hash ou une métrique diffère.
Le quorum correspond à ⌈ poolSize × 0,51 ⌉ approbations (appareils appairés actifs), avec un minimum d’un vote. Le serveur finalise le bloc, relie son hash au bloc précédent et conserve l’image et ses métadonnées.
Le mineur n’est pas le plus rapide. Il est tiré au sort parmi les validateurs avec le poids WEIGHT_BASE / (blocksMinés + 1), ce qui favorise les nouveaux participants.
Les ESP ne sont jamais contactés directement. Ils interrogent le serveur et fonctionnent derrière un routeur ou un NAT.
GET /api/pull · frame:{deviceId}Chaque bloc contient le hash SHA-256 du précédent et les blocs sont conservés sans expiration.
chain:block:{hash} · parentHashLe serveur détecte les séquences d’actions trop rapides ; cette vérification du geste reste, pour l’instant, une vérification du serveur.
automationRatio · MAX_AUTOMATION_RATIOLe mineur est tiré au sort avec un poids inversement proportionnel aux blocs déjà minés.
WEIGHT_BASE / (blocs + 1)La session du navigateur est signée et prouve la possession du device sans compte ni seed phrase.
HMAC-SHA256 · cookie httpOnlyLes critères de qualité s’adaptent à l’historique du réseau pour chaque type d’écran.
getEffectiveThresholds()Le code du serveur, les firmwares et les bibliothèques peuvent être utilisés, modifiés, redistribués et forkés, y compris commercialement, sous réserve de conserver la notice de licence.
Un dessin soumis est placé dans le domaine public universel. Il est librement partageable, réutilisable et modifiable sans condition.
CC0 ne signifie pas anonymat : le nom d’artiste, le hash du dessin et la date restent associés à l’œuvre dans la chaîne. La liberté de réutilisation et la traçabilité de l’origine coexistent.