← Todos los artículos

N.º 04DNA Seed

Dos teléfonos, noventa segundos

En DNA Seed intercambias tu ADN en persona. Aquí contamos cómo la app pide un encuentro y no un enlace, y qué demuestra y qué no.

Vincent Porret

Cofundador y CEO · · 4 min de lectura

Estampa 04, Trenza. Gotas y peines sobre un baño, sacada al construir el sitio.Pasa el puntero por encima para dejar caer tinta.

DNA Seed es un juego social que se juega en persona. Cada jugador lleva un ADN, un código que es solo suyo, y colecciona los códigos de la gente que conoce. La regla que define el juego es fácil de decir y más difícil de construir: un intercambio debe pasar cara a cara, no a través de un enlace que alguien reenvió.

Lo que descartamos

Un código QR permanente se puede fotografiar y publicar. Un enlace para compartir viaja a cualquier parte. Una invitación a intercambiar a distancia va contra la idea. Descartamos los tres, junto con el código QR por sí solo, y también abandonamos el NFC. Quedó un código QR que vive noventa segundos, y el Bluetooth.

Noventa segundos

Cuando eliges recibir, una función del servidor abre una sesión de intercambio: un token aleatorio largo, un nonce aleatorio corto, y una caducidad dentro de noventa segundos. Tu pantalla muestra el token y la caducidad como un código QR, con una cuenta atrás:

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

El código no está firmado y no necesita estarlo. Solo es una clave que el servidor busca, y el servidor se fía de su propio reloj y de sus propios registros, no del código. Al mismo tiempo, tu teléfono empieza a anunciar por Bluetooth un identificador de servicio temporal, derivado del nonce. El nonce no está en el código QR: solo viaja por el aire.

El otro teléfono tiene que oír el tuyo

La persona que tienes delante escanea el código. Su teléfono comprueba que no ha caducado, y luego escucha los teléfonos cercanos durante siete segundos como máximo. Solo si oye alguno pide al servidor unirse a la sesión, y el servidor comprueba que oyó el correcto. Después los dos confirmáis en pantalla, y solo entonces se hace el intercambio. Si el Bluetooth está apagado o no tiene permiso en alguno de los dos teléfonos, ese teléfono lo dice y el intercambio no puede hacerse. No hay forma de saltárselo con el código QR solo.

Para ser precisos con lo que eso demuestra: el teléfono que escanea tiene que estar al alcance Bluetooth del teléfono que muestra el código, dentro de una ventana de noventa segundos, y los dos jugadores tienen que decir que sí. El alcance Bluetooth no es una distancia medida, y no decimos que lo sea.

Al alcance Bluetooth, en menos de noventa segundos, y dos síes. Ese es el listón que pusimos.

El servidor escribe, los teléfonos leen

El servidor comprueba el resto: la persona que escanea ha iniciado sesión, la sesión existe, no se ha usado, no ha caducado, cosa que se vuelve a comprobar cuando los dos confirmáis, y nadie escanea su propio código. Esa última regla se aplica dos veces, en la función y con una restricción en la base de datos. Los jugadores pueden leer sus intercambios y borrar los suyos, pero nunca crear ni modificar uno: la seguridad a nivel de fila deja las inserciones solo a las funciones del servidor.

Un intercambio fusiona las colecciones en los dos sentidos. Cada jugador recibe al momento el ADN del otro y, poco después, todos los demás códigos que lleva el otro, desde una cola en el servidor. Un índice único sobre portador y código hace que la fusión sea idempotente: un mismo código nunca llega dos veces. Cada código recuerda además quién lo pasó y cuántos intercambios necesitó para llegar, y eso es lo que dibuja su árbol genealógico.

Un mapa sin GPS

El mapa muestra, país por país, hasta dónde ha viajado un ADN. La app nunca lee tu ubicación: el país es el que cada jugador declara en su perfil. El mapa está para decir hasta dónde llegó un ADN, no dónde está nadie.

Tampoco es un SDK de mapas. Es un dibujo a medida en Flutter sobre los contornos de países de Natural Earth, en una simple proyección de longitud y latitud. Una dependencia menos, y no se llama a ningún servicio de mapas para dibujarlo.

Vincent