L'algorithm de consensus byzantin (BCA) utilisé par Tendermint est un algorithme de consensus basé sur une solution existante du problème des généraux byzantins (BGT). Il ne nécessite pas de preuve de travail (PoW), il est donc plus efficace en termes de consommation d'énergie, et plus rapide car il ne nécessite pas de temps de blocage. Il peut assurer un fonctionnement sûr du réseau s’il y a au moins 2/3+ (strictement plus des deux tiers) de participants « honnêtes » au réseau.
Validators
Premièrement les validators, et ce sont les participants qui font fonctionner le réseau.
Contrairement à la PoW ou à la PoS, où n'importe qui peut devenir mineur à tout moment, au sein de la BCA, seuls les validateurs peuvent participer à la formation de la blockchain.
Round
Un tour dans le processus de consensus est appelé un round. Chaque round est composé de trois étapes: Propose, Prevote et Precommit.
Proposer
Un proposer est un validateur qui a le droit de proposer un bloc pour le round en cours. Le proposer est choisi en utilisant un algorithme de rotation de round-robin.
Durant la recherche du N-ème block, le processus suit les étapes suivantes.
NewHeight -> (Propose -> Prevote -> Precommit)+ -> Commit -> NewHeight ->…
Propose
Prevote
prevote au reste des nœuds.prevote nil au reste des nœuds.Precommit
prevotes pour la même proposition, enverra un message precommit pour cette proposition, sinon il enverra un message precommit nil.precommits pour la même proposition, alors le bloc est considéré comme validé, donc le processus continue avec la phase commit.newRound.Commit
round.
commit pour le même bloc.Une fois les deux conditions satisfaites, le nœud définit son CommitTime et passe vers l'étape NewHeight
NewHeight est de rassembler des commits supplémentaires pour le bloc validé au round précédent.commits.Si il y a -1/3 des validateurs qui sont malveillants, l'algorithm peut garantir la sécurité du réseaux. C'est-à-dire que les validateurs ne valideront jamais de blocs conflictuels à la même hauteur.
Pour assurer cela, l'algorithm introduit des régles de verrouillage lock.
precommit pour un block donné, il se verrouille sur ce block et libère tous les verrous précédents.prevotes nil, il se déverrouille simplement.prevotes pour le bloc verrouillé (ou les prevotes nil) et les regroupe dans une preuve de verrouillage pour plus tard quand ce sera son tour de proposer.prevotes pour un bloc donné, alors il ne verrouille rien.