Mario invia 5BTC (Bitcoin) a Giulia - la premessa è che entrambi sono possessori di un portafogli BTC con chiave pubblica, e ognuno di loro conservi con attenzione la relativa chiave privata. La transazione specifica avrà un proprio codice hash, e sarà inserita in un blocco che ne avrà uno a sua volta (root Merkle).
Iniziamo a guardare come si forma il Merckle Tree (l'albero), date le transazioni a e b e la funzione dhash(X) = sha256(sha256(X)) ossia un doppio SHA256, ecco cosa accade:
d1 = dhash(a)
d2 = dhash(b)
d3 = dhash(d1 concat d2)
d3 rappresenta il Merckle root, ossia la radice hash derivante dal calcolo degli hash delle transazioni (foglie) concatenate tra loro:
Foglia 1: Mario -> 5BTC -> Giulia - hash:
61BE55A8E2F6B4E172338BDDF184D6DBEE29C98853E0A0485ECEE7F27B9AF0B4
Foglia 2: Nino -> 2BTC -> Pippo - hash:
81CC5B17018674B401B42F35BA07BB79E211239C23BFFE658DA1577E3E646877
Radice: Merckle root:
SHA256(SHA256(61BE55A8E2F6B4E172338BDDF184D6DBEE29C98853E0A0485ECEE7F27B9AF0B481CC5B17018674B401B42F35BA07BB79E211239C23BFFE658DA1577E3E646877))=498FFB548E914EF994EBD305462EE00ABBD23FD598A454E21DCFD1E57505EECA
Vediamo com'è composto un block header, nella tabella che segue:
Campo | Descrizione | Aggiornato quando.. | Dimensione(Bytes) |
---|---|---|---|
Versione | Block version number | ... si aggiorna il software e specifica la nuova versione. | 4 |
hashPrevBlock | Hash a 256 bit dell'header del blocco precedente | ... arriva un nuovo blocco | 32 |
hashMerkleRoot | Hash a 256 bit basato su tutte le transazioni del blocco | ... una transazione è accettata | 32 |
Time | Timestamp al secondo, partendo da 1970-01-01T00:00 UTC | ... a intervalli di qualche secondo | 4 |
Bits | Target in format compatto | ... cambia la difficoltà | 4 |
Nonce | Numero a 32 bit (inizia da 0) | Si prova un hash (incrementale) | 4 |
Tratto da: https://en.Bitcoin.it/wiki/Block_hashing_algorithm
Il blocco contiene molte informazioni quindi: le transazioni, l'hash del blocco precedente già verificato, il Merckle root, il timestamp (data e ora) in Epoch Unix Time, il campo Bits che rappresenta la difficoltà che la rete ha calcolato ed il Nonce - un numero incrementale che servirà a calcolare l'hash di tutto al fine di raggiungere la verifica del blocco.
Le Radeon sono indicate per il mining
Sembra complicato e infatti lo è, ma cerchiamo di semplificare al massimo.
Ogni 10 minuti un gruppo di transazioni viene raccolto in un blocco; ognuna ha un proprio codice hash, che serve ai minatori per verificare le singole transazioni. Il minatore può verificarle tutte insieme calcolando l'hash dell'intero blocco, perché non si può alterare. I blocchi infatti formano una catena e l'header di ciascuno contiene il Merckle root hash, che è l'hash complessivo di tutte le transazioni contenute all'interno.
Inoltre proprio perché i blocchi formano una catena, e perché nell'intestazione di ognuno c'è anche l'hash del blocco precedente, se si tentasse di alterare un blocco l'hash cambierebbe e il sistema se ne accorgerebbe subito.