各ラウンドのコンセンサスでは新しいブロックを1つ追加しますが、ホワイトペーパーによると、今回は一度で走り切るのではなく、複数のイテレーションに分けて進め、各イテレーションはさらに3つのステップに分かれます。ホワイトペーパーの第3.2節では、この3つのステップをProposal、Validation、Ratificationと呼びます。

まず1つ目のステップはProposalです。DSアルゴリズムはランダムに1人のprovisionerを選び、ブロック生成者として候補ブロックを生成します。候補ブロックはネットワーク全体にブロードキャストされます。もし候補ブロックが所定のタイムアウト時間内に生成されない、または受信できない場合、このステップはNILを出力して次へ進みます。しかし手元には候補ブロックがありません。では、その後の投票では何を投じるのでしょうか?答えは、空票を投じるのではなく、NoCandidateを投じます。つまり「検証可能な候補ブロックがない」ということです。$DUSK

2つ目のステップはValidationです。DSアルゴリズムはランダムに一組の投票委員会を選び、前ステップの候補ブロックを検証します。候補ブロックが有効ならValidを投票し、有効でなければInvalidを投票します。候補ブロックがない場合はNoCandidateを投票します。投票委員会はquorumに到達するために2/3の絶対多数が必要で、タイムアウトまでに到達しなければNoQuorumを出力します。このステップの出力はValidationResultであり、quorumを達成した投票タイプと、すべての投票者の集約署名を含みます。@Dusk

3つ目のステップはRatificationです。次に、新しい投票委員会をさらに1組選び、Validationの結果を確認します。前ステップでValidのquorumが達成されていれば、その結果を確認します。前ステップがNoQuorumまたは失敗であればNoQuorumを投票します。このステップにより、検証結果が少数の人だけで決まるのではなく、より多くのprovisionerに承認されることを保証します。

Ratificationの出力がSuccessであれば、候補ブロックは正式に新しいブロックとして受理され、今回のラウンドは終了です。出力がFailまたはunknownであれば、次のイテレーションに進み、改めてブロック生成者を選び直し、再度投票します。ホワイトペーパーでは、最大イテレーション回数はグローバルパラメータで決まり、現在の設定は50です。連続16回のイテレーションで失敗すると、プロトコルは緊急モードに入ります(角度10)。

3つのステップ設計の中核となる論理は相互牽制です。ブロック生成者は候補ブロックを生成するだけで、投票はできません。検証委員会は検証だけで、確認はできません。確認委員会は検証結果を確認するだけで、再検証はできません。いずれの役割も単独で、ある1つのブロックの運命を決めることはできません。#dusk