[petit résumé pour le contexte, la plupart se trouve dans le sujet Distance]
Après avoir mis en place l’oracle de distance sur le réseau ĞDev, on s’est rendu compte que le calcul de la distance s’intégrait mal dans le processus actuel. En effet, il n’était plus possible de valider directement l’identité cible à la 5ème certification (validate_identity), il fallait que la nouvelle identité demande l’évaluation de sa distance, qu’elle attende deux sessions, et qu’elle appelle claim_membership dans la période de validité de l’évaluation : un vrai parcours du combattant !
Comme quoi, il ne suffit pas que ça marche sans bug, il faut en plus que ce soit simple pour l’utilisateur
la pallet membership a été revue (!215) faisant disparaître le call validate_identity
la pallet smith-members va faire son apparition (!217) simplifiant beaucoup le concept d’adhésion car il n’aura plus à satisfaire à la fois aux adhésions normales et aux adhésions forgeron
les adhésion vont être automatiquement déclenchées après une évaluation positive de la distance (!219)
Je vais décrire ici le nouveau fonctionnement et les questions que ça pose.
Scénarios
1. pour une nouvelle identité
créer l’identité pour une clé publique, ce qui lui donne un idty_index IdtyStatus::Unconfirmed
confirmer l’identité pour lui donner un nom IdtyStatus::Unvalidated
donner les certification manquantes
demande l’évaluation de la règle de distance : cela peut être fait depuis n’importe quelle identité membre uniquement vers une identité non validée ou depuis l’identité elle même, à condition d’avoir assez de fonds à réserver pour la demande
request_distance_evaluation → pour soi-même
request_distance_evaluation_for pour quelqu’un d’autre (uniquement si la caller est IdtyStatus::Member et le destinataire est IdtyStatus::Unvalidated)
après deux sessions, si l’évaluation est positive, try_add_membership est appelé automatiquement, ce qui valide l’identité (IdtyStatus::Member), sinon, le demandeur est slashé du montant réservé
2. pour un renouvellement d’identité
demander l’évaluation de la distance pour soi-même request_distance_evaluation
après deux sessions, si l’identité est IdtyStatus::Member, l’adhésion est renouvelée (try_renew_membership)
3. pour redevenir membre après une adhésion perdue
demander l’évaluation de la distance pour soi-même request_distance_evaluation
après deux sessions, si l’identité est IdtyStatus::NotMember, l’adhésion est réajoutée (try_add_membership)
try_{add,renew}_membership peut échouer par exemple si une certification a été perdue entre temps
Conséquences / questions
il n’y a plus besoin de call claim_membership, la bonne manière de faire est de demander l’évaluation de la règle de distance, ensuite tout est automatique
souhaite-t-on distinguer les événements add / renew comme pour cert (CertAdded / CertRenewed) ? pour l’instant il n’y a que MembershipAdded, cf API des événements
il n’y a plus besoin de conserver le résultat du calcul de distance en mémoire car le seul moment où il est utilisé est à sa publication
Cette contrainte n’est pas strictement nécessaire, en effet. Mais il y a un scénario d’attaque un peu fourbe :
une identité a 5 certifications mais ne respecte pas la règle de distance
une personne malveillante pourrait déclencher l’évaluation de la règle de distance “trop tôt”, ce qui empêcherait de la réévaluer avant le délai de 2 sessions, ce qui empêcherait un sixième certificateur d’appeler dans un batch la certification et la demande d’évaluation
Ça ne retarde l’entrée “que” de 2 sessions, mais donner ce pouvoir à un anonyme ne me paraît pas souhaitable.
Oui, dans les deux cas on appelle check_request_distance_evaluation_common qui vérifie :
qu’il n’y a pas d’évaluation en cours
qu’il n’y a pas de statut valide en cours (ce point va dégager)
le délai de renouvellement
le nombre de certifications
Mais il y aurait peut-être moyen de refactorer avec check_idty_allowed_to_claim_membership pour éviter d’avoir deux fois le même code.
C’est fou ce que c’est long d’arriver à une solution simple !
Le seul cas où on peut lancer pour qqun d’autre c’est s’il est Unvalidated, alors que après ta mort tu est juste NotMember puis Revoked. Donc non, pas de zombies
Parfait. Ce serait utile de décrire de manière exhaustive les différents nouveau status du coup, soit dans ton post ici dans scénarios, soit ailleurs sur site web je ne sais pas.
Genre dans quels cas peut ont peut être NotMember, quand est-ce qu’on passe Revoked. Par defaut un simple wallet à un status IdtyStatus::None ou juste rien ? Ce genre de choses
Aussi je me demande si ce ne serait pas utile d’avoir un extrinsic qui ne fasse que évaluer la règle de distance et retourner le résultat, sans tenter de valider l’identité, ou bien si l’oracle de distance aura une API public pour ça, ou bien qu’on se dise non il faut un autre outil externe genre wotwizard pour faire ça.
Oui, il faudra documenter, en attendant il y a les commentaires du code
/// status of the identity
// this is a kind of index to tell the state of the identity
#[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
#[derive(Encode, Decode, Default, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
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,
}
Il faudra qu’on fasse un outil externe pour ça, qui peut utiliser le code de distance-oracle. Un cron qui évalue pour toute la toile tous les jours et sert le résultat hyper simplement avec une API json par exemple. Mais pour l’instant on peut juste faire un batch à la cinquième certification et on ajoutera le check informé ensuite.
Pour moi c’est nécessaire à l’antispam, puisque les frais ne peuvent remplir ce rôle ici. Sinon on peut relancer l’évaluation à chaque cycle sans qu’il soit possible de l’empêcher. Si on peut identifier le demandeur, il est possible de lui appliquer un délai.