夏もようやく終わりに近づき、気温もゆっくり下がってきました。先週車で家族を連れてお出かけしたとき、高速道路を走っていると前方で突然事故が起きました。ナビがその場で臨時に脇道を案内してくれたのですが、後続の車はそれに従わず、元のルートのまま走っていました。2つのルートがほぼ10分間並行したあと、事故が片づいたことで、システムがようやく全員を再び本線へ誘導しました。この間は、誰もが「最終的に進むべき道」がどちらなのか分かりません。
Duskのコンセンサス機構にも、似たような「分岐」状況があり、それをfallback(リカバリー/後退)と呼びます。ネットワークは非同期なので、メッセージが遅延したり失われたりする可能性があり、同じラウンドで、たまに複数の候補ブロックが同時に合意に至ることがあります。これが分岐です。処理ルールはシンプルで、より低い反復ラウンド(iteration)で合意が成立したブロックを採用します。高いラウンドのブロックは低いラウンドのものに置き換えられ、チェーンは分岐が起きる前のブロックまでロールバックされ、その後、より早く合意に至った方につながります。置き換えられた元のチェーンは、その後に接続されていたブロックもすべて無効になります。
見落とされがちな細部もあります。iteration 0で合意に至ったブロックは、これより低いラウンドが存在しないため、唯一「置き換えられない」ものです。しかしそれでも、もしそのブロックの「親ブロック」が後にロールバックされれば、同じようにロールバックされます。絶対に安全というわけではなく、相対的により安定しているだけです。
この仕組みは「ネットワーク遅延によって生じた一時的な分岐をどう収束させるか」を解決しますが、その代わりにチェーン上に一時的な不確実性が発生します。新しく出てきたブロック、特にラウンドの高いものは、理論上置き換えられる可能性があります。後続のブロックがそれを「はんだ付けする」ように確実に繋いでくれるまで、初めて安心できるのです。
$DUSK
#dusk @Dusk