Dacă te interesează moneda bitcoin, atunci ai auzit probabil de funcțiile de hash criptografice. În rândurile care urmează, vom explica ce înseamnă asta și cum se leagă de cirptomonedă.
Funcțiile hash sunt o parte esențială din protocolul bitcoin și în general în securitatea informației.
Cum funcționează funcțiile hash
O funcție hash este un proces matematic care preia date input de orice dimensiuni, execută operațiuni asupra acestora și returnează date output de o dimensiune fixă.
Ca exemplu concret, acest lucru se poate folosi pentru a lua un șir de litere de orice dimensiune ca input – ceea ce numim string – și să returnăm o succesiune de litere de o dimensiune fixă.
Oricare ar fi șirul de litere, fie că este vorba despre o singură literă, un cuvânt, o propoziție sau un întreg roman, outputul – numit digest – va avea mereu aceeași dimensiune.
De obicei astfel de funcții hash sunt folosite pentru a stoca parole.
Când îți faci un cont de utilizator online ți se cere să creezi o parolă. Parola trece printr-o funcție de hash. Serviciul pe care îl folosești nu stochează parola ta ci doar funcția hash. Când introduci parola să te înregistrezi, acesta trece prin funcția hash iar serverul verifică dacă rezultatul este identic cu digest-ul stocat.
Asta înseamnă că dacă un hacker reușește să acceseze baz de date care conține hash-urile stocate, nu va reuși să compromită toate conturile de utilizator pentru că nu există o formulă ușoară de a găsi parola care produce un anumit hash.
Funcții hash simple în Python
Poți experimenta cu valori hash folosind limbajul de programare Python. Python este instalat implicit pe Mac sau Linux. Instalarea și folosirea pe Windows este mai complicată. Tutorialul vizează deci sistemele de operare OS X sau Linux.
Întâi deschide un terminal, scrie python și apasă ENTER.
Vei ajunge în Python REPL, un mediu în care poți încerca direct comenzile Python, în loc să le scrii într-un fișier separat.
Apoi scrie următoarele informații. Apasă ENTER după fiecare rând și TAB unde este cazul.
import hashlib
def hash(mystring):
[TAB] hash_object = hashlib.md5(mystring.encode())
[TAB] print(hash_object.hexdigest())
[ENTER]
Ai creat o funcție hash(), care va calcula și scoate valoarea hash pentru orice șir de caractere, folosind algoritmul MD5. Acum poți deja să pui funcția de hash la treabă. Pune un șir de caractere între paranteze, în ghilimele.
Ex – hash(”GoanaDupăBitcoin”).
Apasă ENTER pentru a vedea digest-ul.
Vei vedea că de fiecare dată când introduci același șir de caractere, ți se va genera același ahsh. Dacă însă adaugi sau schimbi un caracter, ți se generează un hash complet diferit.
hash(”GoanaDupăBitcoin”) = 43DD55731C00F7BC32A109BAC064A3E47CCD5E8D
hash(”Goanadupabitcoin”) = F865A2FF240A40B5073FD521E31A7A9A32DFA63C
Funcțiile hash ale bitcoinului
În protocolul bitcoin, funcțiile de hash sunt parte din algoritmul de hashing al blockcului. Acesta e folosit pentru a scrie noi tranzacții în blockchain prin procesul de minare.
La minarea bitcoin, inputul pentru funcție reprezintă toate tranzacțiile cele mai recente, încă neconfirmate (împreună cu input suplimentar legat de timbrul de timp și o referință la blockul anterior)
În exemplul de mai sus, am văzut deja că dacă se schimbă o mică parte din input, rezultatul funcției hash digest-ul, este complet diferit. Această proprietate este foarte importantă pentru algoritmul de ”dovadă de lucru” care ține de minare.
Pentru a ”rezolva” un block, minerii încearcă să combine toate inputurile cu propriul input, în așa fel încât hash-ul rezultat să conțină un anumit număr de zerouri.
Ca demonstrație, putem să încercăm să ”minăm” cu funcția de hash Python, adăugând litere la sfârșitul frazei, până când găsim un hash care să înceapă cu un singur zero.
hash(GoanadupabitcoinA)
64D2B6DCDB86DAEEC1A258EEF78D9389C91DD73D
hash(GoanadupabitcoinB)
B35575AC5BC44DE6AE06EB5059202441186A6B5C
hash(GoanadupabitcoinC)
43AD074F2C415A89ABFB7A5DA6FF1C94138F329A
hash(GoanadupabitcoinD)
57699F08F4011E81B98A91CC4BD01588FD4D938A
hash(GoanadupabitcoinE)
0848FE80BE4622C58E0613C5C2A2D14ECBC5D179 –– REZOLVAT!
Desigur, rezolvarea hash-ului pentru un block bitcoin – care la momentul scrierii trebuie să înceapă cu 18 zerouri – cere o putere de procesare extrem de mare. Așadar, puterea de procesare combinată a tuturor calculatoarelor din rețea are nevoie de aproximativ 10 minute pentru a rezolva un block.
Nevoia de putere mare de procesare presupune că bitcoinii noi sunt minați pe o perioadă lungă de timp, nu toți odată .
Pentru a obține bitcoin prin minare, trebuie să depui mai multă muncă pentru a rezolva un block. Câștigând recompensa, stochezi toate tranzacțiile noi într-un block, care este adăugat într-un registru permanent, după toate tranzacțiile precedente de pe blockchain.