🐟 [RFC-0042] Module Nostalgia : couche de compatibilitĂ© comportementale Duniter v1

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

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 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

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

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)

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. »
7 Likes

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.

:fish:

:rofl:

:fish::fish::fish: