A Bitcoin block hash is a 64-character hexadecimal string. It always begins with a run of zeros — this is required by proof-of-work difficulty and tells us nothing random. Everything from the first non-zero character onward is genuine cryptographic randomness.
0 appearing after the leading zeros is genuine random data with a 1/16
probability — it is not discarded. The strip only removes the deterministic leading zeros, not any zero that
follows.
Take the first two significant hex characters and convert them to a decimal number (0–255). Use modulo to map that into the list of legal moves for the active team. This gives a legal-move index.
f1 → hex F1 → decimal 241241 mod 28 = 17 → legal move #17. That move's from-square
is now the selected piece's location. All legal moves for that piece are collected.Take the next two significant characters (positions 3–4) and use the same modulo approach to pick from the selected piece's legal destination squares.
b3 → hex B3 → decimal 179179 mod 5 = 4 → destination square #4 (0-indexed). The move is made.Both teams use all six standard chess piece types. Bitcoin plays orange pieces (white side), Ethereum plays silver pieces (black side).
| Piece | Bitcoin (orange) | Ethereum (silver) | Moves like | Value |
|---|---|---|---|---|
| King | ♔ | ♚ | One square any direction | — |
| Queen | ♕ | ♛ | Any distance, any direction | 9 |
| Rook | ♖ | ♜ | Any distance, straight lines | 5 |
| Bishop | ♗ | ♝ | Any distance, diagonals only | 3 |
| Knight | ♘ | ♞ | L-shape, jumps over pieces | 3 |
| Pawn | ♙ | ♟ | Forward 1–2, captures diagonally | 1 |
Since the hash determines moves purely by arithmetic, occasionally the derived move would be illegal — for example, moving into check. The engine handles this gracefully:
Let's trace a real move from a Bitcoin block hash.
163 mod 31 = 8 → legal move #8. That move originates from e2 (a pawn).
247 mod 2 = 1
→ destination #1 = e4.Before the first move, a "deciding block" is fetched from Bitcoin. The last significant hex digit (rightmost non-zero character) determines who plays first:
| Last digit value | Parity | Goes first |
|---|---|---|
| 1, 3, 5, 7, 9, b, d, f | Odd | Bitcoin ♔ (orange) |
| 0, 2, 4, 6, 8, a, c, e | Even | Ethereum ♚ (silver) |
To replay a game: note the BTC and ETH starting block numbers displayed after game start, then use Start at block mode with those same numbers.