Каждый раунд консенсуса должен добавлять новый блок, но в белой книге сказано, что на этот раз это не один проход «до конца», а несколько итераций: каждая итерация включает три шага. В разделе 3.2 белой книги эти три шага называются Proposal, Validation и Ratification。

Первый шаг — Proposal. Алгоритм DS случайным образом выбирает provisioner в качестве генератора блоков, который отвечает за создание кандидатного блока и рассылку его по всей сети. Если кандидатный блок не был создан или получен в пределах заданного тайм-аута, этот шаг выводит NIL и сразу переходит к следующему шагу. Но ведь у команды на руках нет кандидатного блока — что же тогда голосовать дальше? Ответ: не подавать пустые голоса, а голосовать NoCandidate, что означает «нет кандидатного блока для проверки».$DUSK

Второй шаг — Validation. DS случайным образом выбирает группу голосующих комиссаров (комитетов), чтобы проверить кандидатный блок с предыдущего шага. Если кандидатный блок валиден, голосуют Valid; если недействителен — Invalid; если кандидатного блока нет — NoCandidate. Голосующий комитет должен достигнуть кворума с помощью абсолютного большинства 2/3. Если к тайм-ауту кворум не достигнут, выводится NoQuorum. Результатом этого шага является ValidationResult, который содержит тип голосов, достигших кворума, и агрегированную подпись всех голосовавших.@Dusk

Третий шаг — Ratification. Затем выбирается новая группа голосующих комиссаров, чтобы подтвердить результат Validation. Если на предыдущем шаге достигнут кворум Valid, они подтверждают этот результат; если на предыдущем шаге было NoQuorum или произошла неудача, они голосуют NoQuorum. Этот шаг гарантирует, что результат верификации определяют не только несколько человек, а он подтверждается большим числом provisioner.

Если вывод Ratification равен Success, кандидатный блок официально принимается как новый блок, и раунд завершается. Если вывод Fail или unknown, переходят к следующей итерации: заново выбирают генератора блоков и заново голосуют. В белой книге сказано, что максимальное число итераций определяется глобальным параметром; в текущей настройке оно равно 50. Если подряд в течение 16 итераций все попытки терпят неудачу, протокол переходит в аварийный режим (угол 10)。

Ключевая логика трехшагового дизайна — сдерживание (баланс) — у генератора блоков есть только возможность генерировать кандидатные блоки, но он не может голосовать; у проверяющего комитета есть только возможность проверять, но не подтверждать; у комитета подтверждения есть только возможность подтверждать результаты проверки, но не выполнять повторную верификацию. Ни один участник не может в одиночку решить судьбу блока.#dusk