Bitcoin come una scacchiera

21 May 2026  ·  12 min di lettura  ·  Bitcoin × Chess

Risposta rapida

Una posizione reale di scacchi con l'esercito standard di 32 pezzi porta circa 148 bit di informazione combinatoria. Due posizioni superano comodamente i 256 bit — la dimensione esatta di una chiave privata Bitcoin. La mappatura è una pulita biiezione combinatoria: ogni metà da 128 bit corrisponde a una sola posizione legale e viceversa.

Provalo dal vivo

Vedi la tua chiave Bitcoin come una posizione di scacchi

Apri il convertitore Bitcoin-scacchiera

100% lato browser · matematica aperta · solo per istruzione e arte

C'è qualcosa di silenziosamente perfetto nel fatto che il gioco da tavolo più popolare della storia e la criptovaluta di maggior successo condividano esattamente la stessa capacità di informazione. Questo articolo spiega perché — e ti mostra come convertire tra i due.

1. Perché 256 bit stanno in 64 caselle

Le chiavi private Bitcoin sono interi sulla curva ellittica secp256k1. L'intervallo valido è [1, n−1], dove n ≈ 2256 − 232 − 977. In pratica, quasi qualsiasi stringa di 256 bit è una chiave valida — la probabilità di cadere nella zona proibita è circa 1 su 2224.

Una scacchiera ha 8 × 8 = 64 caselle, ma non ogni disposizione è una posizione legale. L'esercito standard ha 32 pezzi (2 re, 2 donne, 4 torri, 4 alfieri — uno per colore per parte — 4 cavalli, 16 pedoni). Contando le disposizioni su 64 caselle con i pedoni vincolati alle traverse 2–7 si ottengono circa 2148 posizioni. Una scacchiera trasporta 148 bit; due scacchiere circa 296 bit, ben oltre i 256 bit di una chiave.

log₂(positions per board) ≈ 148 bits   ·   2 boards ≈ 296 bits   ≥   256 bits = 1 Bitcoin private key ✓

2. Lo schema dell'esercito standard a 32 pezzi

Invece di inventare nuovi pezzi, il visualizzatore resta sull'esercito standard di 32 pezzi che ogni scacchista conosce. Ogni posizione codificata contiene esattamente: 1 re bianco e 1 nero, 1 donna bianca e 1 nera, 2 torri per colore, 2 alfieri per colore (uno su casa chiara, uno su casa scura), 2 cavalli per colore e 8 pedoni per colore. I vincoli:

  • Tutti i 32 pezzi sono presenti (nessuna cattura, nessuna promozione).
  • I pedoni occupano caselle qualsiasi delle traverse 2-7 (mai sulle traverse di base).
  • I due alfieri di ciascun lato stanno su caselle di colore opposto (uno chiaro, uno scuro) — come in qualsiasi apertura standard.

Questi tre vincoli definiscono l'insieme preciso di posizioni su cui è costruita la biiezione. L'ordine numerico di posizionamento è fisso (re, donne, torri, alfieri, cavalli, pedoni) così encoder e decoder concordano sui pesi.

3. Anatomia di una chiave privata Bitcoin

Una chiave privata grezza è solo 32 byte casuali. Per spostarla tra wallet, Bitcoin definisce il WIF (Wallet Import Format):

WIF = Base58Check(
    0x80 (network byte — mainnet)
    ‖ key (32 bytes)
    ‖ 0x01 (compressed flag)
    ‖ checksum (4 bytes = first 4 of double-SHA-256)
)

Mainnet vs testnet — una confusione comune. La chiave privata di 32 byte è solo un numero; è identica su ogni rete Bitcoin. L'unica differenza è la codifica visibile: il WIF usa prefisso 0x80 su mainnet e 0xEF su testnet, gli indirizzi bc1… / 1… contro tb1… / m… / n…. La scacchiera codifica la chiave, non la rete — le stesse due posizioni producono entrambi gli indirizzi, dipende solo da come scegli di stamparli. Il nostro convertitore mostra mainnet perché è quello che la gente riconosce.

Per i nostri scopi contano solo i 32 byte centrali — è ciò che dipingiamo sulla scacchiera. Prefisso, flag e checksum vengono aggiunti automaticamente al WIF.

4. Dalla chiave all'indirizzo: ECDSA → HASH160

Data la chiave privata k, la chiave pubblica è il punto sulla curva ellittica P = k · G, dove G è il generatore fisso di secp256k1. Questo passaggio è a senso unico: recuperare k da P è il problema del logaritmo discreto, computazionalmente infattibile.

L'indirizzo si calcola così:

pubkey = compress(k · G) # 33 bytes
hash160 = RIPEMD-160(SHA-256(pubkey)) # 20 bytes

legacy_address = Base58Check(0x00 ‖ hash160)
segwit_address = Bech32('bc', 0, hash160)

5. Checksum: Base58Check vs Bech32

Base58Check (indirizzi legacy e chiavi WIF) aggiunge 4 byte di doppio SHA-256 troncato e codifica il tutto in un alfabeto a 58 caratteri (senza 0, O, I, l). Qualsiasi refuso ha probabilità di circa 1 su 232 di produrre una stringa valida — praticamente zero.

Bech32 (BIP-173, SegWit) è molto più raffinato: usa un codice BCH a 30 bit su GF(32). Rileva qualsiasi errore di un singolo simbolo con probabilità 1, e qualsiasi coppia di errori con probabilità ≥ 1 − 2−30. Il suo alfabeto a 32 simboli si abbina perfettamente alle 32 caselle chiare della scacchiera — una coincidenza che sfruttiamo qui sotto.

6. La biiezione in codice

Ogni scacchiera rappresenta una metà a 128 bit della chiave (metà bassa sulla scacchiera 1, metà alta sulla 2). Poiché lo schema ammette solo un insieme fissato di posizioni legali, la biiezione non è una semplice tabella per casella \u2014 è un unranking combinatorio. Posiziona i pezzi in ordine fisso (re, donne, torri, alfieri, cavalli, pedoni); ad ogni passo scegli k caselle tra le n vuote rimaste; l'indice della scelta è una cifra in un sistema a base mista, con base C(n, k) per passo.

// encode 128-bit BigInt x into a board
let rem = x;
for (const step of placementOrder) { // WK, BK, WQ, BQ, WR, BR, …
  const base = C(step.n, step.k);
  const digit = rem % base;
  rem = rem / base;
  placeOnSquares(unrankCombo(digit, step.n, step.k), step.piece);
}

// decode \u2014 Horner with the same bases in reverse
let x = 0n;
for (let i = steps.length - 1; i >= 0; i--) {
  x = steps[i].digit + steps[i].base * x;
}

Gli alfieri hanno un passo leggermente diverso: ogni lato sceglie un alfiere su casa chiara dalle chiare disponibili e uno su casa scura dalle scure, base nL × nD. I pedoni sono limitati alle traverse 2\u20137 filtrando le caselle vuote prima della scelta binomiale. L'algoritmo intero sta in circa 40 righe di JavaScript puro con BigInt; leggibile direttamente nel sorgente del convertitore.

7. Il visualizzatore: due scacchiere, FEN modificabili

Il convertitore disegna entrambe le metà come veri diagrammi di scacchi con chessboard.js e il set Wikipedia \u2014 la stessa libreria e grafica usata dalla sala Vote Chess. La scacchiera a sinistra porta i 128 bit bassi, quella a destra i 128 bit alti. Sotto ogni scacchiera la posizione in FEN compare in un input modificabile.

Puoi incollare qualsiasi FEN. La scacchiera si ridisegna immediatamente così vedi sempre la posizione, e il bordo dell'input diventa verde o rosso a seconda che la posizione rispetti lo schema della biiezione:

  • Bordo verde: la posizione ha tutti i 32 pezzi, pedoni sulle traverse 2\u20137 e alfieri su colori opposti \u2014 la chiave Bitcoin si aggiorna subito.
  • Bordo rosso: il FEN viene letto ma la posizione non può codificare una chiave (pezzi mancanti, pedone su traversa 1 o 8, due alfieri sullo stesso colore, ecc.). La scacchiera la mostra per ispezione; solo la chiave resta invariata.

Un piccolo pulsante "copia" accanto a ogni input copia la stringa FEN per condividere o salvare. Il selettore "Posizioni famose", il pulsante random e i bottoni PNG/condividi usano la stessa pipeline, quindi tutto ciò che appare su una scacchiera è esportabile come FEN in qualsiasi momento.

8. Applicazioni

  • Paper wallet di scacchi. Stampa la posizione e infilala in un libro di aperture. Negabilità plausibile + zero elettronica + leggibile.
  • Arte generativa. Conia scacchiere come NFT che sono anche chiavi Bitcoin valide. Ogni disposizione è dimostrabilmente unica.
  • Scacchiere vanity. Cerca scacchiere che decodificano in indirizzi che iniziano con lettere scelte (bc1qchess…).
  • Educazione. Una scacchiera è il modo più viscerale per insegnare la dimensione dello spazio delle chiavi.
  • Memorizzazione. Gli scacchisti memorizzano centinaia di posizioni con facilità. Una scacchiera è molto più facile da ricordare di un WIF di 52 caratteri.

9. Considerazioni di sicurezza

  • Non usare mai una chiave generata in uno strumento pubblico per fondi reali.
  • Ricorda che la chiave privata è lo stesso numero su mainnet e testnet — cambia solo la codifica visibile. Una scacchiera che deriva un indirizzo mainnet valido deriva anche il corrispondente indirizzo testnet.
  • Usa crypto.getRandomValues() (o RNG hardware) — mai Math.random() — per generare chiavi.
  • Tutta la crittografia deve girare lato client. Il server non deve mai vedere la chiave.

10. Domande frequenti

Due chiavi diverse possono produrre la stessa scacchiera?

No. La mappatura è una biiezione perfetta su 2256 elementi — ogni scacchiera corrisponde esattamente a un numero a 256 bit e viceversa. Unica eccezione: il piccolo insieme fuori da [1, n−1] non sono chiavi Bitcoin valide.

La posizione finale di una partita famosa potrebbe decodificare un indirizzo Bitcoin reale?

Matematicamente sì — ogni posizione legale decodifica un numero a 256 bit e quindi una chiave. Se controlla saldo è un problema di brute-force. Con ~10⁹ indirizzi attivi su 2160, la probabilità è astronomicamente piccola (~10⁻³⁹).

Quali librerie usa il convertitore?

Il convertitore carica @noble/secp256k1 e @noble/hashes — entrambe pure JS, senza dipendenze, auditate, di Paul Miller. Base58Check e Bech32 sono inline in ~80 righe.

Pronto a vedere la tua chiave come una posizione?

Apri il convertitore interattivo

Commenti 0

Sii il primo a commentare!

Accedi per partecipare alla discussione.