La sous-toile forgerons

Je vais vous décrire le fonctionnement de ma 1ère implémentation de la sous-toile forgeron, ce ne sera pas forcément le fonctionnement définitif, certaines choses pourront changer d’ici la migration effective sur la Ğ1 (et même après, rien n’est figé à jamais).

Rappel du pourquoi

Avoir une sorte de sous-toile forgeron, où en tout cas limiter de droit de créer des blocs via une certification spéciale de type forgeron et une licence spéciale forgeron est une idée que j’ai proposée il y a déjà plus de 3 ans:

Le fait que tous les membres de la toile de confiance peuvent écrire des blocs est pour moi l’une des plus grandes failles de sécurité de la Ğ1, ça va que nous somme encore petit, mais plus la Ğ1 grandira et plus cette faille deviendra problématique et facile à exploiter, car il y aura de plus en plus de gens lambda parmi les membres, dont parmi eux des utilisateurs trop négligeant (ou mal informés) sur la sécurité de leurs clés privées et de leurs machines.

Encore plus nécessaire avec le nouveau consensus BABE/GRANDPA

La migration sur substrate va s’accompagner d’un changement du mécanisme de consensus, nous allons passer d’une preuve de travail à difficulté personnalisée à un protocole hybride basé sur une VRF pour «tirer au sort» de manière vérifiable et non manipulable qui va écrire le prochain bloc, et sur un système de vote automatique des nœuds pour “finaliser” les blocs passés.

Pour plus de précision, voir le sujet dédié : Abandon de la PoW au profit de BABE/GRANDPA - #26 by cgeek

Ce changement de mécanisme de consensus à de nombreux avantages, mais également quelques inconvénients, qui font qu’il n’est pas envisageable d’adopter ce nouveau mécanisme de consensus si tous les membres peuvent potentiellement écrire des blocs.

La sécurité de BABE/GRANDPA est basée sur des mécanismes automatisés de rapport de fautes et de sanctions, elle nécessite que la liste des créateurs de bloc soit connue précisément onchain et qu’il soit tous bien en ligne sur les périodes ou ils sont inscrits.

Avec duniter v1 et sa PoW, si un membre déploie un nœud Duniter à l’arrache et l’oubli et que le nœud se désynchronise ce n’est pas grave, ça ne pénalise pas vraiment le réseau, et l’utilisateur ne sera pas impacté.
Avec Duniter-v2s, un utilisateur qui ne produit pas de bloc alors qu’il est censé le faire sera sanctionné et exclu automatiquement de la liste des autorités en cours (il pourra y re-rentrer quand il voudra via un extrinsic dédié si la sanction n’inclut pas de la suspension de droit pour un temps).

Différence entre membre forgeron et autorité

Être membre de la toile forgeron et être inscrit dans le set des autorités sont 2 notions distinctes.
Chaque membre forgeron peut demander (quand il est prêt techniquement), à rentrer dans le set des autorités via un extrinsic nommé authorityMembers.goOnline, puis à sortir du set des autorités via un extrinsic nommé authorityMembers.goOffline.

C’est seulement quand un membre est dans le set des autorités qu’il a l’obligation de produire des blocs quand c’est son tour, une fois qu’il est sorti du set des autorités (suite à sa demande goOffline), il n’a plus aucune obligation et peut partir en vacances tranquille.

Votre nœud substrate produira automatiquement des blocs lorsque vous êtes dans le set des autorités, et cessera automatiquement de le faire lorsque vous n’y êtes plus.

Il sera nécessaire de monitorer vos nœuds et de mettre en place un système d’alerte, je le ferai moi-même et expliquerai comment j’aurais fait.
Il sera également important de penser à exécuter l’extrinsic goOffline quand vous savez que vous ne pourrez pas intervenir dans une durée raisonnable en cas d’alerte.

La toile forgeron ne va donc pas définir directement qui créé des blocs, mais qui est éligible pour s’inscrire à la création des blocs (devenir une autorité pour un temps).

Le temps: la notion de sessions

Une session est une durée pendant laquelle le set des autorités ne peut pas changer. Si vous vous inscrivez à la session N (appel à l’extrinsic goOnline), vous ferez partie des autorités dès le 1er bloc de la session N+2.
Inversement, si vous faite déjà partie des autorités et que vous exécutez l’extrinsic goOffline, vous resterez autorité jusqu’au dernier bloc de la session N + 1. Votre désinscription sera effective au 1er bloc de la session N + 2.
Plus une session est longue , mieux c’est pour la stabilité du réseau, mais ça implique plus de latence pour entrer et sortir.
Une session dure 1h sur Kusama et 4 h sur Polkadot. 1h est une valeur minimale, pour la ğ1 ce sera au minima 1h (peut-être plus), nous avons encore largement le temps pour décider ça.

Fonctionnement de la toile forgeron

Nous écrirons le moment venu un guide plus détaillé à destination des utilisateurs, ma présente description est pour les contributeurs techniques.

Partons du cas d’usage d’un utilisateur membre de la toile de confiance (Kevin) et qui souhaite participer à la co-création des blocs.

La 1ère étape pour Kevin va être de lire et accepter la licence forgeron, une licence spéciale qui contiendra plus de règles de plus d’engagements que la licence Ğ1.

Ensuite, si Kevin est en accord avec le contenu de la Licence forgeron, la 2ᵉ étape est de déployer un nœud miroir (si ce n’est pas déjà fait), et de vérifier qu’il fonctionne bien, qu’il est bien synchro au réseau, demander du support sur le forum Duniter si besoin.

En 3ᵉ étape, il est recommandé de demander à au moins un membre forgeron de vérifier l’état de votre nœud, en lui fournissant à minima votre PeerId. Laissez passer quelques jours, si le nœud reste synchro et que tout semble bien fonctionner, il est temps de demander officiellement l’adhésion à la toile forgeron.

En 4ᵉ étape Kevin va demander l’adhésion à la toile forgeron via l’extrinsic smithsMembership.requestMembership. Cet extrinsic va lui demander un certain nombre d’information (qui seront listées et expliquées dans la licence forgeron et le guide) :

  1. Ses sessions keys : il s’agit de clés déléguées qui vont servir au nœud pour créer des blocs, Kevin doit les générer via la ligne de commande ou l’API RPC privée de son nœud, il pourra les modifier plus tard, mais tout membre forgeron doit avoir des sessions keys définies et connues onchain à tout instant t, il faut donc les définir dès que l’on demande l’adhésion. C’est aussi une preuve de sérieux qui servira de 1er filtre (il faut comprendre ce que c’est que ces session keys et comment les générer).
  2. Son endpoint p2p : ça permettra à ses potentiels certificateurs de vérifier qu’il a bien un nœud actif sur le réseau et bien configuré.

On pourrait ajouter en 3. le hash du texte de la licence forgeron, je ne l’ai pas fait car elle n’existe pas encore, mais quand elle sera rédigée ça pourrais être utile en cas de litige, c’est juste une idée, on en discutera le moment venu.

En 5ᵉ étape, dès lors que Kevin a publié sa demande d’adhésion en blockchain, tout membre forgeron peut le certifier dès le bloc suivant (6 secondes plus tard donc).
Pour devenir membre forgeron, Kevin doit obtenir au moins SmithsWotMinCertForMembership certifications en moins de SmithsPendingMembershipPeriod blocs, ces deux valeurs sont des paramètres de la monnaie qu’il nous faudra définir.

Si au bout de SmithsPendingMembershipPeriod blocs, Kevin à toujours moins de SmithsWotMinCertForMembership certifications, sa demande d’adhésion est supprimée et les certifications qu’il a reçues sont supprimées également, les certificateurs de Kevin récupèrent donc immédiatement ces certifications dans leur “stock” de certifications.
Lorsque Kevin reçoit sa Nème certification, si sa demande d’adhésion existe toujours et que N == SmithsWotMinCertForMembership, sa demande d’adhésion est confirmée et Kevin devient instantanément membre de la toile forgerons. Il peut alors dès le prochain bloc soumettre l’extrinsic goOnline pour s’inscrire parmi les autorités, il peut aussi ne pas le faire.

J’ai implémenté un paramètre MaxOfflineSessions, qui définit le nombre maximum de sessions consécutives où un membre forgeron a le droit de rester “désinscrit” avant que son adhésion soit supprimée. Il suffit de participer à une seule session pour repousser l’échéance, mais ça permet de s’assurer que ne reste membres forgerons que ceux qui participent régulièrement à la création des blocs.
Je pense à une valeur de l’ordre de quelques mois.

À côté de ça, tous les paramètres liés à l’adhésion et la certification existe aussi pour la sous-toile forgeron : durée de validité, durée minimale entre deux renouvellements, etc. Je ferai un point sur tous les paramètres dans un sujet dédié, ici restons centrés sur la toile forgeron.

La gouvernance onchain

Avec substrate, on a pas juste un programme binaire mais deux parties distinctes : le runtime et le client.

:warning: ATTENTION : Dans les milieux crypto, la notion de “client” désigne ce que nous appelons le nœud ou le cœur sur ce forum. Ce que nous appelons généralement “client” sur ce forum n’a rien à voir et est appelé “wallet” dans les milieux crypto. :warning:

Le “client” substrate, est aussi parfois nommé le “binary” ou “host”, c’est un programme binaire qui se met à jour comme un serveur blockchain classique.

En revanche, le runtime fonctionne différemment, son code (en wasm) est inclus dans le storage onchain, et ne peut être modifié que par l’appel de l’extrinsic system.setCode. Il n’est donc pas possible de mettre à jour le protocole (géré par le runtime), sans mécanisme de gouvernance onchain.

Pour les monnaies de test, il y aura une sudoKey, partagée seulement par quelques développeurs, qui permettra de mettre à jour le runtime, mais cela implique une centralisation du pouvoir qui ne sera pas envisageable pour la monnaie de production (la Ğ1).

C’est pourquoi nous devons obligatoirement définir un mécanisme de gouvernance onchain pour pouvoir migrer la Ğ1 sur substrate.

Je propose dans un premier temps de partir sur un mécanisme simple et proche de l’existant : donner le droit root à X% des membres forgerons.

Concrètement, cela signifie qu’il faudra que X% des membres forgerons signe une proposition de mise à jour du runtime (ou de tout autre appel en tant que root) pour qu’elle soit appliquée.

La pallet collective permet déjà d’appeler un extrinsic au nom d’un groupe, elle gère les votes au sein du groupe défini, puis si un seuil est atteint, l’extrinsic proposé est automatiquement exécuté avec une Origin spéciale de type Members(a, b), où a est le nombre de membres ayant voté pour et b le nombre de membres total dans le groupe.

La toile forgeron servirait donc à deux choses :

  1. Définir qui a le droit de s’inscrire parmi les créateurs de bloc.
  2. Définir qui a le droit de voter un changement de runtime (ou tout autre appel root).

Je suis favorable à ce que cette 2ᵉ fonction soit modifiée-supprimée pour diluer le pouvoir, et j’espère que nous aurons d’intéressantes discussions là-dessus après la migration effective de la Ğ1, il ne faut pas faire trop de choses d’un coup.

12 Likes

Actuellement, il n’y a rien qui empêche d’émettre une certification forgeron vers une identité qui n’a pas fait de demande d’adhésion forgeron. On a plusieurs possibilités dont :

  • conserver ce comportement et désactiver la demande forgeron (on pourrait rendre automatique smithsMembership.requestMembership() et smithsMembership.claimMembership(), ce qui simplifierait la procédure, d’autant plus que les metadata sont purement déclaratives, et n’ont aucune portée fonctionnelle
  • ajouter une contrainte supplémentaire pour conditionner l’émission d’une certification forgeron à la demande d’adhésion forgeron, ce qui ferait moins de modifications et serait plus logique
  • laisser comme ça, de toute façon ça change pas grand chose

Par curiosité, je laisse un petit sondage sur ces trois propositions :

  • simplifier la procédure (uniquement certifications forgeron, pas de demande ni confirmation d’adhésion)
  • conditionner les certifications forgeron à la demande d’adhésion forgeron
  • laisser comme ça pour l’instant, on s’en tape, c’est pas prioritaire avant la migration
0 voters
1 Like

Pour ma part, c’est juste la phase smithsMembership.claimMembership() qui m’a parut inutile et que j’aurai aimé être automatique.

Demander une adhésion me paraît un geste utile et ne pouvoir certifier que si celle-ci a eu lieu, plus logique et propre.

Maintenant, à voir si c’est simple et sans effets de bords à modifier. Mais autant faire la migration en n’ayant pas accumulé trop de petites choses étranges ou contre-intuitives qui rendraient difficile l’entrée de nouveaux contributeurs dans le code. Amha.

1 Like

Je suis d’accord. Ce call est nécessaire pour la toile principale (à cause du username) mais inutile ici. Ça doit pouvoir s’automatiser facilement dans runtime/common/src/handlers.rs.

Je suis pour la deuxième option à terme. Ça évite de se retrouver forgeron sans l’avoir demandé.

Mais à moins que ce soit trop embêtant pour les devs de clients, ça ne me semble pas prioritaire.

1 Like

Je pense aussi que la possibilité de certifier quelqu’un forgeron doit résulter d’une demande explicite de ce quelqu’un pour rentrer dans la toile. Sinon on risque de se retrouver avec des forgerons qui n’auront rien demandé à personne (même si c’est peu probable, c’est une éventualité).

Sur la priorité je n’ai pas d’avis. Sauf que simplifier le process permet d’avoir plus de forgerons plus rapidement.

La toile forgeron est censée être conditionnée à la compréhension de la licence forgeron. Si des forgerons sont capables d’émettre des certifications vers quelqu’un qui ne souhaite pas être forgeron c’est déjà un problème. Ajouter une couche de complexité technique ne me paraît pas être une bonne manière de répondre à ce problème humain.

Être forgeron ne veut pas dire être online. Si la personne ne fait pas de demande go-online, il n’y a pas de problème. Si elle fait go-online par erreur sans avoir de noeud configuré comme validateur, les offences vont la blacklister. De plus, il est toujours possible de retirer le statut de forgeron via la gouvernance on-chain si on se rend compte qu’il y a eu une erreur.

1 Like

J’ai ajouté le tag todo à ce sujet car les règles de la sous-toile forgerons sont toujours mal spécifiées.
Pendant les rml17 il a également été suggéré de retirer la sous-toile forgeron et d’avoir un autre mécanisme de nomination des validateurs, ça apparaît sur le schéma de @1000i100 qui n’a pas encore été publié sur ce forum à ma connaissance.

À cela s’ajoute un comportement contre-intuitif supplémentaire : on peut émettre des certifications forgeron sans avoir d’adhésion forgeron du moment qu’on a atteint le seuil de certifications reçues.

(Par ailleurs, c’est la même chose sur la toile principale, mais c’est une autre histoire)

2 Likes

En fait, on peut même émettre une certification forgeron vers une identité sans qu’elle soit validée (cf Demande de certifications bgallois). Feature ou bug ? Il faut qu’on décide entre deux fonctionnements :

  • toutes les actions doivent être faites séquentiellement et sont prérequis pour la suite :
    • création d’identité
    • confirmation d’identité
    • autres certifications
    • demande d’évaluation de la règle de distance
    • validation d’identité
    • demande d’adhésion forgeron
    • certifications forgeron
    • validation de l’adhésion forgeron
  • certaines actions peuvent être faites dans un ordre qui n’importe pas
    • certifications forgeron
    • validation d’identité
    • demande d’adhésion forgeron
    • validation d’adhésion forgeron

D’ailleurs, révoquer son adhésion forgeron n’entraîne pas la perte des certifications, on peut donc juste après re-demander l’adhésion et re-valider l’adhésion sans avoir à re-obtenir les certifications. À voir si c’est ce qu’on souhaite.

3 Likes

Je trouve cette feature pratique, par exemple pour @Pini qui a dû révoquer son adhésion smith pour migrer, il n’aura donc qu’a refaire la demande d’adhésion et go_online sans repasser par la case demande de certifications.

Par contre sur ce fonctionnement, je suis clairement pour la première proposition

Ca clarifie grandement le procédé, évite des confusions, et verrouille un parcours initiatique qui devra de toute façon être fait côté client (comme Ğecko le fait pour la toile principale).

Les clients (graphiques grand publics j’entends) ne devraient pas proposer de certifier smith une identité non validé ou qui n’a pas fait sa demande d’adhésion smith.
Enfin c’est mon avis.

5 Likes