A Bitcoin létrehozása – Hashelés

Az alábbi cikk egy fejezet Yan Pritzker – A Bitcoin létrehozása című könyvének magyar fordításából. A tartalomjegyzéket és az ingyen letölthető változatot ide kattintva éred el.

***

Hashelés

A Bitcoin aszimmetrikus Proof of Work kirakósa az úgynevezett hash funkció segítségével működik. Matematikórán megtanultuk, hogy a funkció az egy valamilyen folyamat, amely során x inputból f(x) output lesz. Például ha ez a funkció az f(x)=2x, akkor tudjuk, hogy ez egyszerűen megduplázza az x értékét. Ha az x-re azt mondjuk, hogy 2, akkor az f(x) 4-gyel lesz egyenlő.

A hash funkció azt csinálja, hogy az inputból, betűkből, számokból, vagy bármilyen más adatból, például a „Hello world” kifejezésből egy hosszú, véletlenszerűnek tűnő számot generál, amely így néz ki:

869913660443924676617831651669733090238

07181648024718778313526389892860994842

Az a hash funkció, amellyel ezt a számot létrehoztuk, az úgynevezett sha256 algoritmus, és ezt használja a Bitcoin is.

Adat megy be, egy hosszú, megjósolhatatlan szám jön ki.

Az sha256 hash funkció rendelkezik néhány kifejezetten hasznos tulajdonsággal:

  • Az output determinisztikus, azaz előre meghatározott. Ugyanabból az inputból mindig ugyanaz az output származik.
  • Az output nem megjósolható. Egyetlen betű cseréje, de akár egy szóköz hozzáadása is jelentősen megváltoztatja az outputot, egyszerűen nem fedezhető fel a kapcsolat az eredeti inputtal.
  • Bármekkora méretű inputból gyorsan lehet hashelni.
  • Nem lehetséges, hogy két különböző bemenetből egyforma output jöjjön.
  • Az output birtokában sem lehet visszafejteni, hogy mi volt az eredeti input. Ezt egyirányú hash funkciónak is nevezik.
  • Az output mérete meghatározott, az sha256 esetén 256 bit.

Mi a helyzet a bitekkel?

Az általunk, emberek által használt számrendszer a tizes, mivel a 0 és 9 közötti skála tíz számjegyet tartalmaz. A számítógépek viszont nem ezt a számrendszert használják, hanem azt, ahol csak egyesek és nullák vannak. Ezek szimbolizálják az elektromos impulzus állapotát, amely vagy van, vagy nincs. Ezt a rendszert binárisnak nevezzük.

A tizes számrendszerben tíz darab számjeggyel írjuk le az összes számot. Ha egyetlen számjegyet használunk, az 10 különböző változat lehet. Ha két számjeggyel dolgozunk, akkor már 10 x 10, tehát 100 különböző szám jöhet létre, 0-tól 99-ig. Három számjegy esetén pedig 10 x 10 x 10, tehát ezer lehetséges szám létezik.

Ebből már látható, hogy ez hogyan folytatódhat. Ha arra vagyunk kíváncsiak, hogy mekkora számot tudunk „N” darab számjeggyel leírni, egyszerűen csak annyiszor összeszorozzuk a tizet, amennyi az N értéke. Azaz 10 az N-ediken, tehát 10N.

A bináris rendszer ugyanígy működik. Az egyetlen különbség az, hogy kevesebb számjeggyel dolgozhatunk. A tizes számrendszerben 10 szám áll rendelkezésünkre, de a bináris esetén csak kettőből választhatunk, az 1-es és a nulla közül.

Ha azt mondjuk, hogy 1 bit, akkor annak az értéke kétféle lehet, 0 vagy 1. Ha 2 bitről beszélünk, akkor 2 x 2, tehát négy különöző számot hozhatunk létre: 00, 01, 10, 11. Ezt a sort tovább folytathatjuk, ha mindig megszorozzuk kettővel, hiszen a bit értéke csak kétféle lehet.

Három bit már 2 x 2 x 2, azaz 23, tehát összesen 8 féle különböző szám lehet, mégpedig a 000, 001, 010, 011, 100, 101, 110, és a 111.

Egy N számjegyből álló bináris szám olyan hosszú, amennyi az N értéke, és úgy tudjuk kiszámolni, hogy 2N. Ha tehát megnézzük, az sha256 hash funkciója 256 bites, tehát a szám, amelyet generál, 2256 féle lehet. Ez egy elképzelhetetlenül nagy szám, egészen pontosan 78 számjegy hosszúságú a tizes számrendszerben. Több, mint amennyi atom létezik az ismert univerzumban. Így néz ki:

2256 = 115.792.089.237.316.195.423.570.985.008.687.907.853.

269.984.665.640.564.039.457.584.007.913.129.639.936

Ha bármilyen inputból az sha256 segítségével szeretnél hashelni, ennyi féle lehetséges output származhat belőle. Ezért mondjuk, hogy gyakorlatilag megjósolhatatlan a kimenetele. Nincs rá mód, hogy előre megmondjuk, adott inputból milyen output fog származni. Ez azzal lenne egyenlő, ha előre pontosan megmondanánk, hogy 256 érmefeldobásból milyen sorrendben lesz fej vagy írás, és melyik hányszor fog bekövetkezni.

Ezt a számot nem fogjuk még egyszer leírni, csak a 2256 formájában hivatkozunk majd rá, de remélhetőleg segített elképzelni, hogy valójában mennyi is a lehetséges kimenetelek száma.

Hasheljünk valamit!

Próbáljuk ki egy konkrét példán, hogy hogyan is néz ki ez a gyakorlatban! Itt a könyvben hagyományos, tizes számrendszerbeli számként írjuk le, de természetesen a számítógépek binárisként számolják és kezelik ezeket.

A lényeg, hogy bemutassuk, egyetlen apró változtatás mekkora eltéréshez vezet az output esetén. Azonnal láthatod, hogy tényleg nem lehet megjósolni, kikövetkeztetni a kimenetet, bármennyire is hasonló a bemenet:

“Hello world!”

869913660443924676617831651669733090238

07181648024718778313526389892860994842

“Hello world!!”

849402277206958989554476271088404243643

90283616735576803008868844073193772558

Egyértelmű, hogy mindössze egyetlen felkiáltójel különbség a két input között teljesen más outputhoz vezet.

Egyszerűen nincsen rá mód, még számítógép segítségével sem, hogy a kimenetként kapott véletlenszerű szám visszafejtésével meghatározhassuk, hogy mi volt az input. Ha te magad is kísérleteznél, játszanál egy kicsit az sha256 képességeivel, egy jelszógenerátorral kedvedre próbálgathatod az alábbi oldalon:

https://passwordsgenerator.net/sha256-hash-generator

1 thought on “A Bitcoin létrehozása – Hashelés

Comments are closed.