Dentro Bitcoin: i wallet
Bitcoin

Dentro Bitcoin: i wallet

By Alessio Salvetti - 20 Lug 2019

Chevron down

Questo articolo è il secondo di una serie di approfondimenti sulla parte più squisitamente tecnica di Bitcoin, questa volta dedicato ai wallet, accessibile anche a coloro a digiuno di codice. Questo articolo continua altresì una sorta di guida pensata per entrare gradualmente in quella che molti definiscono “la tana del bianconiglio”. 

Read this article in the English version here.

A livello bibliografico è d’obbligo citare il testo “Mastering Bitcoin” di Andreas Antonopoulos, riferimento costante, dal quale sono state tratte le immagini. Chi fosse interessato ad approfondire questi temi, con o senza integrazione delle dinamiche legate al codice, può trovare supporto nei corsi formativi e nella attività consulenziali erogate da Bcademy. (prossimo appuntamento per approfondire tutti questi temi, a partire dal 1 ottobre, Milano, corso “Bitcoin and Blockchain Executive” all’interno di un corso più ampio dedicato ad aspiranti developer).

I wallet bitcoin

Un wallet è un contenitore di chiavi private, non di coin. Le chiavi servono per firmare le transazioni che di fatto destinano i coin, memorizzandoli nella blockchain sotto forma di UTXO, da un indirizzo ad un altro. Ci sono differenti tipi di wallet.

Wallet casuali non-deterministici (Type-0 nondeterministic wallet, “Just a Bunch Of Keys,” or JBOK). Nei primi client di Bitcoin i wallet erano semplicemente collezioni di chiavi generate casualmente (Bitcoin Core pre-generava inizialmente 100 chiavi private, e poi ulteriori se necessarie, utilizzando ciascuna chiave solo una volta (contrastando con il principio di evitare il riutilizzo degli indirizzi per preservare la privacy).

Wallet deterministici (Seeded). Sono wallet che contengono chiavi private che sono generate da un unico seme (seed). Il seed è sufficiente per ripristinare tutte le chiavi derivate e pertanto è sufficiente un singolo backup al momento della creazione.

Mnemonic Code Words. (BIP 39) I codici mnemonici sono sequenze di parole che codificano un numero casuale usato come seme per derivare un portafoglio deterministico. Un’applicazione wallet che implementa i wallet deterministici con il codice mnemonico mostrerà all’utente una sequenza di 12-24 parole quando si crea per la prima volta un wallet. Questa sequenza di parole è il backup del wallet e può essere utilizzata per recuperare e ricreare tutte le chiavi nella stessa o in qualsiasi applicazione wallet compatibile.

Wallet Gerarchici Deterministici. (Hierarchical Deterministic Wallet o wallet HD – BIP 32 / BIP 44) La forma più avanzata di wallet deterministico è HDW wallet definito dallo standard BIP 32. I wallet HD contengono chiavi derivate in una struttura ad albero, tale che da una chiave madre si può far derivare una sequenza di chiavi figlie, e da ognuna di queste si può far derivare una sequenza di chiavi nipoti, e così via. Questo fornisce dei vantaggi:

  1. la struttura ad albero può essere usata per rappresentare una struttura organizzativa aggiuntiva (es: un ramo di sottochiavi per i pagamenti in arrivo e un altro per ricevere il resto da pagamenti in uscita; un ramo per ogni ramo d’azienda, etc);
  2. la possibilità di creare una sequenza di chiavi pubbliche senza avere accesso alle corrispondenti chiavi private (permette l’utilizzo su un server non sicuro o con sola capacità di ricezione, con l’emissione di una diversa chiave pubblica per ogni transazione).

I wallet HD sono creati da un singolo root seed (un numero casuale a 128-, 256-, o 512-bit), tutto il resto è deterministicamente derivato.

Il seme radice è l’input nell’algoritmo HMAC-SHA512 e l’hash risultante viene usato per creare una chiave privata master (m) e un codice master chain. La chiave privata master (m) poi genera una chiave pubblica master corrispondente (M), usando il normale processo di moltiplicazione m * G della curva ellittica. Il codice chain viene usato per introdurre entropia nella funzione che crea le chiavi figlie dalla chiave madre.

I wallet HD usano una funzione (CKD) per derivare le chiavi figlie, basata su una funzione di hashing unidirezionale che coinvolge:

  • una chiave privata o pubblica (genitore)
  • un seed chiamato “chain code” (256 bits)
  • un indice (index number, 32 bits).

Il chain code è usato per introdurre dati casuali nel processo deterministico, di modo che conoscere l’indice e la chiave figlia non sia sufficiente per derivare le altre figlie, se non conoscendo anche il chain code. L’iniziale chain code seed (alla radice dell’albero) è generato dal seed, mentre gli altri dai chain code dei genitori. Questi tre item (parent key, chain code, and index) sono compresi e “hashati” per generare chiavi figlie.

La chiave pubblica del genitore, il chain code e l’indice sono combinati e hashati (HMAC-SHA512) per generare un 512-bit hash. Questo 512-bit hash è diviso in due parti: i 256 bits di destra dell’hash divengono il chain code per i figli; mentre i 256 bits di sinistra dell’hash sono aggiunti alla chiave privata del genitore per produrre la chiave privata del figlio.

La funzione di derivazione delle chiavi può essere usata per creare figli a qualsiasi livello della struttura, basandosi sui tre input (chiave, chain code, indice del figlio desiderato). I primi due, combinati, sono  chiamati extended key (possono essere sia private che pubbliche).

Hardened derivation è una funzione alternativa di derivazione che spezza il legame tra la chiave pubblica del genitore e il chain code del figlio, usando la chiave privata del genitore per generare il chain code del figlio, invece che la chiave pubblica.

Paper Wallets. Sono esattamente wallet di carta, ergo chiavi private stampate su carta, talvolta accompagnate da un indirizzo bitcoin per ricevere pagamenti, e il caso d’uso comune è quello di creare backup o archiviare bitcoin offline (cold storage). La sicurezza dei paper wallet è incrementabile tramite BIP 38, con la passphrase memorizzata dal proprietario.

Alessio Salvetti
Alessio Salvetti

Co-founder di Bcademy e board member (VP), Alessio è partner e board member di Impact Hub Trentino, uno dei 102 nodi del network mondiale. Dopo un'esperienza come docente di filosofia, abbandona l’insegnamento per coordinare un team di ricerca sui temi della connessione tra neuroscienze ed economia, prima di dedicarsi alla vera e propria creazione d’impresa. Business developer e consulente per numerose startup, bitcoiner per passione ed esperto di modeling e lean startup, è co-founder di Inbitcoin e responsabile per l’erogazione dei prodotti di Bcademy (CPO).

Utilizziamo i cookie per essere sicuri che tu possa avere la migliore esperienza sul nostro sito. Se continui ad utilizzare questo sito noi assumiamo che tu ne sia felice.