# Protocole Jiyu : fonctionnement conceptuel

> Ce document explique le **fonctionnement** du protocole : comment les concepts
> s'articulent et ce qui se passe à chaque étape de la vie d'une place. Les décisions
> normatives (axiomes, paramètres, maturité des mécanismes) sont dans
> [project.md](./project.md) §1 ; la stack et les transports dans les §2-7.

---

## 1. Vue d'ensemble

Jiyu est un réseau social décentralisé où **tout est une place** : une communauté
publique, un petit groupe privé et un DM sont le même objet, à des tailles différentes.
Une place est simultanément :

- une **unité de contenu** (des rooms contenant des posts),
- une **unité de gouvernance** (des tokens répartis entre ses membres),
- une **unité cryptographique** (ses propres clés, son propre pseudonymat),
- une **unité de réplication** (ses membres portent ses données).

Il n'existe ni serveur central, ni annuaire, ni identité globale visible. Le réseau
fonctionne avec ou sans Internet : les données se propagent de membre en membre par le
meilleur transport disponible (Internet, LAN, BLE, ultrasons…).

```mermaid
graph TD
    U[User] -->|possède 1..N| N[Node / appareil physique]
    U -->|un pseudonyme distinct par place| P[Place]
    P -->|contient| R[Rooms]
    R -->|contiennent| PO[Posts texte]
    PO --> RE[Réactions emoji]
    P -->|gouvernée par| T[Tokens]
    P -->|protégée par| K[Deux clés : découverte + messages]
```

---

## 2. Identité et pseudonymat

Chaque user détient une **identité maîtresse** (paire de clés) qui n'apparaît jamais
sur le réseau. Tout ce que les autres voient est **dérivé** :

- **Pseudonyme par place** : dérivation déterministe (identité maîtresse + ID de la
  place). Il est stable au sein d'une place (le même user y revient toujours sous le
  même pseudonyme, ce qui rend la blacklist d'exclusion effective), mais
  **incorrélable entre places** : rien ne relie vos pseudonymes de deux places
  différentes.
- **Multi-device** : tous les appareils d'un user partagent l'identité maîtresse.
  Rejoindre une place depuis un appareil donne l'accès à tous.
- **Récupération** : la perte de tous les appareils vaut perte de l'identité, sauf
  backup personnel chiffré (le backup et sa passphrase sont tous deux requis pour
  restaurer ; le réseau, lui, ne restaure jamais rien).

```mermaid
graph TD
    M[Identité maîtresse<br/>jamais visible sur le réseau] --> D1[Appareil 1]
    M --> D2[Appareil 2]
    M -->|dérivation avec ID place A| PA[Pseudonyme dans A]
    M -->|dérivation avec ID place B| PB[Pseudonyme dans B]
    PA -.incorrélables.- PB
    M --> BK[Backup chiffré<br/>+ passphrase hors-ligne]
```

---

## 3. Les deux clés d'une place

| Clé | Nature | Rôle | Qui l'a |
| --- | --- | --- | --- |
| **Secret de découverte** | Stable (rotatable par le top holder) | Calculer les tags d'époque, trouver la place, prouver qu'on a une invitation | Toute personne ayant eu un QR |
| **Clés de message** | Rotation périodique | Chiffrer le contenu | Membres actuels uniquement |

Cette séparation fait fonctionner à la fois le QR statique (imprimable et diffusable,
car il contient le secret de découverte) et l'exclusion (qui ne touche que les clés de
message). Conséquence assumée : un exclu ou le détenteur d'un QR fuité peut encore
*suivre l'activité* de la place (tags), sans plus rien lire. Si c'est un problème, le
top holder fait tourner le secret de découverte : tous les QR en circulation deviennent
caducs.

### Rotation des clés de message

```mermaid
sequenceDiagram
    participant P as Clés de message de la place
    Note over P: génération k en cours
    P->>P: rotation périodique → génération k+1
    P->>P: exclusion ou révocation d'appareil → rotation immédiate → k+2
    Note over P: partition réseau : deux lignées divergentes k+3a et k+3b
    P->>P: fusion des partitions → re-rotation automatique → k+4
```

La rotation est **périodique** ; une exclusion ou une révocation d'appareil avance
simplement le timer à maintenant (un seul mécanisme, aucune fenêtre où l'exclu lit
encore). La distribution des nouvelles clés suit un schéma type MLS/TreeKEM
(coût O(log N)). Deux lignées divergentes créées en partition déclenchent une
re-rotation à la fusion, car re-chiffrer en trop est toujours sûr.

---

## 4. Cycle de vie d'un membre

```mermaid
stateDiagram-v2
    [*] --> Invite : scan d'un QR ou invitation directe
    Invite --> Membre : join, pseudonyme dérivé, 0 token
    Membre --> Membre : posts, réactions, réception ou envoi de tokens
    Membre --> Parti : départ volontaire, tokens brûlés
    Membre --> Sequestre : exclusion, tokens sous séquestre
    Sequestre --> Membre : réintégration sous T par un détenteur supérieur
    Sequestre --> Banni : délai T écoulé, brûlage définitif et blacklist
    Parti --> Invite : peut revenir librement
    Banni --> [*] : même pseudonyme bloqué à vie
```

### Rejoindre une place

```mermaid
sequenceDiagram
    participant N as Nouvel arrivant
    participant M as Un membre joignable
    N->>N: scan du QR, qui contient le secret de découverte et la signature de l'inviteur
    N->>M: contact via le tag d'époque courant
    M->>M: vérifie blacklist, throttle de joins, validité du QR
    M->>N: chaîne des clés de message + accès à l'historique
    N->>M: join signé du pseudonyme dérivé
    M->>M: inscription dans l'arbre comme enfant de l'émetteur du QR
```

- Le **QR est une invitation signée par un membre précis** ; l'arrivant devient son
  enfant dans l'arbre de cooptation. Un QR peut circuler publiquement (place ouverte)
  ou rester privé (petit groupe).
- L'arrivant a **accès à tout l'historique** (droit de récupération, pas obligation de
  tout stocker).
- Les joins sont **throttlés** par QR et par époque (anti-botnet) ; l'émetteur peut
  **invalider** son QR à tout moment (sans effet sur ceux déjà entrés).
- Un **DM** est une place à deux membres, créée par **invitation directe** : un payload
  scellé (illisible des autres) envoyé à un pseudonyme rencontré dans une place
  commune. TTL des deux côtés ; refus ou silence → la place s'auto-supprime. Chaque
  user peut désactiver les invitations entrantes.

---

## 5. Gouvernance par tokens

Chaque place a une **offre fixe** de tokens (fractionnables en 10⁸ unités). Le créateur
part avec 100 % et distribue comme il l'entend, les tokens étant transférables entre
membres. Le pouvoir est strictement relatif au solde :

| Pouvoir | Condition |
| --- | --- |
| Lire, poster, réagir, inviter | Être membre (0 token suffit) |
| Exclure quelqu'un | Détenir **strictement plus** que la cible |
| Réintégrer un exclu | Détenir strictement plus que l'excluant |
| Créer/supprimer des rooms, éditer nom/description, faire tourner le secret de découverte | Être le (ou l'un des) plus gros détenteur(s) |

L'égalité fige : deux détenteurs à égalité ne peuvent pas s'exclure mutuellement
(statu quo assumé : l'exit des membres est le régulateur ultime d'une mauvaise
gouvernance).

### L'arbre de cooptation et la cascade

Chaque membre est l'enfant de qui l'a invité. L'exclusion emporte **toute la branche**
de l'exclu (à la Lobsters), moins le sous-arbre de l'excluant s'il en fait partie
(re-parenté au parent de l'exclu, pas d'auto-exclusion paradoxale). Un départ
volontaire ne cascade pas : les enfants sont re-parentés au grand-parent.

```mermaid
graph TD
    C[Créateur · 55] --> A[Alice · 30]
    C --> B[Bob · 10]
    A --> E[Eve · 5]
    A --> D[Dave · 0]
    E --> F[Fred · 0]
    B --> G[Gus · 0]
    style E fill:#c62828,color:#fff
    style F fill:#c62828,color:#fff
```

*Exemple : Bob (10) exclut Eve (5) → Eve et Fred (sa branche) sortent, leurs tokens
passent sous séquestre. Alice (30 > 10) peut les réintégrer pendant T ; sinon brûlage.*

### Pourquoi brûler les tokens

Les tokens des partants et des exclus sont **brûlés** : les ratios entre les membres
restants sont mathématiquement inchangés, donc **personne ne gagne rien à exclure** ;
la purge n'a aucune incitation économique. Le séquestre de T jours avant brûlage
définitif est la fenêtre de recours ; toutes les exclusions sont des événements
auditables du log.

---

## 6. Le registre : une mini-blockchain par place

Le contenu (posts) fusionne sans conflit (CRDT). Les opérations de gouvernance
(transferts, exclusions), elles, exigent un ordre : c'est le rôle du registre.

- Chaque opération = un **bloc signé** par son auteur, chaîné par hash (~200-300 o).
- **Finalité** = contre-signatures de détenteurs représentant **plus de 50 % des tokens
  en circulation**. Les validateurs *sont* les détenteurs : pas de mineurs, pas de
  chaîne globale. Dans un DM, le quorum c'est les deux membres.
- Un double-spend est une fourche signée du même compte : détectée mécaniquement à la
  fusion, résolue par premier-finalisé-gagne.
- En partition sans quorum, les opérations **attendent** (le contenu, lui, circule).
  Une exclusion ne s'appuie que sur des soldes finalisés.
- **Dormance** : un détenteur muet depuis 90 jours sort du dénominateur du quorum
  (il garde ses tokens et réintègre le quorum à sa première signature) : un disparu ne
  peut pas geler une place.

```mermaid
sequenceDiagram
    participant A as Alice · 30 pct
    participant B as Bob · 25 pct
    participant C as Carol · 45 pct
    A->>A: bloc signé, transfert de 10 tokens vers Bob
    A-->>B: propagation du bloc
    A-->>C: propagation du bloc
    B->>A: contre-signature, 30 + 25 = 55 pct
    Note over A,B: seuil de 50 pct franchi → transfert FINALISÉ
    C-->>A: contre-signature tardive, redondante
```

---

## 7. Propagation : de membre en membre, avec des couriers

Le contenu d'une place ne transite **que par ses membres** (modèle Briar) : un relais
connaît déjà la place, donc aucune fuite et aucun déchiffrement d'essai. Le routage
suit le graphe social, pas une table d'adresses.

Le **pseudonymat de place** rend ça routable sans rien révéler : chaque époque, la
place a un **tag** dérivé du secret de découverte, recalculable par les membres,
opaque pour les autres, incorrélable d'une époque à l'autre. Les nodes annoncent à
leurs voisins les tags qu'ils portent ou cherchent (pub/sub).

Pour combler les trous géographiques, un non-membre peut devenir **courier** : les
membres lui remettent un laissez-passer de k époques de tags, et il porte des bundles
chiffrés qu'il ne peut pas lire. Le mode courier est **activé par défaut** : utiliser
le réseau, c'est le soutenir.

```mermaid
graph LR
    subgraph Quartier 1
        A[Membre A] ---|sync directe| B[Membre B]
    end
    subgraph Quartier 2
        D[Membre D] ---|sync directe| E[Membre E]
    end
    B ---|laissez-passer k époques| K[Courier non-membre<br/>porte sans lire]
    K --- D
    A -.Internet quand disponible.- E
```

- **Internet** : abolit la distance quand il existe. Des serveurs de rendez-vous
  **fédérés et optionnels** (n'importe qui peut en héberger) facilitent la mise en
  relation ; le réseau n'en dépend jamais : si Internet disparaît, tout continue de
  proche en proche. Les PWA ont besoin d'un natif ou d'un serveur pour entrer ; un
  natif coupé d'Internet peut inversement passer par une PWA connectée (le pont marche
  dans les deux sens).
- **Anti-spam** : seuls les membres injectent du contenu dans une place (un spammeur
  est un membre, donc excluable) ; le volume relayé est borné par des quotas par lien
  de voisinage.
- **Temps** : les époques supposent des horloges vaguement justes, d'où une tolérance
  de ±1-2 époques et un gossip d'horloge à chaque rencontre (médiane des contacts
  récents).

---

## 8. Qui voit quoi

| Observateur | Contenu | Existence de la place | Activité (tags) | Membres |
| --- | --- | --- | --- | --- |
| **Membre** | Tout (+ historique) | Oui | Oui | Pseudonymes de tous |
| **Courier** | Rien | Non, juste un tag opaque | Volume/timing sur k époques | Non |
| **Voisin réseau** | Rien | Non | Annonces de tags opaques | Non |
| **Détenteur d'un QR non entré** | Rien | Oui | Oui (calcule les tags) | Non |
| **Exclu** | Son ancienne copie, rien de neuf | Oui | Oui, jusqu'à rotation du secret de découverte | Ceux qu'il connaissait |
| **Inconnu** | Rien | Non | Non | Non |

---

## 9. Limites assumées

- **Pas d'effacement cryptographique** : la suppression de posts, les tombstones et la
  mort d'une place sont des conventions respectées par les clients honnêtes ; quiconque
  a déjà copié des données peut les conserver.
- **Lire n'est pas anonyme** : rejoindre une place expose son pseudonyme aux autres
  membres (parité Discord).
- **L'évasion de ban** exige une identité maîtresse neuve (parité Discord).
- **Les tags fuient** volume et timing par époque, et le co-abonnement entre voisins.
- **La gouvernance gèle sans quorum** (partitions longues) ; le contenu, lui, ne gèle
  jamais.
- **La PWA fait confiance à son serveur d'origine** pour le code qu'elle exécute.
- La **gouvernance par tokens** est un système social expérimental. Le protocole
  garantit que les règles (transferts, exclusions, quorums) s'appliquent correctement,
  mais il ne garantit pas que les détenteurs de tokens gouverneront intelligemment ou
  équitablement. Face à une mauvaise gouvernance, la protection des membres reste la
  même que dans la vraie vie : quitter la place et aller ailleurs.
