Software Development

The Byzantine Generals Problem and Why Most Systems Don’t Need Byzantine Fault Tolerance

Crash faults and Byzantine faults are not the same problem, and reaching for blockchain-grade guarantees inside a trusted internal network usually solves a problem you don’t have.

Blockchain’s rise put a strange new phrase into everyday engineering conversation: Byzantine fault tolerance. Teams that had never touched a cryptocurrency started asking whether their internal services needed it too, as if it were simply a stronger, more modern flavor of the reliability they already had. It is not. Byzantine fault tolerance solves a specific and much harder problem than the one most backend systems actually face, and understanding the difference will save you from adopting a heavyweight protocol for a threat that was never on your table to begin with.

The Original Problem

The name comes from a 1982 paper by Leslie Lamport, Robert Shostak, and Marshall Pease, who framed distributed agreement as a story about generals surrounding a besieged city. Each general commands part of an army and can only communicate by messenger. They must all agree on the same plan, attack together or retreat together, because a divided army loses. The complication is that some generals might be traitors who send different messages to different peers on purpose, trying to trick the loyal generals into acting on conflicting information.

General C, the traitor, tells General A to attack and General B to retreat. Without a way to detect the contradiction, A and B cannot safely agree on a single plan. Lamport, Shostak, and Pease proved this is only solvable if fewer than a third of the generals are traitors.

Lamport, Shostak, and Pease proved something precise about this scenario: reaching agreement in the presence of arbitrarily lying, colluding participants is only possible when the loyal generals outnumber the traitors by more than two to one. In modern terms, a system needs at least 3f + 1 total nodes to correctly tolerate f Byzantine, meaning arbitrarily malicious or corrupted, nodes. That extra math is not a design preference. It is a hard lower bound baked into the problem itself.

Crash Faults Are a Much Smaller Problem

Most production outages look nothing like a lying general. A server runs out of memory and dies. A process hangs. A network partition isolates a rack for ninety seconds. In every one of these cases the failed node simply stops participating correctly, it does not actively construct false messages designed to fool its peers. This is called a crash fault, and it is the failure model that protocols like Paxos and Raft were built around, the same protocols quietly running underneath Google Spanner, etcd, and ZooKeeper.

Because a crashed node cannot lie, tolerating it is mathematically cheaper. A crash-fault-tolerant, or CFT, system only needs 2f + 1 nodes to survive f crashes, rather than the 3f + 1 a Byzantine-fault-tolerant, or BFT, system requires. That difference of just one extra node per fault sounds small until you notice what it is actually paying for underneath.

PropertyCrash Fault Tolerance (Raft, Paxos)Byzantine Fault Tolerance (PBFT and similar)
Assumed failure behaviorNode stops or goes silentNode can lie, forge, or collude
Nodes needed to tolerate f faults2f + 13f + 1
Typical message patternLeader broadcasts to followersAll-to-all voting across replicas
Message complexity per roundRoughly linear in node countRoughly quadratic in node count
Where it is usedInternal databases, config stores, single-organization clustersPermissioned and public blockchains, multi-organization consortiums

The Replica Math, Visualized

The 2f + 1 versus 3f + 1 gap is easy to state and easy to underestimate. Here is what it looks like as your fault tolerance target grows.

Total replicas required to tolerate f simultaneous faults. Crash-fault tolerance needs 2f + 1 nodes; Byzantine fault tolerance needs 3f + 1, since it must also outvote nodes that are actively lying rather than merely silent.

To tolerate three simultaneous faults, a CFT cluster needs seven nodes. A BFT cluster needs ten, and those extra three nodes are not idle backups, they carry their own compute, storage, and network overhead around the clock, whether or not anyone is actually misbehaving.

The Message Overhead Nobody Mentions

Node count is only half the bill. Raft’s message pattern is simple: a leader sends entries to followers and collects acknowledgements, which scales roughly linearly with the number of nodes. Byzantine protocols like PBFT cannot get away with that, because a Byzantine node might tell the leader one thing and everyone else another. To catch that, replicas broadcast their votes to every other replica during the prepare and commit phases, producing message traffic that grows roughly with the square of the node count.

Approximate consensus messages per round as cluster size grows, following each protocol’s known complexity class: linear for Raft-style crash fault tolerance versus quadratic for PBFT-style all-to-all Byzantine voting. Exact message counts vary by implementation; the curves illustrate the complexity classes reported in the consensus literature linked below.

At ten nodes that gap is manageable. At a hundred nodes it is not, which is exactly why most Byzantine systems, including public blockchains, either cap their active validator set or introduce sharding and rotating committees just to keep the all-to-all chatter under control.

Why Blockchains Actually Need It

None of this means BFT is unnecessary in general, it means it solves a specific kind of trust problem. A public blockchain has no single administrator. Its validators belong to different, mutually distrustful organizations, some of whom may have a financial incentive to cheat, and there is no shared operator who can simply restart a misbehaving node. In that setting, assuming a node might actively lie is not paranoia, it is an accurate description of the environment. The same logic applies to permissioned consortium chains that span competing banks or supply chain partners, and to any system where the parties running the nodes do not fully trust each other.

Why Your Internal Service Probably Does Not

Most backend systems live entirely inside one company’s infrastructure, managed by one operations team, running on hardware that team controls end to end. The realistic failure modes there are crashes, restarts, bad deploys, and network blips, not a rogue employee reprogramming a database replica to lie to its peers on purpose. If that describes your environment, you already have a name for your actual threat model: crash faults. Reaching for a Byzantine-tolerant consensus layer to guard against an adversary who is not in your threat model means paying 3f + 1 replicas and quadratic message overhead to defend against something your internal network security, access controls, and code review process are already handling in a completely different, and usually more effective, layer.

Do you actually need BFT?

  • Do the nodes in your consensus group belong to different organizations that do not fully trust each other?
  • Could a single compromised or malicious node plausibly forge conflicting messages to different peers, and would your security controls fail to catch it?
  • Is there no single operator who can identify and remove a misbehaving node once it is detected?
  • Are you willing to pay for extra replicas and quadratic message overhead as the cluster grows?
  • If you answered no to most of these, Raft or Paxos-style crash fault tolerance is very likely the right, and far cheaper, fit.

What We Learned

The Byzantine Generals Problem describes a genuinely harder challenge than the one most engineering teams face day to day: reaching agreement when some participants might actively lie, not just fail silently. That extra guarantee comes at a real cost, more replicas at 3f + 1 instead of 2f + 1, and message traffic that grows quadratically instead of linearly. Public blockchains and multi-organization consortiums need that guarantee because they genuinely operate without a trusted, shared operator.

A single company’s internal services, running on infrastructure one team controls, are almost always dealing with crash faults instead, and Raft or Paxos already solve that problem at a fraction of the cost. The right question before adopting blockchain-grade consensus is never “would this be more robust,” it is “do I actually have an adversary inside my trust boundary,” and for most internal systems, the honest answer is no.

Eleftheria Drosopoulou

Eleftheria is an Experienced Business Analyst with a robust background in the computer software industry. Proficient in Computer Software Training, Digital Marketing, HTML Scripting, and Microsoft Office, they bring a wealth of technical skills to the table. Additionally, she has a love for writing articles on various tech subjects, showcasing a talent for translating complex concepts into accessible content.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Back to top button