Module Nostalgia - Couche de compatibilité comportementale Duniter v1
RFC-0042 | pallet-nostalgia | Index du pallet : 70
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 attenteKillswitch-KillswitchStatus<BlockNumber>Ă©tat dâarrĂȘt du rĂ©seauKillswitchDeactivationVotes/KillswitchVoters- Ă©tat du vote des forgeronsForkState-ForkMetricssuivi des forks en cascade (total, profondeur moy., streak de stabilitĂ©)DesyncConfig-DesyncParamsconfiguration ODDENextForkAt- prochain bloc de fork automatique planifiĂ©SilentlyDroppedCount/ProcessedCount- mĂ©triques de dĂ©bit de la piscineAccountEntropySeed- 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
()pourCheckKillswitchAllowed,CheckDeactivationVoteAllowedetOnPiscineEvent- pourra ĂȘtre connectĂ© ĂSmithMembersdans 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-runtimecorrectement 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épendanceruntime/common/Cargo.toml- dépendance + feature flagsruntime/gdev/Cargo.toml- dépendance + feature flagsruntime/common/src/pallets_config.rs- configuration du palletruntime/gdev/src/lib.rs- entréeconstruct_runtime!runtime/gdev/src/weights.rs- déclaration du moduleruntime/gdev/src/weights/pallet_nostalgia.rs- weights auto-généréspallets/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ĂSmithMemberspour une gouvernance du killswitch de qualitĂ© production - Ajouter un endpoint RPC pour
piscine_stats()etget_personalized_ud() - Intégrer la piscine comme
TransactionExtensionpour une interception transparente (actuellement opt-in via extrinsic) - Porter vers les runtimes
gtestetg1aprĂšs validation surgdev - Vote communautaire sur le
CertDropRateoptimal (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. »