## 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

- Auto
- Light
- Dark

# Algorand Specifications

On receiving a proposal Proposal(v) a player

- Relays Proposal(v) if σ(S,r+1,0)=v.
- Ignores it if it is malformed or trivially invalid.
- Ignores it if Proposal(v)∈P.
- Relays Proposal(v), observes it, and then produces any consequent output, if v∈{σ(S,r,p),v¯,μ(S,r,p)}.
- Otherwise, ignores it.

Specifically, if the player ignores a proposal, then

N(S,L,Proposal(v))=(S,L,ϵ)

while if a player relays the proposal _after_ checking if it is valid, then

N(S,L,Proposal(v))=(S′∪Proposal(v),L′,(Proposal∗(v),…)).

However, in the first condition above, the player relays Proposal(v) _without_ checking if it is valid.

Since the proposal has not been seen to be valid, the player cannot observe it yet, so

N(S,L,Proposal(v))=(S,L,(Proposal∗(v))).

> An implementation may _buffer_ a proposal in this case. Specifically, an implementation which relays a proposal without checking that it is valid, may optionally choose to replay this event when it observes that a new round has begun (see [State Transition section](https://specs.algorand.co/abft/abft-state-transitions)). In this case, at the conclusion of a new round, this proposal is processed once again as input.

Implementations **MAY** store and relay fewer proposals than specified here to improve efficiency. However, implementations **MUST** relay proposals which match the following proposal-values (where rr is the current round and pp is the current period):

- v¯,
- σ(S,r,p),σ(S,r,p−1),
- μ(S,r,p) if σ(S,r,p) is not set and μ(S,r,p+1) if σ(S,r,p+1) is not set.
