Recovered software · Bitcoin mainnet
LIFE
Digital life, preserved in Bitcoin since 2013.
- BLOCK 230621
- APRIL 2013
- 5 CREATURES
- 10 FOOD
- 1 PERMANENT PROGRAM
- 230619
- 230620
- ■ 230621
- 230622
- 230623
10 APR 2013 · 09:37:49 UTC · 328 TXS · HASH 0000000000…3d97cc4f9f
Program 01 · The simulation
RUN LIFE.
Every creature below is a real record with its own state. Nothing is a video. Click a ☻ to follow it.
- CREATURES ALIVE
- 5
- FOOD AVAILABLE
- 10
- GENERATIONS
- 1
- BIRTHS
- 0
- DEATHS
- 0
- MUTATIONS
- 0
- SIMULATION TICK
- 0
- T00000> RESTORED MODE · ECOSYSTEM ENABLED> C# = 5 F# = 10 CMUTA = 5> Press F1 to pause.
RESTORED MODE — Fixes the bugs so the ecosystem behaves the way the comments describe.
- [CODE]Starts from the same values: LIFE 5, MATES 0, MOVE 1, F2BREED 10, A2BREED 1.
- [CODE]Breeds when CA > 1 and CF > 10; dies when CF < 9.
- [CODE]Mutation when INT(RND * CMUTA) = 1 re-rolls lifespan 0–100, mates 0–2, move 0–3, food type 0–3.
- [RESTORED]One year = 32 ticks. Age goes up and 1 food is used each year.
- [RESTORED]Breeding costs the parent 1 food, once a year. Babies appear next to the parent.
- [RESTORED]Traits belong to each creature, not to the whole program. Creatures die when they outlive LIFE.
- [RESTORED]Land and water (the MOVE comment), food grows back, creatures notice food next to them, edges are walls.
Program 02 · FOR I = 1 TO C#
THE FIVE
Five creatures entered Bitcoin in 2013.
The code never named them, so neither do we. They are numbers 1 to 5 — the order line 400 creates them in.
Program 03 · PARENT → CHILD
THE FAMILY TREE
Every birth is recorded. Lines with a mutation somewhere in their past glow magenta. Select any creature — here, on the screen, or in The Five — to read its life.
> No births yet. Start the simulation — the first generation arrives after their first year.
Program 04 · REM
BEFORE NFTS, THERE WAS LIFE.
In April 2013 someone hid a tiny world inside a Bitcoin transaction. Not a picture of it — the rules of it.
LIFE is an artificial-life program written in QBasic. Five creatures and ten pieces of food appear on a brown field. Creatures wander, eat, breed when they are old and well-fed, sometimes mutate, and die when they go hungry. The author wrote down what every variable means, then left the program unfinished.
It was never a token. Nobody owned it, nobody sold it, and it cannot be traded. It is simply source code, written into the most widely copied database on Earth — and it has been there ever since.
How it was hidden
- 1.The file was cut into 20-byte pieces. A Bitcoin script hash is also 20 bytes long.
- 2.Each piece was used as if it were an address, and sent 1 satoshi. 184 pieces, 184 outputs.
- 3.Nobody holds the keys to those “addresses”, so the coins can never move — and the data can never be removed.
- 4.The first 8 bytes say how long the file is and give a checksum (0408019B), so anyone can check the copy is perfect.
This was a common trick before 2014. It works, but it fills every node’s list of unspent coins with outputs that can never be spent. Part of the reason OP_RETURN was made standard was to give data like this a cleaner home.
- 2009Bitcoin launchesThe genesis block is mined on 3 January 2009.
- 2013LIFE is written into block 230621On 10 April 2013, one transaction carries a 3,662-byte BASIC program inside 184 fake addresses.
- 2014OP_RETURN becomes standardBitcoin Core 0.9.0 gives people a proper, prunable place for small pieces of data — 40 bytes at first.
- 2017CryptoKittiesDigital creatures on a blockchain become famous — on Ethereum, four years later.
- TODAYLIFE runs againThe program is decoded from the chain and brought back to life here.
- Five creatures. Ten food. One permanent program.
- Not a picture of life. The rules of life.
- A forgotten ecosystem, preserved by the blockchain.
- Before NFTs, there was LIFE.
Program 05 · LIST
THE ORIGINAL BASIC
All 151 lines, exactly as they were decoded from the block — typos, dead code and all. Nothing here has been edited. Click a marked line to read what it does.
| LINE | IN THE 2013 CODE | IN RESTORED MODE |
|---|---|---|
| 530 | THE MISSING RETURN — This RETURN is commented out. So GOSUB 360 never comes back — it falls through to placing food and then into the main loop. Every birth (line 930) re-runs setup and restarts the loop. | Placing a creature and placing food are separate steps. |
| 700 | “PRESS F1 TO PAUSE” — F1 jumps to line 1480, which is END. So “pause” actually quits the program. | F1 really pauses here. |
| 830 | THE WRONG FOOD — Breeding takes food from FOOD#, a variable used nowhere else — not from the parent’s CF(I). | The parent pays for the baby out of its own food. |
| 900 | FOOD, NOT FOODTYPE — This sets FOOD, not FOODTYPE. Probably a typo — diet never actually mutates. | Diet mutates as the comments intended. |
| 910 | THE BIRTH TRICK — To make one baby, the code sets C# to 1 and calls the placing routine. But A only saves the count when a mutation happens, so a normal birth can reset the population to an old value. | Babies are added to the list properly. |
| 1050 | THE EARLY REDRAW — After moving only the first creature, the code jumps to the redraw routine, which ends with GOTO 760. The loop never reaches creature 2. | Every creature moves every step. |
| 1110 | THE YES FLAG — YES is never set back to 0, so the “am I on food?” test drifts after the first check. | Eating happens when a creature is on food. |
| 1270 | DEATH — A creature with less than 9 food is erased from the screen — but it stays in the arrays and keeps moving. | Below 9 food, the creature dies and is removed. |
| 1360 | MOD 1 — Any number MOD 1 is 0. With EPERYEAR = 1 this line never takes food away. | Each year, a creature uses EPERYEAR food. |
Program 06 · VERIFY
DON'T TRUST. VERIFY.
Everything on this page comes from one public transaction. You can check it yourself, from any Bitcoin node or block explorer.
- BLOCK HEIGHT
- 230621
- BLOCK TIME
- 10 APR 2013 · 09:37:49 UTC
- TX SIZE
- 6,114 BYTES
- TX FEE
- 311,866 SATS
- DATA OUTPUTS
- 184 × 20 BYTES (P2SH)
- PAYLOAD
- 3,662 BYTES · CRC32 0408019B
const tx = await fetch(
'https://mempool.space/api/tx/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7'
).then((r) => r.json())
// 184 P2SH outputs: script = a9 14 <20 bytes> 87
const hex = tx.vout
.filter((o) => o.scriptpubkey_type === 'p2sh')
.map((o) => o.scriptpubkey.slice(4, 44))
.join('')
const bytes = Uint8Array.from(hex.match(/../g), (h) => parseInt(h, 16))
const length = new DataView(bytes.buffer).getUint32(0, true) // 3662
const program = new TextDecoder('latin1').decode(bytes.subarray(8, 8 + length))
console.log(program) // 10 REM The variables in life ...- > TRANSACTIONMEMPOOL.SPACEThe transaction with all 184 data outputs.mempool.space/tx/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7
- > TRANSACTIONBLOCKSTREAMThe same transaction on a second, independent explorer.blockstream.info/tx/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7
- > TRANSACTIONBLOCKCHAIN.COMThe same transaction on a third explorer.www.blockchain.com/explorer/transactions/btc/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7
- > BLOCK 230621MEMPOOL.SPACEThe block that confirmed it on 10 Apr 2013.mempool.space/block/000000000000022cf6775fd0d7df8260b2ea1b75476a22bef0c8923d97cc4f9f
- > BLOCK 230621BLOCKSTREAMThe same block on a second explorer.blockstream.info/block/000000000000022cf6775fd0d7df8260b2ea1b75476a22bef0c8923d97cc4f9f
- > RAW HEXMEMPOOL.SPACE APIThe full raw bytes of the transaction. The program is inside them.mempool.space/api/tx/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7/hex
- > RAW HEXBLOCKSTREAM APIThe same raw bytes from a second source.blockstream.info/api/tx/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7/hex
- > DECODED JSONMEMPOOL.SPACE APIMachine-readable outputs. Used by the decode script below.mempool.space/api/tx/3a1c1cc760bffad4041cbfde56fbb5e29ea58fda416e9f4c4615becd65576fe7
- > HEIGHT → HASHMEMPOOL.SPACE APIShows that height 230621 resolves to block 000000000000022c…mempool.space/api/block-height/230621
A note on honesty: the source code shown here is exactly what is on the chain. The simulation is a new program written in 2026 that follows that code. Original Mode keeps its behaviour, bugs included. Restored Mode fixes the bugs so the creatures can do what the author's comments describe — every change is listed in the table above.