Tinab Tinab

Tinab Consensus · s’accorder sans chef

Tinab · brouillon public · HTML, pas PDF

Un réseau de confiance sans leader, pour dire d’un objet s’il est authentique ou fabriqué

Deux couches, volontairement séparées : le protocole (comment on s’accorde) et le client (comment un humain y entre). Le site n’inscrit personne.

A · Le protocole

A.1 Ce que c’est, ce que ce n’est pas

Tinab atteste des objets : une phrase, une photo, un document, une vidéo. On vote authentique ou fabriqué / IA. Ce n’est pas un détecteur automatique. Ce n’est pas une chaîne de blocs. Le nom du domaine, on le sort rarement : this is not another blockchain.

On reprend les slices et les quorums du Stellar Consensus Protocol (Mazières, §§3–4) : chacun choisit un petit groupe de juges, un quorum est un ensemble qui contient une slice de chacun de ses membres. On ne reprend pas les étapes « accepter » puis « confirmer » du §5. Un nœud vote authentique ou fabriqué. Le sceau que tu vois dépend de ta slice : assez de tes juges ont voté authentique → ratifié authentique. Sinon, non. On n’affiche pas « bloqué », « scindé » ou « ratifié fake ». Une clé = une voix. Elle peut publier plusieurs slices signées ; n’importe laquelle peut former un quorum — y compris une slice d’un seul nœud (seuil 1). Ça ne multiplie pas les voix. Changer de camp est refusé. Au plus 32 bulletins par affirmation.

On ne vend pas le poids d’une voix. On peut vendre plus tard un relais, des SMS, une API d’organisation. Pas un « plus gros quorum ».

A.2 Deux identités, pas une

App. Le numéro de téléphone, unique, normalisé E.164. C’est comme Signal : tu prouves le numéro, tu es cette personne dans l’annuaire de l’application. Le carnet du téléphone devient ta liste de contacts.

Protocole. Une paire Ed25519. Le nœud est la clé publique (papier §3.1). Les messages sont signés par la clé privée. Tu choisis à l’inscription : soit une copie reste sur le relais (reconnexion par code), soit elle ne quitte pas l’appareil — alors tu notes la forme ASCII (64 hex) ou les 24 mots BIP39, c’est le même secret de 32 octets. L’empreinte courte k_ plus douze hexadécimaux n’est qu’un surnom d’affichage. Le numéro n’entre jamais dans un quorum.

Profil. Un pseudo et une description. Ce ne sont pas des identifiants. Deux personnes peuvent s’appeler Léa.

A.3 La slice typique fait quatre nœuds

Un quorum slice par défaut, c’est toi plus trois autres — quatre nœuds, seuil 3. Comme le premier groupe de la démo (Le Sceau, Forensic, Nord, Chambre). Ce n’est pas « les trois quarts de tout ton carnet » : si tu as trente contacts, on n’exige pas vingt-trois voix.

Les contacts et les bots d’exemple remplissent ces trois places. Tu peux en retirer d’un geste, ou en ajouter en naviguant (comme un abonnement). Les suivis explicites restent même au-delà de quatre ; le seuil reste 3 dès que la slice a au moins quatre membres.

Le fil montre ce que ces gens ont créé, ou à quoi ils ont répondu. Un compte tout neuf, sans contacts inscrits, a un fil vide. C’est voulu, comme une messagerie.

Exclure quelqu’un du carnet reste possible — un numéro dans le téléphone n’est pas forcément quelqu’un dont tu acceptes le jugement. Cette liste est volontairement un peu à l’écart. Ce n’est pas l’écran d’accueil.

Hors carnet. Tu peux parcourir le réseau et ajouter un nœud par son pseudo ou sa clé publique (l’identifiant k_…). Un labo, une rédaction, un bot : ils n’ont pas besoin d’être dans tes contacts téléphoniques.

B · Le client

B.1 Qui parle par où

Humains. Application native (APK, puis magasin). Authentification par numéro et code, comme WhatsApp ou Signal. Import du carnet (permission contacts). Traitement local des messages.

Navigateur. Vitrine (cette page) et, plus tard, un miroir jumelé par QR depuis l’app déjà ouverte. Pas de formulaire d’inscription sur le site. Le miroir ne lit pas le carnet : le téléphone lui envoie la session.

Bots et organisations. Le relais HTTP et, plus tard, le protocole lui-même. Une clé, pas forcément un numéro. Un bot n’apparaît dans un fil humain que si un contact a créé ou répondu à son objet.

B.2 Le relais est une archive, pas un juge

Le serveur enregistre tous les messages : nœuds, objets, votes, slices. L’app interroge ce qui la concerne — d’abord les auteurs de son carnet et leurs réponses — et recalcule le sceau chez elle : un quorum de voix authentiques, ou pas. Le décompte du relais n’est qu’un cache pour les bots pressés.

Un objet média n’est pas une URL qu’on peut éditer. C’est un SHA-256 ou un CID IPFS. Un lien Google Docs est refusé.

B.3 Les seeds, comme Bitcoin

Pour trouver le réseau, un client commence par une courte liste d’adresses de relais qui connaissent les nœuds. Ce n’est pas la liste de tous les téléphones. C’est la liste des archives. Au début il n’y en a qu’une : la nôtre, consensus.tinab.com:443 (217.154.15.108).

Fichier brut : /seeds.txt. JSON : /api/v1/seeds.

B.4 Authentification et garde de la clé

Tu donnes un numéro. Un code à six chiffres arrive par SMS (tant que le SMS n’est pas branché, le relais de démo peut encore montrer le code — ce n’est pas le régime visé). Tu confirmes. Le numéro est unique. Une autre clé ne peut pas le prendre. Pseudo et description se règlent après.

Deux gardes, choisies à la création. Relais : l’app envoie aussi la privée ; un code sur le même numéro la rend. Appareil : le relais ne reçoit que la publique. Pour rouvrir le nœud, tu présentes les 24 mots ou la clé ASCII. L’app dérive la publique, signe un défi cercle.recover/1, le relais ouvre la session. Perdre les mots et l’appareil, c’est perdre le nœud.

Le navigateur ne refait pas ce chemin. Il montre un jeton / QR. L’app le confirme. C’est un miroir, pas un deuxième compte.

B.5 Ce que fait l’app, concrètement

  1. S’ouvre, demande le numéro, vérifie le code.
  2. Crée ou retrouve la clé locale. Le protocole id ne bouge pas.
  3. Lit le carnet, envoie les numéros (plus tard : une intersection plus discrète) au relais, reçoit les nœuds déjà inscrits. Ce sont tes contacts Tinab.
  4. Demande le journal filtré sur ces identifiants.
  5. Affiche les objets créés ou répondu par eux.
  6. Quand tu votes ou tu déposes, elle envoie un message au relais et met à jour son sceau local.

B.6 Navigation

Le fil reste ce que tes contacts ont créé ou répondu. La recherche lit toute l’archive du relais : affirmations, nœuds, clés — pas seulement le carnet.

On clique une affirmation pour voir l’état et qui a voté quoi. On clique un nœud pour voir ses bulletins. Un vote ouvre le message signé cercle.vote/1 : nœud = clé publique, objet = SHA-256 de l’affirmation ou du fichier, q = 𝐐(𝑣) (papier §5.1), signature Ed25519. Le pseudo, la description et l’id interne du claim sont un hint hors signature — indicatif, pas du protocole. Ajouter quelqu’un à sa slice se fait comme un abonnement.

C · Cas d’école et limites

C.1 Cinq cas d’école

Les mêmes situations que sur le premier fil de démonstration. Les noms sont ceux du réseau d’exemple : la rédaction Le Sceau, l’Atelier Forensic, le Collectif Nord, la Chambre d’archives, Iris Benali, Clara Voss, Malik Renard, Léa Horton, Noura K., Paul M., et les deux îlots Est / Ouest. Tu peux rejouer un cas, vider les voix, ou voter à la place d’un nœud — sans t’inscrire. Rien n’est envoyé au relais.

Le sceau se calcule ici, dans le navigateur : slices, voix signées, quorum d’authentique. Un nœud ne reprend pas sa voix.

C.2 Sûreté, telles quelles

Si tes slices n’ont pas d’intersection avec celles des autres, deux îlots peuvent ratifier chacun de leur côté. Ce n’est pas un bug : le papier le dit (figure 6). L’écran humain ne montre que « ratifié authentique » ou non — pas « scindé ».

Un nœud qui a voté ne reprend pas son vote. C’est la promesse du §5.

C.3 Ce qui n’est pas encore là

  • L’APK signée est prête ; la fiche Play Store est rédigée (android/play/) mais pas encore envoyée à Google.
  • Le code de démo reste. WhatsApp OTP part si data/notify.env a le jeton Business — SMS ensuite.
  • Le QR de miroir est dessiné. L’app colle le jeton ou ouvre tinab://pair/….
  • La signature Ed25519 est en place ; le relais vérifie, le hint n’est pas signé.
  • D’autres relais : GET /api/v1/relays et CERCLE_SEEDS. Le relais reste le seul tuyau ; /reach n’est qu’un essai d’adresse.
  • Filet d’abus : signaler, CGU, retrait. Filtre conservateur avant hébergement (nsfwjs sur le relais, peau sur l’app). Pas un détecteur de mineurs. Vidéos non scannées = refusées.

C.4 Pour les bots

Catalogue : /api/v1/. Santé : /api/v1/health. Journal : GET /api/v1/events?since=&authors=. Annuaire par numéros : POST /api/v1/directory (remplit la slice : tout le carnet, sauf exclusions). Recherche : GET /api/v1/search?q= (nœuds et affirmations, toute la base). Récupération auto-garde : POST /api/v1/recover/start, /recover/finish. Confiance hors carnet / exclusion : POST /api/v1/slice/include, /slice/exclude. Inscription machine : POST /api/v1/bots (clé, sans numéro) puis Authorization: Bot …. Quota mensuel, réponse 402 si dépassé — les votes ne comptent pas. Humain : POST /api/v1/register (clé + numéro). Pas de cookie web. Un bearer, ou un jeton bot.

Référence : David Mazières, The Stellar Consensus Protocol, 25 février 2016, §§3–5. Code : dépôt Tinab, module scp et cercle.client.