Duniter v2 utilise des pallets instanciables comme :
- la pallet wot
- la pallet membership
- la pallet certifications
Les deux instances de ces pallets sont :
- toile principale
- toile forgeron
Cela veut dire qu’il y a :
// une seule pallet identity (pas instanciable)
Identity: pallet_identity::{Pallet, Call, Config<T>, Storage, Event<T>} = 41,
// Web Of Trust
Wot: pallet_duniter_wot::<Instance1>::{Pallet} = 40,
Membership: pallet_membership::<Instance1>::{Pallet, Call, Config<T>, Storage, Event<T>} = 42,
Cert: pallet_certification::<Instance1>::{Pallet, Call, Config<T>, Storage, Event<T>} = 43,
// une seule pallet distance (pas instanciable)
Distance: pallet_distance::{Pallet, Call, Storage, Inherent} = 44,
// Smith Sub-Wot
SmithSubWot: pallet_duniter_wot::<Instance2>::{Pallet} = 50,
SmithMembership: pallet_membership::<Instance2>::{Pallet, Call, Config<T>, Storage, Event<T>} = 52,
SmithCert: pallet_certification::<Instance2>::{Pallet, Call, Config<T>, Storage, Event<T>} = 53,
C’est pratique, parce que ça permet de découper en petit composants testables et réutilisables des fonctionnalités très similaires.
Mais jusque là, les traits comme CheckCertAllowed
et CheckMembershipCallAllowed
étaient définis sans prendre en compte les instances, avec I: 'static
:
impl<T: Config<I>, I: 'static> /* [...] */ for Pallet<T, I>
Et les seules vérifications faites l’étaient sur une pallet non instanciable (en l’occurence pallet_identity
).
Cela empêche par exemple :
- de vérifier que l’émetteur d’une certification est bien membre
- de vérifier que le destinataire d’une certification a bien une adhésion ou une demande d’adhésion en cours
Pour contourner ça, elois a utilisé le statut d’identité (Demande d'adhésion et statut d'identité), ce qui fonctionnait à peu près pour la toile principale, mais :
- causait un comportement étrange pour la toile forgeron (Becoming smith (request_membership, claim_membership))
- limitait les possibilités de perte de statut membre (expiration d’adhésion, passage sous le seuil de certifications, ou évaluation négative du critère de distance)
Je pense que elois n’avait pas totalement conscience de ça et que c’était la raison secrète qui le poussait à vouloir Proposition de supprimer la notion d'identité désactivée mais non révoquée et la notion d'adhésion.
La bonne manière de faire (selon moi) serait de donner les instances Cert
et Membership
à Wot
(et SmithCert
et SmithMembership
à SmithSubWot
) pour pouvoir implémenter les traits sur des instances, et non pas de manière statique.
Comme ça représente quand même un certain chantier qui peut me prendre quelques semaines à finaliser (implémentation, relecture, tests…), je pense que je vais le faire après le lancement du réseau de test tant attendu. À voir si ça vaudra la peine de déployer dessus (sûrement des migrations complexes à écrire) ou s’il vaudra mieux rebooter un nouveau réseau de test.
Et je vais me contenter d’un fix simple pour #129 en supprimant simplement les métadonnées d’adhésion.