👉🏻 Clicca qui per guardare la versione video su YouTube 👈🏻
La tua seed da 12 parole è solo l’inizio. In questo episodio scopriamo come, da quella piccola frase, Bitcoin genera migliaia di indirizzi.
Episodio 6 di 10 della serie sulla crittografia Bitcoin. Recupera qui gli altri episodi della serie 👉🏻 Caccia al tesoro
🧬 BIP32: la nascita degli HD Wallet
Nell’episodio 5 abbiamo ottenuto un seed binario da 512 bit tramite PBKDF2-HMAC-SHA512.
Ora entra in gioco lo standard BIP32, che introduce il concetto di:
HD Wallet = Hierarchical Deterministic Wallet
Un HD wallet è un portafoglio in grado di:
- generare infinite chiavi private e indirizzi,
- partendo da una sola master key,
- in modo deterministico (cioè prevedibile e ripetibile) a partire da un seme
🧩 Come si genera la master key?
BIP32 prende il seed da 512 bit e applica nuovamente, ma questa volta utilizzando il tuo seed da 512 bit ad una costante chiamata “Bitcoin seed” (per capire sostituisce quello che prima era la parola “mnemonic”. Ecco il HMAC-SHA512(Seed, “Bitcoin seed”)
L’output che si ottiene è diviso così:
- primi 32 byte (256 bit) → master private key (cioè quella che usi effettivamente per firmare le transazioni)
- ultimi 32 byte (256 bit) → chain code (un “codice” che viene utilizzato per generare le chiavi figlie)
Successivamente alla creazione della mia chiave padre (o madre) ho bisogno di generare le chiavi figlie, ovvero dalla mia chiave principale ne voglio tante altre a cascata.
Per questioni di privacy infatti su Bitcoin si utilizza un indirizzo di ricezione UNA SOLA VOLTA. Non è obbligatorio, ma è consigliato se voglio aumentare la mia privacy e far in modo di non essere tracciato. Gli indirizzi di ricezione sono quindi potenzialmente “usa e getta”. I wallet che utilizziamo ogni giorno integrano automaticamente questa funzione ed ogni volta che riceviamo una nuova transazione creano un nuovo indirizzo.
Ecco, questo indirizzo è generato sempre partendo dalle mie 12 parole, quindi il percorso di creazione dev’essere deterministico.
In BIP32, per generare una chiave figlia da una chiave padre (privata o pubblica), usiamo la funzione:
HMAC-SHA512(chain_code, chiave padre, #indice del figlio).
- #indice del figlio = che numero è quella chiave pubblica: la prima (1), la seconda (2), la terza (3), ecc ecc….
Se derivassimo le chiavi figlie solo a partire dalla chiave privata, chiunque conosce una chiave privata figlia potrebbe risalire a quella master. Il chain code separa la derivazione da padre a figlio, rendendola unidirezionale e sicura.
Tutti questi passaggi ci portano alla nascita del nostro HD wallet.

🌳 La struttura ad albero: percorsi e derivazioni
Da quella chiave padre si costruisce una gerarchia infinita di chiavi, usando dei percorsi standardizzati, detti derivation paths.
Ecco un esempio classico di come troverai una chiave scritta in forma completa:
m / 84' / 0' / 0' / 0 / 0
Ogni sezione ha un significato:
Valore | Significato | Descrizione |
---|---|---|
m | Chiave padre (madre) | La chiave dalla quale dipende tutto |
84′ | Purpose (BIP84) | Tipo di indirizzo (es. Native SegWit = bc1q…) |
0′ | Coin type | 0 = Bitcoin mainnet, 1 = Testnet, 60 = Ethereum, ecc… |
0′ | Account | Puoi usare 0 per il personale, 1 per il business, 2 per spese, ecc… |
0 | Change | 0=ricezione, 1=resto |
0 | Indice indirizzo | Numero del singolo indirizzo derivato |
Prima di capire meglio con un esempio cosa sono tutte queste voci, c’è da distinguere i due tipi di derivazione:
Tipo | Notazione | Accesso tramite… |
---|---|---|
🔐 Hardened | con apostrofo (es. 0′) | Solo con la chiave privata |
🔓 Non-hardened | senza apostrofo (es. 0) | Anche con la xpub (chiave pubblica estesa) |
Questo significa che:
✅ Con la chiave privata m → puoi derivare tutto (hardened + non)
✅ Con la xpub → puoi derivare solo i percorsi non-hardened
Ed è per questo che molte app, come Specter, BTCPay Server, BlueWallet, ecc… usano l’xpub per monitorare saldi, ricevere fondi e generare QR senza avere accesso ai BTC.
Vediamo qualche esempio:
ESEMPIO 1: m / 84' / 0' / 2' / 0 / 5
Sezione | Valore | Significato | Spiegazione pratica |
---|---|---|---|
84′ | Purpose | BIP84 – Native SegWit | Usi indirizzi bc1q… per risparmiare fee e migliorare privacy |
0′ | Coin | Bitcoin mainnet | Questo wallet opera sulla rete Bitcoin vera, non Testnet |
2′ | Account | Account 2 – “Donazioni pubbliche” | Stai separando i fondi personali da quelli pubblici |
0 | Change | External – indirizzi visibili | È un indirizzo che puoi pubblicare sul sito per ricevere BTC |
5 | Index | Sesto indirizzo | È il 6° indirizzo generato in quell’account |
👉 Questo è un indirizzo che riceve donazioni, è in SegWit, appartiene al terzo account (2′ perchè ti ricordo che c’è anche 0), ed è pubblico.
ESEMPIO 2: m / 86' / 1' / 0' / 1 / 3
Sezione | Valore | Significato | Spiegazione pratica |
---|---|---|---|
86′ | Purpose | BIP86 – Taproot (P2TR) | Il wallet genera indirizzi bc1p… compatibili con Taproot |
1′ | Coin | Testnet Bitcoin | È su Bitcoin Testnet, utile per test, non veri fondi |
0′ | Account | Account principale | Primo account standard |
1 | Change | Internal – indirizzi di resto | Il wallet li usa in automatico per il “change” delle transazioni |
3 | Index | Quarto indirizzo | È il 4° indirizzo di resto usato in questo account |
👉 Questo è un indirizzo non visibile all’utente, usato solo per il resto, in ambiente di test e con Taproot. Il wallet, quando fa un pagamento, usa un indirizzo della internal chain per ricevere il “resto” della transazione.
🔎 Scansione degli indirizzi
Poiché puoi generare milioni di indirizzi, ma non tutti sono “attivi”, i wallet fanno una scansione limitata (di solito i primi 20) per cercare fondi.
Su questo sito puoi vedere un esempio in tempo reale: https://coinb.in.
Mi spiego meglio, potresti avere un indirizzo di questo tipo: m / 84′ / 0′ / 2′ / 0 / 2487
Questo significa che quella chiave pubblica, che hai usato per ricevere, è alla posizione 2487. Questo potrebbe:
- Aver usato i 2486 indirizzi precedenti (I wallet Bitcoin, per ogni nuova transazione, generano un nuovo indirizzo per questioni di privacy)
- Essere stato deciso da te perchè volevi mettere i fondi proprio in quella posizione
Infatti potresti utilizzare questo sistema per nascondere dei fondi.
Quando importi una seed nel tuo wallet, nella tua app, questa scansionerà i primi 20 indirizzi e se non dovesse trovare nulla nei primi 20, darà per assodato che quella seed è vuota, non contiene alcun saldo (in realtà tu hai potresti aver messo i fondi così lontani da non essere trovati se non dopo un’analisi molto più profonda).
Il tuo wallet scansionerà:
- m / 86' / 1' / 0' / 1 / 0
- m / 86' / 1' / 0' / 1 / 1
- m / 86' / 1' / 0' / 1 / 2
- ecc ecc...
È importante notare che prima di questa evoluzione degli HD Wallet (che quindi si calcolano le chiavi in modo automatico) andava salvata OGNI chiave privata relativa alla propria chiave pubblica.
Ad oggi, il mio portafoglio, ogni volta che ricevo nuovi satoshi, crea un nuovo indirizzo di ricezione, una nuova chiave pubblica. Questo viene fatto per motivi di privacy e non consentire il tracciamento.
In passato per OGNI indirizzo di ricezione, per ogni chiave pubblica diversa sulla quale ricevevo, dovevo salvarmi la relativa chiave privata.
Questo significa avere righe e righe di chiavi private ogni volta che ricevevo ed inviavo BTC.
📌 Prossimo episodio
Nel prossimo episodio entreremo nel cuore della matematica della sicurezza di Bitcoin andando a scoprire il funzionamento della crittografia a curve ellittiche! Preparati perchè sarà un bel viaggio impegnativo!
Episodio 6 di 10 della serie sulla crittografia Bitcoin. Recupera qui gli altri episodi della serie 👉🏻 Caccia al tesoro
🤬 La parola di oggi è: 6. erario