Collections

WarpWallet challenges

Keybase's scrypt brainwallet with six funded challenges from 2013 to 2016. Four solved and two expired with the keys published afterwards. 41.85 BTC in total.
IDwarp47 / 516 puzzles · 2013-11-19 → 2016-02-01
Collection

WarpWallet challenges

bitcoin

Keybase's scrypt brainwallet. Four solved, two expired with the keys published.

Author
Keybase
Prize recorded
41.85 BTC
Still unsolved
none
closed 6 / 6

Census

solved
467%
expired
233%
public keys
6100%
private keys
6100%

Access

LoadgetCollection("warp")
Showwarp/challenge-1 in the playground
Listall 6 in the playground

The puzzle

WarpWallet was Keybase's answer to weak brainwallets. scrypt with a salt, usually an email address, so a passphrase couldn't be brute forced with a plain SHA-256 wordlist. To prove it, they funded challenges with short passphrases and dared people to crack them. The four small ones fell. The two 20 BTC ones didn't. They expired on schedule, and Keybase published the passphrases when they took the coins back.

What the records carry

Every WarpWallet record carries the hex key, the WIF and the passphrase, plus the salt where one was used, as .passphrase(…) and .salt(…) on the key builder. The library verifies the key against the address, not the passphrase against the key. scrypt with WarpWallet's parameters is a different package's job.

Each record also carries the hint Keybase printed next to its wallet, as official(…) with a Wayback capture of the page for its confirmation. The page still shows five of them; for the first 20 BTC challenge it shows the answer instead, so the December 2013 capture is where that hint lives. Each confirmation points at the versioned page the capture holds, because the bare keybase.io/warp capture is a redirect stub that dies in a browser.

tssrc/collections/warp/challenge-1.ts
export const warpPuzzleChallenge1 = puzzle({
  id: "warp/challenge-1",
  chain: "bitcoin",
  address: "1JKb1617p68H5MPkoNaMtaJCqKDU3h8qSn",
  sourceUrl: "https://keybase.io/warp",
  startedAt: "2013-11-19 20:12:25",
  status: Status.Solved,
  pubkey: uncompressed("045f75…51af"),
  key: hex("20f5df9cba8251e90a66d3aa1ca2849b12eaca135abb837671ac4a2bc2014e2b")
    .wif("5J4oWdwA5mSCP4GVWF237zgYK4h1csD2PfrmK3uh3YcRFSWZ2H1")
    .passphrase("Je"),
  prize: 0.1,
  hints: [
    official(
      "this passphrase is 2 random alphanumeric characters, such as 'X9'.",
      "https://keybase.io/warp",
      confirmation(
        "https://web.archive.org/web/20131213023906/https://keybase.io/warp/warp_1.0.6_SHA256_e68d4587b0e2ec34a7b554fbd1ed2d0fedfaeacf3e47fbb6c5403e252348cbfc.html",
        "Wayback capture of the challenge page",
      ),
    ),
  ],
});

A two character passphrase and it still took a scrypt run per guess. That was the argument.

Status

expired is the status for the two big challenges. The author took the prize back when the deadline passed. The keys on those records are the ones Keybase published, so they verify like any solved puzzle. The warpwallet alias resolves to this collection in every lookup.

Every puzzle

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

Listwarp.all()6 puzzles · 4 solved · 2 expired
  1. challenge-1 solved0.1 BTC1JKb1617p68H5M…DU3h8qSn
  2. challenge-2 solved0.25 BTC1NMjXhB2DW8pbG…8BTAkJKu
  3. challenge-3 solved0.5 BTC1FpxSs3tsvV8kn…yPq1QrvH
  4. challenge-4 solved1 BTC1GXXH7FbY7nCJD…EUi5GxfR
  5. warp-challenge-1 expired20 BTC1AdU3EcimMFN7J…3gF5ZnGj
  6. warp-challenge-2 expired20 BTC1MkupVKiCik9iy…4rkF3hnA
every name is a page · the key marks a known private keylocal dataset / no network