Tours prioritaires, blocs vides et producteur précédent
Deux règles décident de ce qu’un producteur tiré peut mettre dans son bloc, et à quel moment. Seuls les producteurs des dix premiers tours peuvent inclure des transactions ; les producteurs suivants ne peuvent produire que des blocs vides. Et le nœud qui a produit le bloc précédent est rétrogradé dans le tirage suivant : il ne produit donc le bloc suivant qu’en repli tardif. Ces deux règles maintiennent la chaîne en marche quoi qu’il arrive, tout en laissant les choix importants aux producteurs que le tirage a placés en tête.
Tours prioritaires
Chaque producteur a une position : l’indice, compté à partir de 0, du tirage qui l’a désigné. Le paramètre max_priority_blocksmiths vaut 10, donc :
- les positions 0 à 9, c’est-à-dire les tours 1 à 10, peuvent porter des transactions ;
- à partir de la position 10 (tour 11 et au-delà), le bloc ne doit porter aucune transaction. Il peut toujours porter des reçus.
La règle est vérifiée au moment où le bloc est produit, dans le pool de blocs candidats de chaque nœud, et par chaque validateur. Un bloc tardif qui inclut des transactions est refusé.
La règle concilie deux objectifs. La vivacité ne dépend jamais de la présence en ligne des premiers producteurs : même si de nombreux nœuds tirés sont hors service, un nœud placé plus bas dans la liste fait continuer à croître la chaîne. Mais le droit de choisir les transactions reste aux producteurs de plus haute priorité ; un nœud mal classé ne gagne donc rien à se précipiter pour placer sur la chaîne un bloc plein, ou un bloc de transactions triées sur le volet.
Un bloc vide est un bloc complet
Un bloc vide est parfaitement valide. Il porte les reçus que son producteur a gagnés, de sorte que le travail de relais de ce producteur compte toujours pour son score de participation. Il verse aussi la coinbase que le calendrier prévoit pour son horodatage, comme n’importe quel autre bloc : à partir de la version 0.5.8, la coinbase de chaque bloc doit correspondre exactement au calendrier, si bien que la loterie coinbase ne saute jamais un bloc (voir l’offre et l’émission).
Les transactions en attente ne sont pas perdues. Elles patientent dans les pools des nœuds jusqu’au prochain bloc dont le producteur a le droit de les inclure.
Le producteur précédent est rétrogradé
Le producteur du bloc N reste dans le tirage du bloc N+1, mais ses tirages ne comptent jamais pour un tour antérieur au tour 10, le dernier tour qui peut porter des transactions. Le poids de son bloc est plafonné de la même façon : dans la formule du poids, son nombre de tirages k n’est jamais inférieur à 10, de sorte que s’il produit effectivement le bloc N+1 en repli, ce bloc ajoute au plus un dixième du poids d’un bloc du premier tour (voir le choix de branche). En pratique, c’est un autre nœud tiré qui produit le bloc N+1 chaque fois que l’un d’eux en est capable.
La rétrogradation n’est pas une pénalité. Un tirage rétrogradé n’est jamais compté comme un tour manqué, et le nœud conserve son siège et son score.
Pourquoi ne pas le laisser produire deux fois de suite ?
La graine du bloc N+1 règle des tirages qui dépendent du bloc N, comme les résultats des jeux et des paris sur la chaîne (voir la graine du bloc et les applis). Un nœud qui aurait produit les deux blocs détiendrait à la fois le contenu d’un bloc et la graine qui le règle. La règle veut que personne ne possède à la fois un pari et la graine qui le résout, tant qu’un autre nœud est en mesure de répondre.
Pourquoi ne pas le retirer du tirage ?
Retirer le producteur précédent obligerait une chaîne de deux nœuds à alterner strictement entre eux, et laisserait une chaîne dotée d’un seul nœud en état de marche totalement incapable de produire. Rétrogradé plutôt que retiré, le producteur précédent reste le producteur de dernier recours : si personne d’autre ne livre, il peut encore produire le bloc à partir du tour 10, dont la cible se situe 150 secondes après le bloc précédent. La chaîne ne s’arrête jamais à cause de cette règle.