Ğ1v2: proposition de passer au consensus hybride BABE/GRANDPA

Dans le cadre de la future migration de la Ğ1 sur substrate (voir ce sujet), je propose de remplacer notre PoW avec diff perso par un mécanisme de consensus hybride basé notamment sur des VRF (Verifiable Random Function).

Substrate nous fourni clé en main un consensus hybride BABE/GRANDPA issue de nombreuses années de recherches par des experts de la blockchain chez la web3 foundation, et en production sur plusieurs grosses crypto-monnaies dont Kusama et polkadot.

Ce sera infiniment plus simple techniquement d’utiliser BABE/GRANDPA, il est techniquement possible de recoder notre PoW à diff perso dans Substrate, mais ce serait beaucoup plus de boulot et plus d’inconvénients, je ne souhaite pas le faire.

Les avantages de passer à BABE/GRANDPA:

  • Un bloc toutes les 6 secondes, donc moins de temps à attendre pour que sa transaction passe
  • Une finalisation définitive des blocs en 20 à 30 secondes quand le réseau va bien, ce qui permet d’être certain de l’irrévocabilité d’une transaction très rapidement.
  • Pas de preuve de travail, pas de calcul coûteux, donc bien plus écolo.

Voici le fonctionnement de BABE dans les grandes lignes:

La création des blocs est divisée en epoch d’une durée fixe (par exemple 4h), à chaque epoch la liste des validateurs est connue et ne peut pas changer pendant l’epoch.

Les validateurs (=membres forgerons) qui souhaitent participer à l’epoch N doivent s’inscrire avant l’époch N-2 via un extrinsic dédié publiant on-chain des sessions-keys (sorte de clés déléguées), comprenant notamment une clé publique pour la VRF. (La réinscription pour chaque epoch peut être automatique, et le membre concerné peut à tout moment y mettre fin).

À chaque nouvelle epoch N (par exemple toutes les 4h), une graine aléatoire (randomness source) est créée en se basant sur les outputs VRF des 2 dernières epochs.

À chaque bloc de l’epoch (on parle de slot), chaque validateur participant exécute la VRF avec en entrée la graine aléatoire et sa clé privée VRF. En sortie la VRF produit un nombre aléatoire et une preuve qu’il ne pouvait trouver que ce nombre (une sorte de signature, qui sera vérifiée grâce à la clé publique VRF publiée préalablement).
Si le nombre aléatoire est en dessous d’un certain seuil, alors le validateur concerné a le droit de générer un bloc, on parle de bloc primaire.

À chaque slot, entre zéro et plusieurs blocs primaires peuvent être émis.
À chaque slot est émis également 1 bloc secondaire, par le validateur dont c’est le tour (round-robin via modulo).
La chaine privilégiée est la chaine qui cumule le plus de blocs primaires depuis le dernier bloc finalisé.

Des explications simples sur la doc de polkadot : Polkadot Consensus · Polkadot Wiki

Les « whitepaper » de BABE et GRANDPA:

BABE: BABE — Research at W3F
GRANDPA: https://raw.githubusercontent.com/w3f/consensus/master/pdf/grandpa.pdf


Notez bien que le consensus hybride BABE/GRANDPA ne dit pas qui a le droit de s’inscrire comme validateur ni quels validateurs doivent être sélectionnés à chaque epoch, la palette babe nous laisse définir cela en fournissant nos propres fonctions, c’est là que je pense évidemment à la sous-toile forgeron que j’avais proposée il y a déjà 3 ans : Proposition d’identités forgerons − solution user-friendly au problème de sécurité des instances cesium web

4 « J'aime »