Proposition pour supprimer la pallet membership

Suite aux discussions essentiellement sur À quoi servent les pending membership?, mais aussi sur Résistance au changement, la nuit porte conseil et ailleurs, tout montre que séparer le concept d’adhésion et d’identité apporte peu d’intérêt par rapport à la complexité d’une pallet supplémentaire. L’idée a mis du temps à mûrir dans ma tête, et voici ce que j’ai actuellement :

voilà ldtyValue actuellement

/// identity value (as in key/value)
#[derive(Serialize, Deserialize, Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)]
pub struct IdtyValue<BlockNumber, AccountId, IdtyData> {
    /// data shared between pallets defined by runtime
    /// only contains first_eligible_ud in our case
    pub data: IdtyData,
    /// block before which creating a new identity is not allowed
    pub next_creatable_identity_on: BlockNumber,
    /// previous owner key of this identity (optional)
    pub old_owner_key: Option<(AccountId, BlockNumber)>,
    /// current owner key of this identity
    pub owner_key: AccountId,
    /// next action scheduled on identity
    // 0 if no action scheduled
    pub next_scheduled: BlockNumber,
    /// current status of the identity (until validation)
    pub status: IdtyStatus,
}

et l’enum status qui est dedans

pub enum IdtyStatus {
    /// created through a first certification but unconfirmed
    #[default]
    Unconfirmed,
    /// confirmed by key owner with a name published but unvalidated
    Unvalidated,
    /// member of the main web of trust
    // (there must be a membership in membership pallet storage)
    Member,
    /// not member of the main web of trust, auto-revocation planned
    NotMember,
    /// revoked manually or automatically, deletion possible
    Revoked,
}

Cette situation actuelle représente mal la donnée :

  • lorsque le status est Member, next_scheduled vaut 0 et la pallet membership contient un équivalent “MembershipsExpireOn
  • lorsque le status est Revoked, next_scheduled vaut 0
  • IdtyData contient toujours une donnée first_eligible_ud de la pallet universal_dividend qui n’a de sens que quand status vaut Member
  • old_owner_key n’a de raison d’être que pour status Member ou NotMember
  • next_creatable_identity_on n’a de sens que si l’on souhaite avoir un délai de création d’identité strictement supérieur au délai de certification et lorsque status est Member

bref, vous voyez sûrement où je veux en venir : IdtyValue ne devrait pas être un struct qui contient status, mais plutôt directement cette enum, ce qui donnerait quelque chose comme:

pub enum Identity {
    /// created through a first certification but unconfirmed
    Unconfirmed {
        owner_key: AccountId,
        expire_on: BlockNumber,
    },
    /// confirmed by key owner with a name published but unvalidated
    Unvalidated {
        owner_key: AccountId,
        expire_on: BlockNumber,
    }
    /// member of the main web of trust
    Member {
        owner_key: AccountId,
        old_old_owner_key: AccountId,
        expire_on: BlockNumber,
    },
    /// not member of the main web of trust, auto-revocation planned
    WasMember {
        owner_key: AccountId,
        old_old_owner_key: AccountId,
        revokes_on: BlockNumber,
    },
    /// revoked manually or automatically, deletion possible
    Revoked {
        deletes_on: BlockNumber,
    },
}

On pourrait également mettre first_eligible_ud dans la variante Member, mais ça me semble moins bien que de déplacer cette information dans une map idty_index → first_eligible_ud dans la pallet universal dividend, et de gérer les auto-claim et init avec un handler de MembershipRemoved et MembershipAdded.

Cela mènerait à fusionner IdentityChangeSchedule et MembershipsExpireOn qui sont à peu près la même chose, c’est-à-dire un scheduler qui force à avancer d’un état dans la machine à état :

4 Likes

Le graphique du cycle de vie d’une identité est superbe et très clair ! :clap:

J’ai juste une proposition à faire pour les status Unconfirmed et Unvalidated:blush:

Ils font référence à des statuts futures mais qui ne sont pas dans la liste enum. Confirmed et Validated sont donc des status implicites et non explicites. De plus ils commencent par une négation ce qui peut faire penser à un état problématique ou une erreur.

Des propositions explicites :

  • Created
  • Confirmed

ou implicites :

  • WaitingConfirmation
  • WaitingValidation

Sachant que ces status d’identités risquent d’être des termes à expliquer aux utilisateurs, pour qu’ils comprennent bien les étapes à suivre, je pense qu’ils ont plus d’importance que d’autres. Qu’en pensez vous ?

3 Likes

En fait c’était le cas avant, j’aurais dû t’ajouter en reviewer sur la MR 215 : refac membership (!215) · Merge requests · nodes / rust / Duniter v2S · GitLab

Mais tu as raison, autant se mettre d’accord sur ces noms ensemble puisqu’on les verra partout dans le code.

2 Likes

Ça ne me dérange pas du tout si la proposition de vit est retenue au final.

1 Like

Ce sujet montre à nouveau son intérêt puisque je me rends compte que identity.next_scheduled et membership.expire_on ne fonctionnent pas comme prévu. Actuellement mon identité est membre, et les deux valent 3756656 alors que je me serais attendu à ce que next_scheduled vaille 0. Une refonte n’est pas programmée avant la migration de la Ğ1, ça chamboulerait trop de choses, mais il va falloir être très attentif à la couverture de tests pour ce cas de figure.
(suivi dans le ticket #244)

1 Like