Il termine "funzione hash" deriva dalla parola francese "hacher" che significa "sminuzzare", perché una funzione hash è progettata per "tagliare in piccoli pezzi" i dati. Un altro tipo di struttura di dati, una tabella di hash, è spesso utilizzata per individuare rapidamente due hash identici (valori di hash).
Da quando Diffie e Hellman hanno identificato per la prima volta la necessità di una funzione hash unidirezionale nel loro famoso articolo del 1976 sulla crittografia a chiave pubblica, gli sviluppi della crittografia sono progrediti rapidamente nei due decenni successivi . Nel 1990, il crittografo e professore del MIT, Ronald Rivest, ha inventato la funzione hash MD4 e successivamente le funzioni MD5 e MD6. Nel 1995, la NSA (National Security Agency) ha progettato lo SHA-1 (Secure Hash Algorithm 1) basato sul progetto di Rivest, seguito dall'aggiornamento SHA-2 nel 2001. SHA-2 è lo standard che ha ispirato SHA-256, che è servito come base per l'algoritmo di consenso di Bitcoin.
Lo scopo delle funzioni hash
Le funzioni hash sono nate sia dalla necessità di rendere il contenuto uniforme in lunghezza sia per essere usate come identificatori unici. Gli usi tipici delle funzioni hash al di fuori della sfera delle criptovalute includono:
Proprietà delle funzioni hash
Una funzione hash crittografica dovrebbe essere computazionalmente efficiente, nel senso che deve essere veloce nelle prestazioni per creare il valore di hash. Deve essere univoca, cioè ogni volta che si inserisce un certo input, deve produrre lo stesso output e deve essere resistente alla preimmagine, cioè non può rivelare alcuna informazione sull'input nell'output.
Infine, una funzione hash deve essere resistente alle collisioni, proprietà che assicura sia impossibile che due input diversi producano lo stesso output. Univocità, resistenza alla preimmagine e alla collisione sono le tre proprietà più importanti delle funzioni hash nel processo di estrazione di Bitcoin.
Una funzione hash deve essere resistente alle collisioni, proprietà che assicura sia impossibile che due input diversi producano lo stesso output.
Funzioni hash nel processo di mining
Ritorniamo per un attimo al processo di convalida nella rete Bitcoin: un blocco è raggruppato e contiene diverse transazioni, così come informazioni sul blocco precedente. Questo significa che se qualcuno volesse cambiare il libro mastro o raddoppiare una transazione, dovrebbe cambiare l'hash in tutti i blocchi precedenti.
Per aggiungere il blocco raggruppato alla blockchain, i miner devono trovare un hash che soddisfi l'obiettivo di difficoltà. Ogni blocco contiene un blockheader con il numero del blocco, l'hash del blocco precedente e un "nonce", che include una marca temporale. Lo scopo di un nonce è variare l'input di una funzione hash crittografica, cosa che aumenta la casualità, nel calcolo durante il processo di mining.
Risolvere l'hash
Il nodo inizia quindi a eseguire l'hashing dei dati convertendoli nel valore di hash, o semplicemente "hash", che deve sempre contenere un certo numero di zeri. Il nodo controlla se un hash soddisfa i criteri di difficoltà. L'hash deve iniziare con la giusta quantità di zeri. Se l'hash soddisfa i criteri di difficoltà, viene trasmesso agli altri miner della rete. Il primo miner che trova un hash valido convalida il blocco in un nuovo blocco e viene premiato con la ricompensa di blocco e con delle commissioni in Bitcoin.
Se l'hash non soddisfa i criteri di difficoltà della rete, un altro nonce viene selezionato e sottoposto ad hash. I miner di solito devono generare molti hash con diversi nonce finché non trovano un nonce che soddisfa la difficoltà. Questo è il processo ripetitivo e ad alto consumo energetico conosciuto come mining di Bitcoin, che richiede una grande potenza di calcolo.
Le funzioni hash costituiscono la colonna portante del processo di Proof of Work. Senza la conferma e la produzione di transazioni hash, la blockchain non sarebbe né a prova di manomissione né inalterabile, e non sarebbe possibile dimostrare chi possiede quale quantità di Bitcoin in quale momento.