Il procedimento per cui da una chiave privata si ottiene una chiave pubblica e da quest’ultima si derivano gli indirizzi ai quali vengono associati gli UTXO è effettuato dal wallet. Come funziona?
In un wallet deterministico le chiavi private vengono tutte derivate da un unico numero chiamato seed (seme), per esempio:
9400aedeede8cba2241d2b13e0a7412fe7464245efe8db54b4484143c7814977e641284cb4e023a9b48e075d0137631540fbf97976f3bbd32961667da1f62c5f
Il seed è un numero esadecimale generato da una sorgente randomica.
Il processo di derivazione da un seed a degli indirizzi di un wallet Bitcoin include una serie di operazioni di hash. Questi sono i passaggi di tale procedimento:
seed → master private key → master public key → public key → indirizzo
1. Il seed viene trasformato in una Master private key attraverso un algoritmo di hash chiamato HMAC-SHA512;
2. La Master private key viene trasformata in una Master public key attraverso la moltiplicazione a curva ellittica (si moltiplica la chiave privata per un punto costante della curva ellittica detto punto di generazione);
3. Partendo dalla master private key come radice, gli algoritmi derivano una struttura ad albero di coppie di chiavi private e pubbliche;
4. Per generare un indirizzo bitcoin viene fatto l’hash di una chiave pubblica utilizzando l’algoritmo SHA-256. Questo numero viene sottoposto a un nuovo hash utilizzando la funzione RIPEMD-160: ogni indirizzo è associato a una chiave pubblica;
5. La costruzione dell’indirizzo prevede l’aggiunta di un version byte davanti all’hash RIPEMD-160 e del checksum alla fine. Il checksum è costituito dai primi 4 byte dell’hash SHA-256 della chiave pubblica. L’indirizzo finale è quindi costruito dalla codifica Base58 di questa stringa di byte;
6. Codifica Base58Check: per creare un indirizzo Bitcoin pubblicamente condivisibile, l’output precedente viene codificato con “Base58Check”. In questo modo vengono eliminati alcuni caratteri che spesso vengono fraintesi dagli esseri umani o che si assomigliano. Il risultato è quello che conosciamo come indirizzo Bitcoin: bc1q6zjfr73jywxck3stj0rzl62ga94hyxgw9tfu8g.
Grazie a questo processo di derivazione, un wallet gerarchico deterministico (con tutti i suoi indirizzi) può essere recuperato da un unico seed. Questo è uno dei vantaggi dei wallet gerarchico deterministici rispetto ai wallet non-deterministici.
Un indirizzo bitcoin è una stringa alfanumerica, cioè una lunga serie di lettere e numeri, necessaria per inviare e ricevere bitcoin.
L’indirizzo deve essere comunicato al mittente della transazione per poter ricevere dei bitcoin. Per semplificare, possiamo paragonare un indirizzo bitcoin a un codice IBAN di un conto corrente bancario oppure a un indirizzo e-mail a cui inviare posta elettronica.