Проверка отметок

Это разработка критериев и проверка тиков в слоте. В нем также описывается обработка ошибок и условия сокращения, охватывающие то, как система обрабатывает передачи, которые не соответствуют этим требованиям.

Структура слота

Каждый слот должен содержать ожидаемое количество тиков ticks_per_slot. Последний фрагмент в слоте должен содержать только весь последний тик и ничего более. Лидер также должен пометить этот фрагмент, содержащий последний тик, флагом LAST_SHRED_IN_SLOT. Между тиками должно быть количество хэшей hashes_per_tick.

Обработка плохих передач

Вредоносные передачи T обрабатываются двумя способами:

  1. Если лидер может сгенерировать некоторую ошибочную передачу «T», а также некоторую альтернативную передачу «T» для одного и того же слота, не нарушая никаких правил косой черты для дублирующих передач (например, если «T» является подмножеством «T») , тогда кластер должен обработать возможность того, что обе передачи будут активными.

Таким образом, это означает, что мы не можем пометить ошибочную передачу «T» как мертвую, потому что кластер, возможно, достиг консенсуса по «T». Эти случаи требуют убедительных доказательств, чтобы наказать за это плохое поведение.

  1. В противном случае мы можем просто пометить слот как мертвый и неиграбельный. Доказательство косой черты может или не может быть необходимым в зависимости от осуществимости.

Blockstore получает фрагменты

Когда блокстор получает новый фрагмент s, возможны два случая:

  1. s помечен как LAST_SHRED_IN_SLOT, затем проверьте, существует ли фрагмент s' в блочном хранилище для этого слота, где s'.index > s.index Если да, то вместе s и s' представляют собой убедительное доказательство.

  2. Blockstore уже получил фрагмент s', помеченный как LAST_SHRED_IN_SLOTс индексомi. Если s.index > i, то вместе sиs' составляют доказательство косой черты. В этом случае blockstore также не будет вставлять s.

  3. Повторяющиеся фрагменты для одного и того же индекса игнорируются. Неповторяющиеся фрагменты для одного и того же индекса являются условием сокращения. Подробности для этого случая описаны в разделе «Слешинг дубликатов блоков выноски».

Воспроизведение и проверка тиков

  1. Этап воспроизведения воспроизводит записи из хранилища блоков, отслеживая количество тиков, которые он видел в каждом слоте, и проверяя количество хэшей hashes_per_tick между тиками. После воспроизведения тика из этого последнего фрагмента этап воспроизведения проверяет общее количество тиков.

Сценарий сбоя 1: если есть два последовательных тика, между которыми количество хэшей равно != hashes_per_tick, пометить этот слот как мертвый.

Сценарий сбоя 2: если количество тиков != ticks_per_slot, пометить слот как мертвый.

Сценарий сбоя 3: если количество тиков достигает ticks_per_slot, но мы все еще не видим LAST_SHRED_IN_SLOT, помечаем этот слот как мертвый.

  1. Когда ReplayStage достигает фрагмента, отмеченного как последний фрагмент, он проверяет, является ли этот последний фрагмент галочкой.

Сценарий сбоя: если подписанный фрагмент с флагом LAST_SHRED_IN_SLOT не может быть десериализован в тик (либо не может быть десериализован, либо десериализован в запись), пометьте этот слот как мертвый.