Shopping Cart
0

#6 | 🌱 Da un solo seme… infiniti wallet

Tempo di lettura: 5 minuti

👉🏻 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.


Clicca sull’immagine e registrati con il codice “COSTANZA”

🌳 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:

ValoreSignificatoDescrizione
mChiave padre (madre)La chiave dalla quale dipende tutto
84′Purpose (BIP84)Tipo di indirizzo (es. Native SegWit = bc1q…)
0′Coin type0 = Bitcoin mainnet, 1 = Testnet, 60 = Ethereum, ecc…
0′AccountPuoi usare 0 per il personale, 1 per il business, 2 per spese, ecc…
0Change 0=ricezione, 1=resto
0Indice indirizzoNumero del singolo indirizzo derivato

Prima di capire meglio con un esempio cosa sono tutte queste voci, c’è da distinguere i due tipi di derivazione:

TipoNotazioneAccesso tramite…
🔐 Hardenedcon apostrofo (es. 0′)Solo con la chiave privata
🔓 Non-hardenedsenza 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
SezioneValoreSignificatoSpiegazione pratica
84′PurposeBIP84 – Native SegWitUsi indirizzi bc1q… per risparmiare fee e migliorare privacy
0′CoinBitcoin mainnetQuesto wallet opera sulla rete Bitcoin vera, non Testnet
2′AccountAccount 2 – “Donazioni pubbliche”Stai separando i fondi personali da quelli pubblici
0ChangeExternal – indirizzi visibiliÈ un indirizzo che puoi pubblicare sul sito per ricevere BTC
5IndexSesto 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
SezioneValoreSignificatoSpiegazione pratica
86′PurposeBIP86 – Taproot (P2TR)Il wallet genera indirizzi bc1p… compatibili con Taproot
1′CoinTestnet BitcoinÈ su Bitcoin Testnet, utile per test, non veri fondi
0′AccountAccount principalePrimo account standard
1ChangeInternal – indirizzi di restoIl wallet li usa in automatico per il “change” delle transazioni
3IndexQuarto 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:

  1. Aver usato i 2486 indirizzi precedenti (I wallet Bitcoin, per ogni nuova transazione, generano un nuovo indirizzo per questioni di privacy)
  2. 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

Flash News

Articoli correlati