There are many generals in the Byzantine army. Some are loyal while others traitorous.

The generals and their subordinate armies have circled a city and need to decide whether to attach of retreat.

The generals have sufficient physical separation to require a messaging service between them.

Some generals prefer attack while others, retreat. And the decision has to be reached by sending votes through the messaging system. All generals arriving at a common decision is of utmost importance as a half-hearted attack or retreat will be disastrous.

Sabotage is on the mind of the traitorous generals. They might send attack messages to some and retreat messages to others.

Sabotage is also on the mind of the messengers. They might tamper with the message before delivery.

The generals need an algorithm that will:

  • Reject tampered messages
  • Arrive at a decision based solely on the messages of the loyal generals

The same requirement applies to decentralised applications. Each application instance is autonomous and is free to do as it wishes. But, it's attempts to misguide the application as a whole should be tolerated (not necessarily rejected) by the rest of the network.