Collections

Bitcoin puzzle transaction

256 addresses whose keys are 1 to 256 bits wide. The one every scanner runs against. Keys published up to 135 bits and 77 addresses still funded.
load
getCollection("b1000")
puzzles
256 · 83 solved · 77 unsolved · 96 swept
prize recorded
1008.52911 BTC
still unsolved
903.015076 BTC
known material
184 public keys · 83 private keys
bitcoinstarted 2013-01-09 to 2015-01-15 open b1000/71 in the playground

The puzzle

One transaction in January 2015 funded 254 addresses. Puzzles 1 and 2 were already there, funded in 2013 and 2014. The author later said what the keys were: puzzle n has a private key somewhere in [2^(n-1), 2^n - 1]. The low ones fell in hours. Puzzle 1 is key 1. The high ones are out of reach for anyone without a very specific budget. The middle is where the scanning community lives. The prizes were raised in 2017 and again in 2023, so b1000/71 holds 7.1 BTC today for a key of 71 bits.

An open record declares its width with bits(n). A solved one carries it as the second argument of hex(key, n). Either way keyRange() turns it into the two bigint bounds. The width marks a search space and nothing else, so it's absent on every other collection.

const puzzle = b1000.require(71);

puzzle.keyRange(); // [2n ** 70n, 2n ** 71n - 1n]
puzzle.hasPubkey(); // false by design: no public key, so nothing beats scanning the range

Solved, swept, unsolved

A solved puzzle has its key on the record as hex(…, n).wif(…). The data gate derives the address from it on every test run. The highest published key is 135 bits, solved in July 2026 for 13.5 BTC.

swept is the other large group. Once a puzzle's public key became known, through an earlier spend or a reveal, its address could be attacked with Pollard's kangaroo instead of brute force. And people did. Those records carry the sweep transaction and, where the sweeper published it, the key. The status is written down because the transaction list alone can't tell a sweep from a solve.

b1000.solved().length; // 83
b1000.unsolved().length; // 77
(await selectPuzzles({ collection: "b1000", status: Status.Swept })).length; // 96

The record

src/collections/b1000/1.ts
export const b1000Puzzle1 = bitcoinPuzzle({
  id: "b1000/1",
  address: p2pkh("1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH", "751e76e8199196d454941c45d1b3a323f1433bd6"),
  sourceUrl: "https://bitcointalk.org/index.php?topic=5218972",
  startedAt: "2013-01-09 11:59:15",
  status: Status.Solved,
  pubkey: compressed("0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),
  key: hex("0000000000000000000000000000000000000000000000000000000000000001", 1).wif(
    "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn",
  ),
  prize: 0.001,
  solvedAt: "2013-01-10 02:54:44",
  solveTime: 53729,
  preGenesis: true,
  transactions: [
    funding("9223…808e", "2013-01-09 11:59:15", 0.03),
    claim("3da9…4277", "2013-01-10 02:54:44", 0.03),
  ],
});

preGenesis: true marks puzzles 1 and 2, funded in 2013 and 2014 before the January 2015 transaction. That's why puzzle 1 moves 0.03 BTC in its transactions while the recorded prize is the 0.001 the series assigns it. The collection is a NumericCollection. b1000.get(71), b1000.get("71") and b1000.get("b1000/71") all land on the same record.

Every puzzle

One page each: the record, the transactions and the live balance.

@agntn/puzzles·MIT license· Public data about public puzzles. Balances come from the chains' explorers through the worker, cached for five minutes. Every key here was public before it landed in a record.