For public chains, durable settlement is the core promise. If history can be cheaply rewritten, the system cannot secure real value.
That promise must be achieved under decentralization. There is no central sequencer or final authority: many independent nodes must verify the same history and reach the same conclusion. This distributed, adversarial setting is exactly why public chains can resist tampering—but it also makes agreement harder.
Because agreement is harder, durable settlement costs time. The network is distributed, messages propagate with delay, and validators need time to observe, vote, and converge. Strong finality is therefore intentionally slower than raw block production.
At the same time, products cannot run on “wait 10+ minutes” UX. Wallet status, swap feedback, and exchange interaction all need a fast signal in seconds.
In other words, public chains need to answer two questions continuously: what happened most recently, and what part of history should now be treated as durable.
Ethereum’s proof-of-stake design solves this by separating the fast answer from the durable answer. The rest of this page explains how.
Now we can name the two protocol tracks precisely:
Ethereum runs both tracks on one shared clock:
So the latest chain view can update at slot cadence, while finality advances at epoch cadence. We will call that latest view “head” in the next section.
In a distributed network, messages arrive at different times. In that gap, different nodes can briefly see different latest blocks, creating temporary forks.
Voting is the convergence mechanism:
So forks are a normal effect of asynchronous propagation, and voting is how the protocol converges to one canonical history.
That convergence signal is exactly the input used for head selection.
Head selection means choosing the chain tip to follow right now.
At each fork, follow the branch supported by the strongest latest validator weight.
This is handled by LMD-GHOST.
Formal weight for a child subtree c:
Minimal shape:
head = root
while has_children(head):
head = argmax(children(head), key=weight)What this means operationally:
Head logic answers “what to follow now.”
Finality logic answers “what is durable enough to settle on.”
That second track is Casper FFG.
Instead of reasoning over every block, it reasons over checkpoint links.
A link s -> t is supermajority when:
Transition sketch:
if justified(s) and supermajority(s, t):
justified(t) = True
if justified(s) and justified(t) and epoch(t) == epoch(s) + 1:
finalized(s) = TrueReadable interpretation: justify child, then finalize parent.
Once finality is defined, the next question is enforcement: what stops validators from voting inconsistently across branches?
Answer: conflicting voting behavior is slashable.
Two slashable patterns:
So safety is backed by stake at risk, not only social agreement.
Safety alone is not enough; a live chain must also recover when participation drops.
If participation falls, finality can pause temporarily.
Inactivity leak then reduces effective non-participating stake over time, allowing active honest validators to regain supermajority and resume finality.
From here, protocol states map directly to product risk tiers:
Use finalized for high-value irreversible transitions.
LMD-GHOST picks the present best head; Casper FFG locks history over time.
That is Ethereum consensus in practical terms.