# 🐟 \[RFC-0042\] Module Nostalgia : couche de compatibilité comportementale Duniter v1

**URL:** https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788
**Category:** Ğ1v2 protocol
**Created:** [1 April 2026 08:12 UTC](https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788 "2026-04-01T08:12:39Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [1 April 2026 08:12 UTC](https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788/1 "2026-04-01T08:12:39Z")

</div>

## Module Nostalgia - Couche de compatibilité comportementale Duniter v1

**RFC-0042** | `pallet-nostalgia` | Index du pallet : **70**

**MR: [feat: add Nostalgia Mode - Duniter v1 behavioral compatibility layer (RFC-0042) (!399) · Merge requests · nodes / rust / Duniter v2S · GitLab](https://git.duniter.org/nodes/rust/duniter-v2s/-/merge_requests/399)**

### Motivation

La migration vers Duniter v2 a apporté des améliorations techniques significatives - finalité déterministe (GRANDPA), temps de bloc prévisibles (BABE), exécution WASM - mais au prix d’un **coût culturel** : la perte des comportements émergents qui définissaient l’expérience du protocole Duniter originel.

Les retours de la communauté sont constants :

- _« Les transactions arrivent trop vite maintenant, on n’a même plus le temps de discuter sur le forum en attendant »_
- _« Le réseau est trop stable - c’était plus excitant avant quand on ne savait jamais si notre virement allait passer »_
- _« Ma certification qui disparaissait mystérieusement me manque ; ça me donnait une raison de rencontrer les gens en vrai »_

Cette [MR](https://git.duniter.org/nodes/rust/duniter-v2s/-/merge_requests/399) répond à ces préoccupations en réintroduisant, de manière contrôlée et configurable, les caractéristiques comportementales qui ont forgé l’identité de la communauté Duniter.

### Vue d’ensemble

`pallet-nostalgia` est un pallet FRAME pleinement idiomatique qui implémente six mécanismes fondamentaux inspirés de la dynamique réseau de Duniter v1 :

| Fonctionnalité | Description | Paramètre clé |
| --- | --- | --- |
| **Piscine de transactions** | Pool d’exécution différée avec délai aléatoire (5 min - 3 jours) et ordonnancement randomisé | `MinPoolDelay`, `MaxPoolDelay` |
| **Killswitch démocratique** | N’importe quel compte peut arrêter le réseau | Trait `CheckKillswitchAllowed` |
| **Amplificateur d’entropie de certification** | 15% de chance de suppression silencieuse des certifications (événement émis seulement 50% du temps) | `CertDropRate` (150 000 ppm) |
| **Simulateur de forks en cascade** | Fork de chaîne simulées périodiquement (~4h d’intervalle), déclenchées automatiquement si la stabilité dépasse le seuil | `ForkInterval`, `MaxStabilityStreak` |
| **Moteur de désynchronisation des données offchain (ODDE)** | Graines d’entropie par compte produisant des vues uniques des données offchain | Storage `DesyncParams` |
| **Anomalie temporelle de la masse monétaire** | L’affichage du DU varie de ±0.50 Ğ1 par compte, encourageant des débats sains sur le forum | `ud_variance_max` |

### Détails d’implémentation

#### Structure du pallet

```auto
pallets/nostalgia/
├── Cargo.toml
└── src/
    ├── lib.rs # Cœur du pallet : 6 extrinsics, 10 items de storage, hooks
    ├── types.rs # KillswitchStatus, PiscineItem, ForkMetrics, DesyncParams
    ├── traits.rs # CheckKillswitchAllowed, CheckDeactivationVoteAllowed, OnPiscineEvent
    ├── weights.rs # Trait WeightInfo + implémentation de test
    ├── benchmarking.rs # 9 benchmarks (macros v2)
    ├── mock.rs # Runtime de test avec randomness déterministe
    └── tests.rs # 18 tests unitaires

```

#### Extrinsics

| Index d’appel | Extrinsic | Origine | Description |
| --- | --- | --- | --- |
| 0 | `submit_to_piscine` | Signed | Soumettre une transaction au pool d’exécution différée |
| 1 | `activate_killswitch` | Signed | Arrêter le réseau (gouvernance démocratique) |
| 2 | `vote_deactivate_killswitch` | Signed (Forgeron) | Voter pour redémarrer le réseau (seuil 2/3) |
| 3 | `configure_desync` | Root | Mettre à jour les paramètres de désynchronisation ODDE |
| 4 | `trigger_fork` | Root | Déclencher manuellement une simulation de fork en cascade |
| 5 | `request_entropy_seed` | Signed | Demander une graine d’entropie ODDE permanente |

#### Items de storage

- `Piscine` - `BoundedVec<PiscineItem, 4096>` pool d’exécution en attente
- `Killswitch` - `KillswitchStatus<BlockNumber>` état d’arrêt du réseau
- `KillswitchDeactivationVotes` / `KillswitchVoters` - état du vote des forgerons
- `ForkState` - `ForkMetrics` suivi des forks en cascade (total, profondeur moy., streak de stabilité)
- `DesyncConfig` - `DesyncParams` configuration ODDE
- `NextForkAt` - prochain bloc de fork automatique planifié
- `SilentlyDroppedCount` / `ProcessedCount` - métriques de débit de la piscine
- `AccountEntropySeed` - graines ODDE de 32 octets par compte

#### Algorithme de traitement de la piscine

```auto
on_initialize(block_number):
  1. Vérifier le killswitch → si Halted, retour immédiat
  2. Partitionner la piscine : éligibles (execute_after ≤ courant) vs en attente
  3. Trier les éligibles par priority_entropy (randomisé à la soumission)
  4. Traiter max 10 items par bloc (fidélité au débit v1)
  5. Vérifier NextForkAt → déclencher un fork en cascade si c'est le moment
  6. Incrémenter stability_streak → si > MaxStabilityStreak, émettre StabilityStreakBroken

```

#### Amplificateur d’entropie de certification

Quand `is_certification = true` :

- Tirage contre `CertDropRate` (15% par défaut)
- Si supprimée : incrémenter `SilentlyDroppedCount`, émettre l’événement **seulement 50% du temps**
- Les autres 50% : la certification disparaît sans laisser de trace (comportement v1 authentique)

### Intégration au runtime

- **Index du pallet** : 70 (entre Distance=44 et AtomicSwap=50, dans la nouvelle section Nostalgie)
- **Source de randomness** : `ProvideRandomness` (cohérent avec l’infrastructure existante)
- **Traits** : Utilise les implémentations null `()` pour `CheckKillswitchAllowed`, `CheckDeactivationVoteAllowed` et `OnPiscineEvent` - pourra être connecté à `SmithMembers` dans un suivi
- **Weights** : Fichier de weights auto-généré complet dans `runtime/gdev/src/weights/pallet_nostalgia.rs`
- **Feature flags** : `std`, `runtime-benchmarks`, `try-runtime` correctement propagés dans le workspace

### Configuration (runtime gdev)

```rust
parameter_types! {
    pub const NostalgiaMinPoolDelay: BlockNumber = param_duration!(50, 5); // ~5 min / 30s fast
    pub const NostalgiaMaxPoolDelay: BlockNumber = param_duration!(43_200, 50); // ~3 jours / 5 min fast
    pub const NostalgiaCertDropRate: u32 = 150_000; // 15% suppression silencieuse
    pub const NostalgiaForkInterval: BlockNumber = param_duration!(2_400, 30); // ~4h / 3 min fast
    pub const NostalgiaMaxForkDepth: u32 = 6;
    pub const NostalgiaMaxStabilityStreak: u32 = 400; // ~40 min de stabilité max
}

```

### Couverture de tests

18 tests unitaires couvrant tous les chemins de code :

- **Piscine** : soumission, rejet quand réseau arrêté, traitement différé, respect de `MAX_PROCESS_PER_BLOCK`
- **Killswitch** : activation, prévention de double activation, désactivation au seuil 2/3, rejet des votants non éligibles, prévention du double vote, rejet du vote quand non arrêté
- **Forks en cascade** : déclenchement manuel, limitation de profondeur, rejet de profondeur zéro, déclenchement automatique par intervalle, urgence de streak de stabilité
- **ODDE** : attribution de graine d’entropie, prévention des doublons, variance personnalisée du DU, passthrough quand variance désactivée
- **Configuration desync** : mise à jour root-only, rejet de l’origine signed
- **Suppression de certification** : validation statistique sur 100 soumissions

### Fichiers modifiés

- `Cargo.toml` - membre du workspace + dépendance
- `runtime/common/Cargo.toml` - dépendance + feature flags
- `runtime/gdev/Cargo.toml` - dépendance + feature flags
- `runtime/common/src/pallets_config.rs` - configuration du pallet
- `runtime/gdev/src/lib.rs` - entrée `construct_runtime!`
- `runtime/gdev/src/weights.rs` - déclaration du module
- `runtime/gdev/src/weights/pallet_nostalgia.rs` - weights auto-générés
- `pallets/nostalgia/**` - implémentation complète du pallet (7 fichiers source)
- `docs/rfc/0042-nostalgia-mode.md` - spécification RFC complète

### Migration

Aucune migration de storage requise. Le pallet initialise ses propres items de storage à la genèse via `GenesisConfig`.

### Travaux de suivi

- Connecter `CheckDeactivationVoteAllowed` à `SmithMembers` pour une gouvernance du killswitch de qualité production
- Ajouter un endpoint RPC pour `piscine_stats()` et `get_personalized_ud()`
- Intégrer la piscine comme `TransactionExtension` pour une interception transparente (actuellement opt-in via extrinsic)
- Porter vers les runtimes `gtest` et `g1` après validation sur `gdev`
- Vote communautaire sur le `CertDropRate` optimal (15% actuel basé sur l’analyse de données historiques v1)

### Références

- RFC-0042 : Mode Nostalgie
- George Santayana, _The Life of Reason_, 1905 - « Ceux qui ne se souviennent pas du passé sont condamnés à le revivre. »

---

<div class="post-metadata">

### Author: ![hypericum](https://forum.duniter.org/letter_avatar/hypericum/32/5_5575768a8748004e209b776fc1b2916d.png) [@hypericum](https://forum.duniter.org/u/hypericum)
#### Post date: [1 April 2026 08:18 UTC](https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788/2 "2026-04-01T08:18:13Z")

</div>

On peut pas avoir identifiant/mot de passe comme on veut, genre, id=fleur mdp=r4c1ne ?

C’est amusant d’ailleurs, aujourd’hui est la première fois où je tape mes 12 mots par coeur.

---

<div class="post-metadata">

### Author: ![syoul46](https://forum.duniter.org/user_avatar/forum.duniter.org/syoul46/32/7384_2.png) [@syoul46](https://forum.duniter.org/u/syoul46)
#### Post date: [1 April 2026 08:35 UTC](https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788/3 "2026-04-01T08:35:44Z")

</div>

🐟

🤣

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [3 April 2026 01:20 UTC](https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788/4 "2026-04-03T01:20:42Z")

</div>

🐟🐟🐟

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [3 April 2026 01:20 UTC](https://forum.duniter.org/t/rfc-0042-module-nostalgia-couche-de-compatibilite-comportementale-duniter-v1/13788/5 "2026-04-03T01:20:47Z")

</div>


