It’s a great feeling to understand what problem Satoshi solved. To understand the spark that led to the implementation of Bitcoin. That missing link that took so long to figure out. To solve the impossible problem.
In mathematics or network theory there is a question called the Byzantine General’s Problem. A version of it goes like this: There are five Byzantine armies that are surrounding a Bulgarian stronghold. The general at one of the camps want to order all Byzantine armies to attack at the same time. How can the general get the word out, and know that all armies will follow the same instructions? How can the armies know the other armies will follow the same instructions? How can the Byzantines do this with the Bulgarians sending their own messages to the Byzantine armies? If they attack in a coordinated way they will win, but if they are disorganized then each army will meet its own demise.
Satoshi Nakomoto—the anonymous coder or group of coders that created Bitcoin—is credited with solving this problem. Satoshi’s solution is that any Byzantine general publish their attack time along with the solution of a problem using the attack time that takes some time to solve. The other armies then encode the attack time and publish a solution of a problem using the encoded time. Then the armies encode the encoding of the attack time and publish a solution of a problem with the encoding of the encoding. This forms a chain of encodings each taking some time to establish the next step. After some time, the Byzantines will attack with at the time that have the longest chain attached.
When the Byzantines attack with this method as long as the Byzantines publish their plans first there is a low chance that the Bulgarians will ever be able to catch up and create a longer chain. After some time, it’s almost impossible that the Byzantine armies will attack at different times. Each step in the chain increases the certainty that all Byzantines will attack at the same time.
The first application of this was indeed Bitcoin. In this application the goal was not to agree on a time to attack, but rather the state of a distributed ledger. Each block has all the transactions that change the state of the ledger. As a new block gets published it contains an encoding of the previous block. With each block the transactions before it become more certain to stay on the longest chain. As time goes by, it’s almost impossible to create a longer chain than the one already ahead of a transaction, and we can be certain of the state of the ledger.