Управление форками
Регистру разрешено разветвляться на границах слотов. Результирующая структура данных образует дерево, называемое blockstore. Когда валидатор интерпретирует хранилище блоков, он должен поддерживать состояние для каждого форка в цепочке. Мы называем каждый экземпляр active fork. Валидатор несет ответственность за взвешивание этих вилок, чтобы в конечном итоге выбрать вилку.
Валидатор выбирает форк, отдавая голос лидеру слота на этом форке. Голосование фиксирует валидатор на время, называемое периодом блокировки. Валидатору не разрешается голосовать за другую вилку, пока не истечет этот период блокировки. Каждое последующее голосование на одном и том же форке удваивает продолжительность периода блокировки. После определенного кластером количества голосов (в настоящее время 32) продолжительность периода блокировки достигает так называемого max lockout. Пока не будет достигнута максимальная блокировка, валидатор может дождаться окончания периода блокировки, а затем проголосовать за другой форк. Когда он голосует за другой форк, он выполняет операцию, называемую rollback, посредством которой состояние откатывается во времени к общей контрольной точке, а затем переходит к вершине форка, за который он только что проголосовал. Максимальное расстояние, на которое может откатиться вилка, называется глубиной отката. Глубина отката — это количество голосов, необходимое для достижения максимальной блокировки. Всякий раз, когда валидатор голосует, любые контрольные точки за пределами глубины отката становятся недоступными. То есть не существует сценария, при котором валидатору нужно будет откатиться за пределы глубины отката. Поэтому он может безопасно сокращать недостижимые вилки и скваш все контрольные точки за пределами глубины отката в корневую контрольную точку.
Активные форки
Активная вилка представляет собой последовательность контрольных точек, длина которой как минимум на единицу больше, чем глубина отката. Самая короткая вилка будет иметь длину, ровно на единицу превышающую глубину отката. Например:
Следующие последовательности являются активными вилками:
- {4, 2, 1}
- {5, 2, 1}
- {6, 3, 1}
- {7, 3, 1}
Обрезка и раздавливание
Валидатор может проголосовать за любую контрольную точку в дереве. На диаграмме выше это все узлы, кроме листьев дерева. После голосования валидатор удаляет узлы, которые разветвляются на расстоянии, превышающем глубину отката, а затем использует возможность минимизировать использование памяти, помещая любые узлы, которые он может, в корень.
Начиная с приведенного выше примера, с глубиной отката 2, рассмотрим голосование по 5 против голосования по 6. Во-первых, голосование по 5:
Новый корень равен 2, и любые активные ответвления, не являющиеся потомками от 2, удаляются.
В качестве альтернативы, голосование по 6:
Дерево остается с корнем 1, так как активная вилка, начинающаяся с 6, находится всего в 2 контрольных точках от корня.