Fast Recovery - Algorand Specifications

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

Algorand Specifications

The fast recovery algorithm is executed periodically every integer multiple of λfλf seconds (plus finite random variance).

This results in an approximately linear execution rate, while the network partitioning continues.

The algorithm uses the last three steps (named late, redo, down) for step∈[253,254,255].

These steps are, by nature, mutually exclusive:

A down-vote is always a vote for the ⊥ proposal-value, while late-vote and redo-vote must vote for a proposal-value different from ⊥.


Algorithm 10: Fast Recovery
1: function FastRecovery()
2: Resync()
3: for a ∈ A do
4: if IsCommittable(v) then
5: credentials ← Sortition(aI,r,p,late)
6: if credentials[j] > 0 then
7: Broadcast(Vote(r,p,late,v,credentials))
8: end if
9: else if ∄s0 > cert | Bundle(r,p−1,s0,⊥) ⊆ V ∧ ∃s1 > cert | Bundle(r,p−1,s1,v) ⊆ V then
10: credentials ← Sortition(aI,r,p,redo)
11: if credentials[j] > 0 then
12: Broadcast(Vote(r,p,redo,v,credentials))
13: end if
14: else
15: credentials ← Sortition(aI,r,p,down)
16: if credentials[j] > 0 then
17: Broadcast(Vote(r,p,down,⊥,credentials))
18: end if
19: end if
20: end for
21: for vote ∈ V such that votes ≥ 253 do
22: Broadcast(vote)
23: end for
24: end function


FastRecovery is functionally very close to the regular Recovery algorithm (outlined in the previous section), performing the same checks and similar outputs.

The main difference is that it emits votes for any of the three different steps late, redo, down according to Sortition results for every selected account.

Nodes are forbidden to equivocate for late, redo, down votes.

Finally, the node broadcasts all fast recovery votes observed. That is, all votes for which votes is a fast recovery step (late, redo, down).

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