← Tous les articles

N° 04DNA Seed

Deux téléphones, quatre-vingt-dix secondes

Dans DNA Seed, on échange son ADN en personne. Voici comment l’app demande une rencontre plutôt qu’un lien, et ce qu’elle prouve ou non.

Vincent Porret

Cofondateur et CEO · · 4 min de lecture

Estampe 04, Tresse. Des gouttes et des peignes sur un bain, tirée quand le site est construit.Pointez dessus pour faire tomber de l’encre.

DNA Seed est un jeu social qui se joue en personne. Chaque joueur porte un ADN, un code qui n’appartient qu’à lui, et collectionne les codes des gens qu’il rencontre. La règle qui fait le jeu est simple à dire et plus dure à construire : un échange doit se faire face à face, pas par un lien que quelqu’un a transféré.

Ce qu’on a écarté

Un QR code permanent peut être photographié et publié. Un lien de partage voyage n’importe où. Une invitation à échanger à distance va à l’encontre du principe. On a écarté les trois, ainsi que le QR code seul, et on a aussi abandonné le NFC. Il est resté un QR code qui vit quatre-vingt-dix secondes, et le Bluetooth.

Quatre-vingt-dix secondes

Quand vous choisissez de recevoir, une fonction serveur ouvre une session d’échange : un long jeton aléatoire, un court nonce aléatoire, et une expiration dans quatre-vingt-dix secondes. Votre écran affiche le jeton et l’expiration en QR code, avec un compte à rebours :

{ "v": 2, "type": "adn_exchange", "exchangeToken": "…", "expiresAt": "…" }

Le code n’est pas signé et n’a pas besoin de l’être. Ce n’est qu’une clé que le serveur cherche, et le serveur se fie à sa propre horloge et à ses propres données, pas au code. Au même moment, votre téléphone commence à diffuser en Bluetooth un identifiant de service temporaire, dérivé du nonce. Le nonce n’est pas dans le QR code : il ne passe que par les ondes.

L’autre téléphone doit entendre le vôtre

La personne en face de vous scanne le code. Son téléphone vérifie qu’il n’a pas expiré, puis écoute les téléphones proches pendant sept secondes au plus. C’est seulement s’il en entend un qu’il demande au serveur de rejoindre la session, et le serveur vérifie qu’il a entendu le bon. Ensuite, vous confirmez tous les deux à l’écran, et c’est alors seulement que l’échange se fait. Si le Bluetooth est coupé ou refusé sur l’un des deux téléphones, celui-ci le signale et l’échange ne peut pas avoir lieu. Le QR code seul ne permet pas de le contourner.

Pour être précis sur ce que cela prouve : le téléphone qui scanne doit être à portée Bluetooth du téléphone qui affiche le code, dans une fenêtre de quatre-vingt-dix secondes, et les deux joueurs doivent dire oui. La portée Bluetooth n’est pas une distance mesurée, et on ne prétend pas que c’en est une.

À portée Bluetooth, en moins de quatre-vingt-dix secondes, et deux oui. C’est la barre qu’on s’est fixée.

Le serveur écrit, les téléphones lisent

Le serveur vérifie le reste : la personne qui scanne est connectée, la session existe, elle n’a pas servi, elle n’a pas expiré, ce qui est revérifié quand vous confirmez tous les deux, et personne ne scanne son propre code. Cette dernière règle est appliquée deux fois, dans la fonction et par une contrainte dans la base de données. Les joueurs peuvent lire leurs échanges et supprimer les leurs, mais jamais en créer ni en modifier : la sécurité au niveau des lignes laisse les insertions aux seules fonctions serveur.

Un échange fusionne les collections dans les deux sens. Chaque joueur reçoit tout de suite l’ADN de l’autre, puis, un instant plus tard, tous les autres codes que l’autre porte, depuis une file d’attente sur le serveur. Un index unique sur le porteur et le code rend la fusion idempotente : un même code n’arrive jamais deux fois. Chaque code retient aussi qui l’a transmis et combien d’échanges il lui a fallu pour arriver, et c’est ce qui dessine son arbre généalogique.

Une carte sans GPS

La carte montre, pays par pays, jusqu’où un ADN a voyagé. L’app ne lit jamais votre position : le pays est celui que chaque joueur déclare sur son profil. La carte est là pour dire jusqu’où un ADN est allé, pas où se trouve qui que ce soit.

Ce n’est pas non plus un SDK de cartographie. C’est un dessin sur mesure en Flutter, sur les contours des pays de Natural Earth, dans une simple projection longitude-latitude. Une dépendance de moins, et aucun service de cartes n’est appelé pour la dessiner.

Vincent