Glossario / Wallet e custodia
Seed del wallet HD
Noto anche come Seed radice.
- Che cos'è il seed del wallet HD?
- Il seed del wallet HD è il numero binario grezzo, da 128 a 512 bit, che BIP-32 immette in un unico hash per produrre la chiave master e il chain code di un wallet.
Specificato nel BIP-32.
I wallet parlano di parole perché le persone possono copiare le parole a mano, ma BIP-32 non vede mai parole. Consuma una stringa di byte e produce una chiave master in un solo passaggio di HMAC-SHA512, con il testo fisso "Bitcoin seed" come chiave. Le parole sono una codifica diffusa di quella stringa di byte, e non l'unica in uso.
Come funziona
BIP-32 specifica un seed compreso tra 128 e 512 bit, ne raccomanda 256 e non dice nulla su da dove provengano quei bit. Il seed entra in HMAC-SHA512 come messaggio, con la stringa ASCII "Bitcoin seed" come chiave. La funzione restituisce 64 byte. I 32 a sinistra diventano la chiave privata master; i 32 a destra diventano il chain code master, il segreto aggiuntivo che impedisce a una chiave figlia esposta di rivelare le chiavi sorelle. Tutto il resto in un wallet, ogni account, ogni indirizzo, ogni output di resto, discende da quella coppia ripetendo un hash simile con un numero di indice.
La specifica include un caso limite che non si verifica mai in pratica. Se quei 32 byte a sinistra risultano zero, o un valore pari o superiore all'ordine della curva secp256k1, il seed non è valido e il wallet deve riprovare. La probabilità è di circa uno su 2 elevato a 127, quindi nessuna implementazione ha mai segnalato di averlo incontrato.
Da dove provengano i bit è un livello separato, e le risposte sono diverse. BIP-39 produce sempre esattamente 512 bit facendo passare il mnemonico attraverso PBKDF2. Electrum fa passare la propria frase attraverso PBKDF2 con un salt diverso e ottiene un seed che nessuno strumento BIP-39 riprodurrà mai dalle stesse parole. Un wallet può anche prendere 256 bit direttamente da un generatore hardware di numeri casuali e non mostrare affatto una frase, ed è ciò che fa Bitcoin Core.
La direzione del percorso conta. Le parole diventano un seed; un seed non diventa parole. Una volta che un wallet conserva solo il valore grezzo, nessun software stamperà un mnemonico a partire da esso, ed è per questo che esportare "il seed" non sostituisce la conservazione della frase che l'ha prodotta.
Dove lo vedi
Se chiedi a Bitcoin Core informazioni su un wallet, riporta un hdseedid, un'impronta del seed, anziché una frase qualsiasi, perché Core non ha mai implementato BIP-39. La RPC sethdseed, aggiunta nella versione 0.17.0, poteva installare un seed specifico in un wallet legacy, e i wallet a descrittori sono diventati l'impostazione predefinita per i wallet creati da zero in Bitcoin Core 23.0.
La documentazione per sviluppatori è l'altro luogo in cui compare in chiaro. Sia BIP-32 sia BIP-39 pubblicano vettori di test che mostrano il seed come 128 caratteri esadecimali accanto al mnemonico che l'ha prodotta, che è l'illustrazione più chiara disponibile del fatto che i due sono oggetti diversi.
Il momento pratico in cui questo si fa sentire è la migrazione tra strumenti. Alcuni wallet e specifiche, compresi i backup del seed di Coldcard e varie utilità per sviluppatori, importano o esportano il valore grezzo anziché le parole. Consegnare un seed grezzo a uno strumento che si aspetta un mnemonico, o il contrario, produce un errore o, peggio, un wallet valido ma vuoto. Controlla quale livello richiede un campo prima di incollarvi qualsiasi cosa.
Seed del wallet HD vs frase di recupero
Il seed è un numero; la frase è un modo di scrivere quel numero. Tenere le due cose distinte spiega diverse cose che altrimenti sembrano magia. È il motivo per cui aggiungere una passphrase facoltativa cambia il seed lasciando intatte le tue parole. È il motivo per cui la frase di Electrum e una frase BIP-39 possono essere entrambe dodici parole inglesi e aprire comunque wallet diversi. Ed è il motivo per cui un wallet che pubblicizza "importazione del seed" può intendere un mnemonico, una stringa esadecimale o una chiave privata estesa, tre input che condividono un soprannome e nulla più.