Recovered software · Bitcoin mainnet

LIFE

Digital life, preserved in Bitcoin since 2013.

  • BLOCK 230621
  • APRIL 2013
  • 5 CREATURES
  • 10 FOOD
  • 1 PERMANENT PROGRAM
[ VIEW SOURCE ]
C:\RECOVER\LIFE.EXE

  1. 230619
  2. 230620
  3. ■ 230621
  4. 230622
  5. 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.

C:\LIFE\LIFE.BAS — RESTOREDREADY
Press F1 to pause.T0
creature CHR$(2) mutant line food CHR$(5) water food
CREATURES ALIVE
5
FOOD AVAILABLE
10
GENERATIONS
1
BIRTHS
0
DEATHS
0
MUTATIONS
0
SIMULATION TICK
0
EVENTS.LOG#1
  1. 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.

LINEAGE.TRE5 RECORDS · G1

> 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. 1.The file was cut into 20-byte pieces. A Bitcoin script hash is also 20 bytes long.
  2. 2.Each piece was used as if it were an address, and sent 1 satoshi. 184 pieces, 184 outputs.
  3. 3.Nobody holds the keys to those “addresses”, so the coins can never move — and the data can never be removed.
  4. 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.

  1. 2009Bitcoin launchesThe genesis block is mined on 3 January 2009.
  2. 2013LIFE is written into block 230621On 10 April 2013, one transaction carries a 3,662-byte BASIC program inside 184 fake addresses.
  3. 2014OP_RETURN becomes standardBitcoin Core 0.9.0 gives people a proper, prunable place for small pieces of data — 40 bytes at first.
  4. 2017CryptoKittiesDigital creatures on a blockchain become famous — on Ethereum, four years later.
  5. 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.

LIFE.BAS · 151 LINES · CRLF
WHAT THE CODE DOES vs. WHAT RESTORED MODE DOES
LINEIN THE 2013 CODEIN RESTORED MODE
530THE 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.
830THE 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.
900FOOD, NOT FOODTYPE — This sets FOOD, not FOODTYPE. Probably a typo — diet never actually mutates.Diet mutates as the comments intended.
910THE 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.
1050THE 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.
1110THE 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.
1270DEATH — 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.
1360MOD 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.

TX.INFBITCOIN MAINNET
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
DECODE.JS — RUN IT IN ANY BROWSER CONSOLE
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 ...

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.