CS PAPERS DEEP-READ · PAPER 73

FLP Impossibility (Impossibility of Distributed Consensus with One Faulty Process)

Fischer, Lynch & Paterson · PODS 1983 / JACM 1985

中文 →

What did this paper do?

In 1985 three theorists — Fischer, Lynch and Paterson — proved something that made the whole distributed-systems field go quiet for a moment: in a network like the internet, if even one machine might crash, there is no set of rules that can guarantee all the machines will end up picking the same answer. The load-bearing word is "guarantee." Paxos, Raft and blockchain consensus all live by going around this result.

First, the job to be done

Picture five machines that must take a position on one thing — say, whether a transfer counts as committed or aborted. They can only talk by sending messages, and three rules apply: ① everyone must end up on the same answer; ② both answers must be genuinely possible (otherwise hard-coding "always abort" would count as agreement, which is cheating); ③ every machine that hasn't broken must actually pick, not dither forever. As soon as messages can be arbitrarily slow, and even one machine might crash partway, those three cannot all be met.

The hard part: you can't tell "dead" from "slow"

It all comes down to one sentence: in a network with no upper bound on delay, a machine that has gone silent and a machine that already spoke but whose message is still in flight look exactly the same.

In real life we use timeouts — no reply in ten seconds, call it dead. But that rests on a premise: "normally it won't take more than ten seconds." Here there is no such premise. So you have only two moves: wait forever (possibly forever, breaking ③); or declare it dead and move on — and if it was merely slow, it may wake up already holding a different answer, breaking ①.

How the paper proves it really can't be done

This isn't "nobody has found it yet." It's a proof that nobody can. The idea is lovely: label every momentary state of the system. Some states are already settled — however things go from here the answer must be "commit," or must be "abort." Others still allow both; call those "hanging."

The paper then proves two things: there must be a hanging state right at the start; and as long as the system is hanging, you can always pick one message, slide its delivery slightly later, and have the system still be hanging after that step. Apply that trick forever and the system circles inside "hanging" and never settles.

And the harassment is entirely fair play: it withholds no message and breaks no machine. It only arranges an awkward delivery order. The algorithm has this gap for one reason only — it must be prepared in advance to tolerate one machine crashing, and that readiness is the crack.

So what do engineers do?

If the three can't all hold, you must give one up on purpose, and which one matters. Paxos, Raft and the other algorithms actually in production defend the first two: never two contradictory answers, ever. What they give up is the "guarantee" inside ③ — they don't promise to produce a result within any fixed time. When the network is healthy they almost always settle fast; when it is a mess they would rather stall than be wrong. The other route is rolling dice: pick at random when stuck, and the chance of hanging forever falls to zero.

One honest note: the result says the worst case may drag on forever, not that this is unachievable in practice — real networks don't cooperate with that devious ordering indefinitely, which is exactly why the Paxos family works fine.

Remember this one thing

In a network where messages can be arbitrarily slow, "crashed" and "very slow" look identical; so once even one machine may fail, no algorithm can guarantee both "never two answers" and "an answer always comes out." Every usable consensus algorithm picks between them — keep correctness, give up any promise about how fast.

Want bivalent configurations, the commutativity lemma and the four ways around it? → Switch to the deep read