Seven hours in August 2010
Six words for this case
From 0.5 BTC to 184 billion
The sum wraps around
- Each output passes on its ownThe software checked that no output was negative. Both were positive.
- The sum does not fitTogether they add up to 18,446,744,073,708,551,616 satoshis. The software added them in a space that goes up to 9,223,372,036,854,775,807.
- It ends up at −0.01 BTCPast the maximum, the number wraps around and shows up negative, like an odometer going from 99999 to 00000.
- The rule lets it throughWhat goes out (−0.01) is not more than what goes in (0.5). The fee comes to 0.5 − (−0.01) = 0.51.
2⁶³ − 500,000 sats
BOTH TOGETHER2⁶⁴ − 1,000,000 sats
WHAT THE SOFTWARE SAW−1,000,000 sats
An hour later, on the forum
“The "value out" in this block #74638 is quite strange […] 92233720368.54277039 BTC?”
He posts the whole block, as text, an hour after the time the miner put on it.
“The sum of the two outputs overflows to a negative. Its a bug in the transaction checks which did not reject it […]”
And asks people to shut down what they can and not to send or accept payments.
How to check
an erased transaction
- It cannot be looked up todayOn today’s chain, the transaction and its block do not exist. Search for it on mempool.space and it answers that it cannot find it.
- The forum kept all of itjgarzik posted the signature, the key, the coin it spends and the two outputs.
- It is rebuilt, byte by byteWith that data, its fingerprint (the TXID) comes out exactly 1d5e512a…65333c9. A single different byte would change the whole fingerprint.
- The key owns the coinThe signing key is the one for the 0.5 BTC coin it spends, which is still on the chain.
A new rule
in four and a half hours
MAX_MONEY = 21000000 * COIN; foreach (txout in vout) { if (txout.nValue < 0) error("negative"); if (txout.nValue > MAX_MONEY) error("txout.nValue too high"); nValueOut += txout.nValue; if (nValueOut > MAX_MONEY) error("txout total too high"); }
In green, what is new, summarized. No output, and no sum of outputs, can go past 21 million bitcoin.
| UTC | What happened |
|---|---|
| 17:05 | The block with the overflow |
| 18:08 | The warning on the forum |
| 20:39 | Gavin Andresen posts a first patch |
| 21:06 | Satoshi asks people to stop mining: “We will probably need to re-do a branch” |
| 21:35 | The fix goes into the code (SVN 132) |
| 23:48 | Satoshi announces version 0.3.10 |
6 h 51 min with no blocks
Satsumap says it does not exist
- What is searched forThe TXID of the overflow transaction, typed into the search box.
- What it answersThat it does not exist. The answer comes from mempool.space, which keeps today’s chain.
The attack’s coin
is still unspent
- Top right, the 0.5 BTCThe coin the overflow transaction spent, at 17TASsYP…FwVZSW. Satsumap marks it UTXO: unspent.
- Why it is still unspentIts spending was in the erased block. Since 2010 nobody has moved it again.
183 payments of 0.5 BTC
A payment to an overflow output

- What can be read on the chainPayment 183 of the chain goes to 1542Dgx5…, output 1 of the overflow, 56 hours after the bad block. It is its only transaction, and that 0.5 BTC is still unspent. The chain goes on after that payment.
- The other address1EDDEGtr…, output 0, has no transactions on today’s chain.
What the overflow leaves behind
- How a node decidesIt checks each block on its own, with the rules of the software it has installed. It only counts a branch’s work if its blocks follow those rules. That is why, after updating, the bad block’s branch stopped counting for that node, even if it was longer.
- Nodes that did not updateFor the old software, both branches were valid, and the node followed the longer one. When the good branch overtook the bad one, the node switched to the good one without anyone touching it.
A new rule
and old blocks
- The 2010 rule had no starting blockThe fix applied to the whole chain. That is why it made 74,638 invalid, even though it was already mined.
- To clean up, blocks had to be downloaded againAt 21:40, Satoshi asked people to shut down the software, replace their saved blocks with a copy from before 74,000, update and let the rest download. The missing blocks were downloaded with the already updated software.
- 0.3.10 brought another checkIt was added at 22:21 (SVN 133). It rejected a new block if its branch went through the bad 74,638, recognized by its hash.
- The next day, updating was enoughOn Aug 16 the good branch already had more work. An updated node switched to it on its own, without deleting anything.
- Today a new rule starts at a set blockTaproot activated at block 709,632, on Nov 14, 2021. Earlier blocks are still validated with the rules of their time.
What can be read on the chain
and what cannot
| Statement | Where it comes from |
|---|---|
| The transaction and its block are not on today’s chain | Chain |
| The transaction’s amounts, signature and addresses | The forum, checked with the rebuilt fingerprint, which gives the TXID |
| The sum comes to −0.01 and the fee to 0.51 | The arithmetic, on those amounts |
| The miner collected 50.51 BTC | The forum (that transaction is gone too) |
| The 6 h 51 min gap after block 74,637 | Chain |
| The times of the warning, the patch and 0.3.10 | The forum and the code repository |
| The good branch overtook the bad one at block 74,691 | Bitcoin Wiki. It cannot be checked on the chain |
| The 0.5 BTC coin is still unspent | Chain |
| The 183 payments up to the one to 1542Dgx5…, and that the chain goes on | Chain |
| The payments spent together had the same owner | Inference from the shape |
| The payments came from a faucet | Inference from the shape, and the wiki says “appears” |
| Who built the overflow | Unknown |
The data, in plain sight
Block 74,421 · the 0.5 BTC coin the overflow spent (output 0)237fe8348fc77ace11049931058abb034c99698c7fe99b1cc022b1365a705d39mempool.space
Today’s block 74,638 (23:53 UTC) · its first transaction2ae30f63b1507761b5541f7a723f566abb0701e5f8a97927980381341b5d8cbdmempool.space
Block 74,923 · the 0.5 BTC payment to an overflow address672495458201c55cdf4fa47cd40ff0bc8cbbd898b5dd564f84b81b0a87423417mempool.space
Address of the attack’s coin17TASsYPbdLrJo3UDxFfCMu5GXmxFwVZSWmempool.space
Overflow output 1 · received 0.5 BTC on Aug 18, 20101542Dgx5EeurzHP8cT57fK6hBTQq2dgTEumempool.space
Overflow output 0 · no transactions today1EDDEGtrZ5877WPsLU5o9TwjJDqaUqhvtemempool.space
The overflow transaction, to search for it and see that it is not there: 1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9