HomeCriptovaluteBitcoinDentro Bitcoin: chiavi e indirizzi. Guida parte 5A

Dentro Bitcoin: chiavi e indirizzi. Guida parte 5A

Questo articolo è il quinto di una serie di approfondimenti sulla parte più squisitamente tecnica di Bitcoin, 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”. 

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).

Introduzione

In precedenza abbiamo definito bitcoin e Bitcoin:

  • bitcoin (in minuscolo come unità di conto): il primo bene digitale, trasferibile, non duplicabile, decentralizzato;
  • Bitcoin (in maiuscolo come sistema di trasferimento valore): un protocollo che genera una rete tra pari che permette ad ogni nodo che la compone di transare liberamente e pseudonimamente valore ad altri nodi della rete. Tale valore, o più correttamente, rappresentazione digitale di valore, viene generato dal protocollo in modo da garantire scarsità, sicurezza nell’ordine delle transazioni, sicurezza del sistema stesso.

Il sistema e la sua unità di conto nativa sono stati resi possibili, nella visione di Andreas Antonopoulos, da quattro innovazioni chiave, culmine di decenni di ricerca nei campi della crittografia e dei sistemi distribuiti, portate insieme in un’unica e potente combinazione:

  • un network peer-to-peer decentralizzato (il protocollo Bitcoin, anche se con questo termine si possono indicare ampiamente tutti e quattro i punti);
  • un libro-mastro di transazioni pubblico (la blockchain);
  • l’emissione della moneta decentralizzata, matematica e deterministica (mining distribuito);
  • un sistema decentralizzato di verifica delle transazioni (lo script delle transazioni).

Entrare nel sistema utilizzando l’unità di conto nativa è semplice, basta scaricare un’applicazione wallet (per pc, tablet, smartphone, smartwatch, ecc) o utilizzare un’applicazione web. Le tre forme principali del client Bitcoin sono:

  • full client, o “full node”, un client che mantiene una copia completa della blockchain, gestisce i wallet utente (e inizialmente gestiva il mining);
  • light client, o “light node”, che registra il wallet utente ma si appoggia su server terzi per accedere alla rete;
  • web client, a cui si accedere tramite web browser e che mantengono i dati dell’utente su un server terzo (da non confondersi con applicazioni come come Coinbase).

Negli approfondimenti che seguono occorre tenere presente che non sono state trattate le modifiche apportate da SegWit, al quale sarà dedicata una sezione specifica.

Bitcoin: chiavi e indirizzi

Chiavi

Il possesso dei bitcoin si determina attraverso:

  • chiavi digitali;
  • indirizzi bitcoin;
  • firme digitali.

Le chiavi non sono memorizzate in rete, ma dagli utenti nel wallet (file o database di creazione e memorizzazione delle chiavi). Sono coppie di chiavi composte da una chiave privata ed una chiave pubblica. L’unica rappresentazione delle chiavi che gli utenti vedono è l’indirizzo bitcoin, solitamente (ma non esclusivamente) generato da e corrispondente a una chiave pubblica. Bitcoin utilizza la moltiplicazione a curva ellittica come base per la sua crittografia a chiave pubblica: la coppia di chiavi consiste in una chiave privata (per spendere bitcoin) e in un’unica chiave pubblica (per ricevere bitcoin) che ne deriva. La relazione matematica tra le due chiavi permette alla privata di essere utilizzata per generare firme sui messaggi, e alla pubblica di validare tale firma senza rivelare la privata.

Un wallet contiene una raccolta di coppie di chiavi, dove:

  • la chiave privata (k) è un numero (di solito scelto a caso prima dell’avvento dei wallet deterministici, che ora costituiscono la best practice e verranno trattati all’interno di un ulteriore approfondimento);
  • da k attraverso la moltiplicazione a curva ellittica (una funziona di crittografia unidirezionale) viene generata una chiave pubblica (K);
  • da K attraverso un algoritmo di hashing  (una funzione di crittografia unidirezionale) viene generato un indirizzo bitcoin (A).

Chiavi private. Una chiave privata è un numero casuale, che non deve essere in nessun caso rivelata (o smarrita, pena la perdita dei bitcoin associati), ergo la modalità più sicura per generare una chiave privata è trovare una fonte di entropia o casualità. Il client bitcoin utilizza il generatore di numeri casuali dell’OS (generalmente inizializzato da una fonte di casualità – nel caso di wallet deterministici HD il generatore si usa per generare il seed da cui si generano le chiavi) per produrre 256 bit di entropia. La chiave privata potrebbe essere un qualsiasi numero tra 1 e n-1, dove n è una costante (1.158 * 1077un po’ meno di 2256) definita come l’ordine della curva ellittica in bitcoin. Generato un numero casuale da 256 bit (solitamente sottoponendo all’algoritmo di hash SHA256 una stringa più lunga di bit casuali) se il risultato è inferiore a n-1 la chiave è adeguata.

La seguente è una chiave privata generata randomicamente (k) mostrata nella sua rappresentazione esadecimale (256 cifre mostrate come 64 cifre esadecimali, ognuna da 4 bit):

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

Chiavi pubbliche. La chiave pubblica è generata dalla chiave privata attraverso la moltiplicazione a curva ellittica, irreversibile, K = k * G dove:

  • k è la chiave privata;
  • G è un punto costante chiamato generator point.

L’operazione inversa, conosciuta come “finding the discrete logarithm”, calcolare k conoscendo K ha la medesima difficoltà di trovare il valore di k attraverso un attacco brute-force.

Bitcoin utilizza una curva ellittica specifica e un set di costanti matematiche, definite in uno standard detto secp256k1, stabilita dal National Institute of Standards and Technology (NIST).

Partendo con una chiave privata k, e moltiplicandola per un punto predeterminato della curva chiamato il generator point G, si produce un altro punto sulla curva, che corrisponde alla chiave pubblica K. Il generator point G è specificato come parte dello standard secp256k1 ed in bitcoin è il medesimo per tutte le chiavi, ergo una chiave privata k moltiplicata per G avrà come risultato sempre la stessa chiave pubblica K. La relazione tra k e K è fissa, ma può essere calcolata solo in un’unica direzione, da k a K.

Implementando la moltiplicazione a curva ellittica si prenda la k riportata in precedenza e la si moltiplichi per G al fine di ottenere K:

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G

La chiave pubblica è definita dalle coordinate del punto K = (x, y):
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

Per visualizzare la moltiplicazione di un punto con un intero, si utilizza la curva ellittica più semplice rispetto ai numeri reali (la matematica è la stessa). L’obiettivo è trovare kG, multiplo di G, che equivale ad aggiungere G a se stesso, k volte di seguito. Nelle curve ellittiche, aggiungere un punto a se stesso equivale a tracciare una tangente alla curva nel punto e trovare dove interseca nuovamente la curva, quindi riflettere quel punto rispetto all’asse x.

Indirizzi

Gli indirizzi prodotti dalle chiavi pubbliche consistono in una stringa di numeri e lettere e cominciano con 1 (fino all’attivazione di SegWit), qui un esempio: 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy 

L’indirizzo bitcoin è il dove vengono all’interno di una transazione viene inviato il valore. Un indirizzo bitcoin può rappresentare:

  • Il proprietario di una coppia di chiavi privata/pubblica;
  • Uno script di pagamento.

In precedenza si è detto che da K attraverso un algoritmo di hashing  (una funzione di crittografia unidirezionale) viene generato un indirizzo bitcoin (A). Un “algoritmo di hashing” o semplicemente “algoritmo di hash” è una funzione unidirezionale che produce un’impronta digitale (digest o codice) o “hash” di un input di dimensioni arbitrarie. Tali funzioni sono fondamentali in Bitcoin, e sono presenti in diverse parti del sistema. Gli algoritmi utilizzati per creare un indirizzo bitcoin da una chiave pubblica sono Secure Hash Algorithm (SHA) e RACE Integrity Primitives Evaluation Message Digest (RIPEMD), in particolare SHA256 e RIPEMD160. Dalla chiave pubblica K calcoliamo prima l’hash SHA256 e in seguito l’hash RIPEMD160, generando un numero a 160-bit (20-byte).

Gli indirizzi bitcoin vengono quasi sempre presentati in una codifica chiamata Base58Check, che utilizza 58 caratteri (un sistema di numeri Base58) e un checksum (bech32 verrà approfondito in seguito) per evitare l’ambiguità e proteggere dagli errori nella trascrizione e nella registrazione degli indirizzi.

Formati di chiavi private. Le chiavi private possono essere rappresentate in differenti formati, i quali corrispondono al medesimo numero a 256-bit. Hexadecimal e raw binary sono usati internamente ai software e raramente mostrati agli utenti, mentre WIF è utilizzato per l’import/export delle chiavi e spesso usato in una rappresentazione QR code (barcode). Lo standard BIP 38 permetti di crittografare le chiavi private (compatibilmente con svariati wallet e client Bitcoin) con una passphrase e codificarle con Base58Check in modo che possano essere archiviate in modo sicuro su supporti di backup, trasportate in modo sicuro tra wallet o conservate in qualsiasi altra condizione in cui la chiave potrebbe essere esposta. Lo standard per la crittografia utilizza l’Advanced Encryption Standard (AES), uno standard stabilito dal National Institute of Standards and Technology (NIST) e ampiamente utilizzato nelle implementazioni di crittografia dei dati per applicazioni commerciali e militari. Uno schema di crittografia BIP0038 accetta come input una chiave privata bitcoin, solitamente codificata in WIF, come una stringa Base58Check con un prefisso “5” (per le chiavi pubbliche non compresse, mentre da anni si utilizzano chiavi pubbliche compresse, indicate da chiavi private che iniziano con “L” o “K”). Inoltre, lo schema di crittografia BIP 38 accetta una passphrase, una lunga password, in genere composta da più parole o da una stringa complessa di caratteri alfanumerici. Il risultato dello schema di crittografia BIP 38 è una chiave privata crittografata con codifica Base58Check che inizia con il prefisso 6P.

Pay-to-Script Hash (P2SH) e indirizzi Multisig. Gli indirizzi di Bitcoin che iniziano con il numero 3 sono indirizzi pay-to-script hash (BIP 16). Definiscono il destinatario di una transazione bitcoin come hash di uno script, invece del proprietario di una chiave pubblica. A differenza delle transazioni che destinano fondi ai tradizionali indirizzi bitcoin 1 (hash pay-to-public-key o P2PKH), i fondi inviati agli indirizzi 3 richiedono più della presentazione di un hash della chiave pubblica e della firma con chiave privata come prova di proprietà. I requisiti sono definiti al momento della creazione dell’indirizzo, all’interno dello script, e tutti gli input a questo indirizzo saranno “ingombrati” con gli stessi requisiti. Un indirizzo pay-to-script hash viene creato da uno script di transazione (che definisce chi può spendere l’UTXO). La codifica di un indirizzo P2SH avviene tramite la medesima funzione double-hash utilizzata durante la creazione di un indirizzo bitcoin, applicata solo sullo script anziché sulla chiave pubblica: script hash = RIPEMD160 (SHA256 (script))

Lo script hash risultante è codificato con Base58Check col prefisso di versione 5, ottenendo come risultante un indirizzo codificato che inizia con 3. Un esempio di indirizzo P2SH è 32M8ednmuyZ2zVbes4puqe44NZumgG92sM

L’implementazione più comune della funzione P2SH è l’indirizzo di script multi-sig (multi-firma). Lo script richiede più di una firma per dimostrare la proprietà (ergo spendere l’UTXO). La funzionalità multi-sig Bitcoin è pensata per richiedere le firme M (anche note come “soglia”) da un totale di N chiavi, noto come M-on-N multi-sig, dove M è uguale o minore di N.

Indirizzi Vanity

Si tratta di indirizzi Bitcoin customizzati per essere leggibili dall’uomo, come ad esempio 1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 che contiene le lettere che formano la parola “Love” come le prime quattro lettere Base-58. Creare un indirizzo vanity richiede il test di miliardi di chiavi private finché l’indirizzo risultante non ha le caratteristiche desiderate. Il processo è mera ripetizione (brute-force): si seleziona una chiave privata a caso, si deriva la pubblica, si deriva l’indirizzo e si controlla se il risultato soddisfa le condizioni. Come qualsiasi altro indirizzo, un vanity dipende dalla stessa Elliptic Curve Cryptography (ECC) e Secure Hash Algorithm (SHA).

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).
RELATED ARTICLES

MOST POPULARS

GoldBrick