Byzantine Fault
- title
- Byzantine Fault
- type
- concept
- summary
- Failure mode where a node produces wrong output while appearing functional
- parent
- distributed-consensus
- tags
- distributed-systems, fundamentals
- created
- 2026-04-07
- updated
- 2026-07-22
A failure mode where a component doesn't just stop working โ it continues operating but produces incorrect or misleading output. Named after the Byzantine Generals Problem (Lamport, Shostak, Pease, 1982), a thought experiment about coordinating an army when some generals may be traitors.
The generals problem
Several generals surround a city and need to agree whether to attack or retreat. They communicate by messenger. Some generals may be traitors who send contradictory orders โ telling one neighbor "attack" and another "retreat" โ trying to break coordination so part of the army attacks while the rest retreats.
The proven result: you need more than 3f+1 total generals to tolerate f traitors. With 3 generals and 1 traitor, the 2 loyal generals cannot reliably determine which messages to trust. With 4 generals and 1 traitor, they can use majority voting to overrule the bad actor.
Crash faults vs Byzantine faults
A crash fault is simple: the process stops. It sends no more messages. Other processes can detect this (eventually) by the absence of communication. This is the easier failure model โ algorithms like Paxos and Raft handle it.
A Byzantine fault is any behavior that deviates from the protocol โ wrong values, contradictory messages to different peers, selective silence, or arbitrary behavior. It's strictly harder to handle because you can't trust any single message from a potentially faulty node.
The practical difference is detection. A crashed node is obviously broken. A Byzantine node looks functional, which is what makes it dangerous.
Crash and Byzantine are the two endpoints software people usually name, but the full space of fault models โ permanent vs transient, the redundancy schemes that mask each, and the reliability metrics used to compare them โ is laid out from the hardware side in Dubrova's fault-tolerant-design.
Real-world examples
- A disk that silently returns corrupted data instead of reporting an error
- A misconfigured server that reports success to clients but doesn't actually persist writes
- A compromised node in a peer-to-peer network that lies about which blocks it has
- An LLM agent that confidently produces code based on a misread prompt โ it didn't crash, it just interpreted things differently than every other agent (log-distributed-llms)
Handling Byzantine faults
PBFT (Practical Byzantine Fault Tolerance) is the classic algorithm โ every node broadcasts its decision to every other node, and nodes accept the majority view. Expensive: O(n^2) messages per decision.
Convert to crash faults โ the cheaper alternative. Instead of running Byzantine-tolerant protocols, add external validators that check output correctness. An agent that produces code that fails tests is now a detected crash (retry it) rather than a silent divergence. This is the strategy recommended in log-distributed-llms for multi-agent LLM systems, and it's the same reason databases use checksums on disk reads.
human-in-the-loop review serves a similar function โ a human checking agent output is a Byzantine fault detector, catching cases where the agent's work is plausible but wrong.
- Concurrency: The Works of Leslie Lamport
- Database Internals: A Deep Dive into How Distributed Data Systems Work
- Agentic Coding is Burning Me Out
- Eight Years of Wanting, Three Months of Building with AI
- Emotion Concepts in Claude
- The Cult of Vibe Coding Is Insane
- Distributed Consensus
- Human-in-the-Loop
- Multi-agentic Software Development is a Distributed Systems Problem
- Memory Conflict Detection