L'algorithme de consensus utilisé par Tendermint, est un algorithme de consensus byzantin.
L'avantage de ce dernier est qu'il ne nécessite pas de minage pour apporter une solution au problème des généraux byzantins.
Avant de commencer, un peu de vocabulaire. Les participants dans le protocole sont appelés des validators. A chaque tour de consensus appelé round, un validator est choisi selon l'algorithme de round-robin pour proposer le prochain bloc.
Un round est composé de 3 étapes qui prennent chacune 1/3 du temps d'un round :
Il y a par ailleurs 2 phases supplémentaires : Commit and NewRound.
Un seul est choisi parmi tous les validators pour proposer le prochain bloc.
Il envoie sa proposition de bloc signée à tous ses pairs, qui le relayent à leur tour.
locked sur un bloc, il propose ce bloc.locked d'un bloc est expliqué dans la suite.Structure d'une proposition
Source : https://tendermint.com/static/docs/tendermint.pdf
Chaque validator vérifie la validité du bloc proposé puis envoie à tous les autres un message prevote signé pour le bloc proposé.
nil prevote.locked sur un bloc du round précédent, il envoie un prevote pour ce bloc.Aucun bloc ne peut être locked dans cette étape.
Chaque validator vérifie les messages prevote reçus.
locked en abandonnant l'ancien bloc locked.nil prevote est supérieur à 2/3 du nombre total de noeuds, alors le bloc locked est unlocked.Un seul bloc peut être locked à la fois.
proof-of-lock pour la proposition du prochain round.locked.A la fin de cette étape, si les noeuds ont reçu plus de 2/3 de precommit pour un bloc, alors on entre dans la phase commit ; sinon on recommence à partir de l'étape propose.
Il faut 2 conditions pour finaliser le round :
Dès que ces 2 conditions sont remplies, le noeud affecte au CommitTime le temps actuel et passe à la phase NewRound.
Pour que le consensus soit maintenu, il faut que les horloges de tous les noeuds restent précises pendant toute la durée du consensus.
Tant que le consensus sur le bloc proposé n'aboutit pas, il faut réitérer les étapes propose, prevote et precommit.
Voici quelques exemples de cas où le consensus ne peut aboutir :
nilVue d'ensemble des différentes étapes
Source : https://tendermint.com/static/docs/tendermint.pdf