Ротация лидеров
В любой момент кластер ожидает, что только один валидатор создаст записи в реестре. Имея одновременно только одного лидера, все валидаторы могут воспроизводить идентичные копии реестра. Однако недостатком одновременного использования только одного лидера является то, что злонамеренный лидер способен подвергать цензуре голоса и транзакции. Поскольку цензуру нельзя отличить от потери сетевых пакетов, кластер не может просто выбрать один узел, который будет играть роль лидера на неопределенный срок. Вместо этого кластер минимизирует влияние злонамеренного лидера, чередуя узлы, которые берут на себя инициативу.
Каждый валидатор выбирает ожидаемого лидера по одному и тому же алгоритму, описанному ниже. Когда валидатор получает новую подписанную запись в реестре, он может быть уверен, что запись была создана ожидаемым лидером. Порядок слотов, в котором каждому лидеру назначается слот, называется расписанием лидера.
Ротация графика лидеров
Валидатор отклоняет блоки, не подписанные слотом-лидером. Список личностей всех лидеров слотов называется расписанием лидеров. Расписание лидера пересчитывается локально и периодически. Он назначает лидеров слотов на время, называемое эпохой. Расписание должно быть рассчитано задолго до назначенных им слотов, чтобы состояние реестра, используемое для расчета расписания, было завершено. Эта продолжительность называется смещением графика лидера. Солана устанавливает смещение продолжительности слотов до следующей эпохи. То есть график лидера для эпохи рассчитывается на основе состояния реестра в начале предыдущей эпохи. Смещение одной эпохи является довольно произвольным и считается достаточно длинным, чтобы все валидаторы завершили свое состояние реестра до того, как будет сгенерировано следующее расписание. Кластер может сократить смещение, чтобы сократить время между изменениями ставок и обновлениями расписания лидера.
При работе без разделов, длящихся дольше, чем эпоха, расписание нужно генерировать только тогда, когда корневая вилка пересекает границу эпохи. Поскольку расписание относится к следующей эпохе, любые новые доли, переданные в корневой форк, не будут активны до следующей эпохи. Блок, используемый для генерации расписания лидера, является первым блоком, пересекающим границу эпохи.
Без раздела, длящегося дольше эпохи, кластер будет работать следующим образом:
- Валидатор постоянно обновляет свою корневую вилку по мере голосования.
- Валидатор обновляет свое расписание лидера каждый раз, когда высота слота пересекает границу эпохи.
Например:
Предположим, что продолжительность эпохи составляет 100 слотов, что на самом деле на порядок больше. Корневая вилка обновляется с вилки, рассчитанной на высоте слота 99, на вилку, вычисленную на высоте слота 102. Вилки со слотами на высоте 100, 101 были пропущены из-за сбоев. Новое расписание лидера вычисляется с использованием разветвления на высоте слота 102. Оно активно со слота 200 до тех пор, пока не будет обновлено снова.
Никакой несогласованности быть не может, потому что каждый валидатор, который голосует с кластером, пропустил 100 и 101, когда его корень проходит 102. Все валидаторы, независимо от шаблона голосования, будут фиксироваться на корне, который равен либо 102, либо потомку 102.
Ротация расписания лидеров с разделами размером в эпоху.
Продолжительность смещения графика лидера имеет прямое отношение к вероятности того, что кластер будет иметь противоречивое представление о правильном графике лидера.
Рассмотрим следующий сценарий:
Два раздела, каждый из которых генерирует половину блоков. Ни один из них не подходит к окончательной развилке квалифицированного большинства. Оба пересекут эпохи 100 и 200 без фактической фиксации корня и, следовательно, приверженности всего кластера новому расписанию лидера.
В этом нестабильном сценарии существует несколько действительных расписаний лидеров.
- Расписание лидера создается для каждой вилки, чей прямой родитель находится в предыдущей эпохе.
- Расписание лидеров действует после начала следующей эпохи для вилок-потомков до тех пор, пока оно не будет обновлено.
Расписание каждого раздела будет расходиться после того, как раздел продлится более эпохи. По этой причине продолжительность эпохи должна быть выбрана намного больше, чем время слота и ожидаемая длина вилки, которая будет зафиксирована в корне.
После наблюдения за кластером в течение достаточного времени смещение графика лидера может быть выбрано на основе средней продолжительности раздела и его стандартного отклонения. Например, смещение, превышающее медианную продолжительность раздела плюс шесть стандартных отклонений, уменьшит вероятность несогласованного расписания реестра в кластере до 1 на 1 миллион.
Генерация расписания лидеров в Genesis
Конфигурация генезиса объявляет первого лидера для первой эпохи. Этот лидер оказывается запланированным для первых двух эпох, потому что расписание лидера также генерируется в слоте 0 для следующей эпохи. Длина первых двух эпох также может быть указана в конфигурации генезиса. Минимальная длина первых эпох должна быть больше или равна максимальной глубине отката, определенной в Tower BFT.
Алгоритм генерации расписания лидеров
Расписание лидера генерируется с использованием предопределенного начального числа. Процесс выглядит следующим образом:
- Периодически используйте высоту тика PoH (монотонно возрастающий счетчик) для создания стабильного псевдослучайного алгоритма.
- На этой высоте отберите в банке выборку для всех счетов с стейкингом с личностью лидера, которые проголосовали в пределах настроенного кластером количества тиков. Образец называется активным набором.
- Отсортируйте активный набор по весу ставки.
- Используйте случайное начальное число для выбора узлов, взвешенных по доле, чтобы создать взвешенный по доле порядок.
- Этот порядок вступает в силу после заданного кластером количества тиков.
Векторы атаки по расписанию
Семя
Выбранное семя предсказуемо, но непредвзято. Нет шлифовальной атаки, влияющей на ее исход.
Активный набор
Лидер может повлиять на активное множество, подвергая цензуре голоса валидаторов. Лидеры могут цензурировать активное множество двумя возможными способами:
- Игнорировать голоса от валидаторов
- Отказаться голосовать за блоки голосами от валидаторов
Чтобы снизить вероятность цензуры, активный набор вычисляется на границе смещения графика лидера в течение длительности выборки активного набора. Продолжительность выборки активного набора достаточно велика, чтобы голоса были собраны несколькими лидерами.
Стейкинг
Лидеры могут подвергать цензуре новые транзакции ставок или отказываться проверять блоки с новыми ставками. Эта атака похожа на цензуру голосов валидатора.
Потеря рабочего ключа валидатора
Ожидается, что лидеры и валидаторы будут использовать эфемерные ключи для работы, а владельцы доли разрешают валидаторам выполнять работу со своей долей посредством делегирования.
Кластер должен иметь возможность восстановиться после потери всех эфемерных ключей, используемых лидерами и валидаторами, что может произойти из-за общей уязвимости программного обеспечения, общей для всех узлов. Владельцы доли должны иметь возможность голосовать напрямую, подписав голос валидатора, даже если доля в настоящее время делегирована валидатору.
Добавление записей
Срок жизни ведущего расписания называется эпохой. Эпоха разделена на slots, где каждый слот имеет продолжительность T
тиков PoH.
Лидер передает записи во время своего слота. После тика T
все валидаторы переключаются на следующего запланированного лидера. Валидаторы должны игнорировать записи, отправленные за пределы слота, назначенного лидером.
Все тики T
должны наблюдаться следующим лидером, чтобы он мог строить свои собственные записи. Если записи не наблюдаются (лидер недоступен) или записи недействительны (лидер глючит или вредоносен), следующий лидер должен произвести тики, чтобы заполнить слот предыдущего лидера. Обратите внимание, что следующий лидер должен выполнять запросы на исправление параллельно и откладывать отправку тиков до тех пор, пока не будет уверен, что другие валидаторы также не смогли наблюдать записи предыдущего лидера. Если лидер неправильно строит на своих тиках, следующий за ним лидер должен заменить все свои тики.