Glossario / Riferimento per sviluppatori
Checksum del descrittore
- Che cos'è il checksum del descrittore?
- Il checksum del descrittore è il codice di otto caratteri che segue il cancelletto in un descrittore di output, un codice BCH che intercetta gli errori di battitura e di copia prima che un wallet importi le chiavi sbagliate.
Specificato nel BIP-380.
Il codice si trova alla fine di un descrittore, dopo un solo cancelletto, nello stesso alfabeto di 32 caratteri di bech32. Il BIP-380 garantisce che qualsiasi errore che tocchi tre simboli o meno venga intercettato in un descrittore fino a 49.154 caratteri, e un errore casuale passa inosservato circa una volta su mille miliardi. Senza questo controllo, un solo carattere sbagliato in un backup multisig ti lascia a guardare indirizzi che non contengono nulla.
Come funziona
Il checksum del descrittore è un codice BCH calcolato sul testo del descrittore e non un hash dello stesso, ed è questo che offre le garanzie sugli errori. Il BIP-380 fissa un alfabeto di input di 95 caratteri e lo divide in tre gruppi, mettendo nel primo i caratteri senza protezione propria: cifre, parentesi, barre, l'asterisco jolly e le minuscole da a a h, dove finiscono le chiavi codificate in esadecimale e i percorsi di derivazione. Il testo della specifica parla di tre gruppi di 32, anche se il suo codice di riferimento usa 32, 32 e 31.
Ogni carattere contribuisce con un simbolo, la sua posizione all'interno del suo gruppo, e dopo ogni terzo simbolo ne viene inserito un quarto che porta combinati i tre numeri di gruppo, così tre caratteri si espandono in quattro simboli. Una modifica che sposta solo un carattere all'interno del suo gruppo, o che cambia solo il gruppo in cui si trova, altera esattamente un simbolo. Per questo un errore di maiuscole e minuscole conta esattamente come un errore di un simbolo, e per questo un solo carattere scritto in maiuscolo viene sempre intercettato.
Le garanzie si riducono man mano che la stringa cresce. Un errore di un simbolo viene sempre intercettato; due o tre vengono sempre intercettati fino a 49.154 caratteri, quattro fino a 507 caratteri e cinque fino a 77 caratteri, con il codice messo a punto per ridurre al minimo gli errori di cinque simboli non intercettati fino a 387. Il file descriptors.md di Bitcoin Core cita il limite di quattro errori a 501 caratteri invece che a 507 e colloca il rischio residuo a circa uno su mille miliardi. Il descrittore a chiave singola in quel documento occupa 140 caratteri, entro ogni limite; il suo esempio multipath 2-di-3 occupa 439, oltre la finestra di cinque simboli e dentro quella di quattro.
Le chiavi estese si difendono già da sole. Il BIP-380 osserva che una xpub esce dal primo gruppo e porta un proprio meccanismo di checksum, così un'espressione di chiave finisce per essere coperta due volte.
Dove lo vedi
I vettori di test del BIP-380 sono il modo più breve per vedere un checksum del descrittore fare il suo lavoro. La stringa valida è raw(deadbeef)#89f8spxm, e tra le varianti quasi valide che la specifica rifiuta ci sono l'assenza di checksum, un solo cancelletto, un checksum di nove caratteri, un checksum di sette caratteri, raw(deedbeef) con il vecchio checksum lasciato intatto e un payload che usa un carattere fuori dall'alfabeto di input.
Bitcoin Core stampa il checksum in uscita e lo richiede in entrata. Ogni RPC che restituisce un descrittore allega gli otto caratteri, mentre solo alcune ne richiedono uno in entrata, tra cui deriveaddresses e importdescriptors. Per una riga digitata o modificata a mano, getdescriptorinfo restituisce il checksum corretto.
Il checksum resta facoltativo per l'analisi sintattica, e il BIP-380 consente alle applicazioni di rifiutare i descrittori che ne sono privi. Lo incontrerai quando sposti una configurazione multisig tra un coordinatore, una macchina di riserva e un foglio di carta: quegli otto caratteri sono l'unica parte che conferma che il resto è arrivato intatto.
Checksum del descrittore vs bech32
Un checksum bech32 protegge un indirizzo e un checksum del descrittore protegge la definizione di un wallet, e le dimensioni in gioco spiegano la differenza di progetto. Il BIP-173 limita una stringa bech32 a 90 caratteri e dedica al checksum gli ultimi sei caratteri della parte dati, sullo stesso alfabeto di 32 simboli. Un descrittore non ha un limite del genere e deve coprire anche parentesi, virgole, virgolette e spazi, così il BIP-380 espande il testo in simboli di posizione con un simbolo di gruppo intercalato e ne dedica otto.
Entrambi scrivono quel risultato nello stesso alfabeto, qpzry9x8gf2tvdw0s3jn54khce6mua7l, ed è qui che nasce la confusione. Ciò che fallisce è diverso. Un indirizzo bech32 che non supera il suo checksum non può ricevere pagamenti; un descrittore che non supera il suo è un wallet che non puoi ripristinare.