Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

$$ \newcommand \DeadlineTimeout {\mathrm{DeadlineTimeout}} \newcommand \Recovery {\mathrm{Recovery}} \newcommand \ResynchronizationAttempt {\mathrm{ResynchronizationAttempt}} \newcommand \Sortition {\mathrm{Sortition}} \newcommand \Proposal {\mathrm{Proposal}} \newcommand \IsCommittable {\mathrm{IsCommittable}} \newcommand \Broadcast {\mathrm{Broadcast}} \newcommand \Vote {\mathrm{Vote}} \newcommand \Bundle {\mathrm{Bundle}} \newcommand \Cert {\mathit{cert}} \newcommand \Next {\mathit{next}} \newcommand \creds {\mathit{credentials}} \newcommand \prop {\mathit{proposal}} \newcommand \s {\mathit{step}} $$

Recovery

The recovery algorithm is executed periodically, whenever a \( \Bundle_\Cert \) has not been observed before \( \DeadlineTimeout(p) \) for a given period \( p \).

Algorithm

\begin{algorithm}
\caption{Recovery}
\begin{algorithmic}
\Function{Recovery}{}
  \State $\ResynchronizationAttempt()$
  \For{$a \in A$}
    \State $\creds \gets \Sortition(a_I, r, p, s)$
    \If{$\creds_j > 0$}
      \If{$\exists v = \Proposal_v(\prop, \prop_p, \prop_I)$ for some $\prop \in P \mid \IsCommittable(v)$}
        \State $\Broadcast(\Vote(a_I, r, p, s, v, \creds))$
      \ElsIf{$\exists s_0 > \Cert \mid \Bundle(r, p - 1, s_0, \bot) \subseteq V \land \exists s_1 > \Cert \mid \Bundle(r, p - 1, s_1, \bar{v}) \subseteq V$}
        \State $\Broadcast(\Vote(a_I, r, p, s, \bar{v}, \creds))$
      \Else
        \State $\Broadcast(\Vote(a_I, r, p, s, \bot, \creds))$
      \EndIf
    \EndIf
  \EndFor
  \State $\s \gets \s + 1$
\EndFunction
\end{algorithmic}
\end{algorithm}

Important

IMPLEMENTATION:

Next vote issuance reference implementation.

The node starts by making a resynchronization attempt (Line 2).

Afterward (Lines 3:5), the node plays independently for each online account (registered on the node). This means that for every account available in \( A \), the \( \Sortition \) algorithm is run, and accounts selected in the recovery committee (i.e., the players) for the current step \( \Next_k \) (that is, those whose \( \creds_j > 0 \)) will produce one of the following three distinct outputs (Lines 6:14):

  • If a proposal-value \( v \) can be committed in the current context, then the player broadcasts a \( \Next_k \) vote for \( v \).

  • If no proposal-value can be committed, and

    • No recovery step \( \Bundle \) for the empty proposal-value (\( \bot \)) was observed in the previous period, and
    • A recovery step \( \Bundle \) for the pinned value was observed in the previous period1,

    then a \( \Next_k \) vote for \( \bar{v} \) is broadcast by the player.

  • Finally, if none of the above conditions were met, a \( \Next_k \) vote for \( \bot \) is broadcast.

A player is forbidden from equivocating in \( \Next_k \) votes.

Lastly (Line 15), the node’s current \( \s \) is updated.

Note

For a formal definition of this functionality, refer to the ABFT normative section.



  1. This implies \( \bar{v} \neq \bot \).