A blokkhashelő algoritmus

Blokkgenerálás során a blokk fejlécét hasheljük folyamatosan újra és újra – és időnként frissítjük is azt, miközben dolgozunk rajta. A blokk fejléce a következő mezőket tartalmazza:

Mező Tartalom Frissül, ha… Méret (bájtban)
Verzió Blokk-verziószám. …a szoftver frissítés után új verziót jelöl meg. 4
Előző hash Az előző blokk hashe. …időközben elkészül egy újabb blokk. 32
Merkle-gyökér Az összes tranzakción alapuló 256 bites hash. …elfogadásra kerül egy tranzakció. 32
Időbélyegző Jelenlegi időbélyegző …néhány másodpercenként 4
“Bitek” A jelenlegi célszám tömör formátumban. …újrabeállításra kerül a nehézség. 4
Nonce 32 bites szám (0-ról indul) egy újabb hashsel próbálkozunk (folyamatosan nő az értéke) 4

A tranzakciókat a blokk teste (body) tartalmazza. Ezeket csak közvetetten, a Merkle-gyökéren keresztül hasheljük. Mivel tehát magukat a tranzakciókat közvetlenül nem hasheljük, ezért egy mindössze egyetlen egy tranzakciót tartalmazó blokk hashelése is pontosan ugyanannyi erőfeszítést és erőforrás-rááldozást igényel, mint egy 10.000 tranzakciót tartalmazó blokké.

E mezők legtöbbje minden felhasználónál teljesen azonos lesz. Apróbb eltérések leginkább az időbélyegzőknél adódhatnak, és persze a nonce-nál, amely jellemzően eltérő értékű lesz az egyes bányászoknál, viszont ennek az értéke mindig szigorúan lineárisan növekszik: 0-ról indul, és minden egyes újabb hash megnöveli. Nonce-túlcsordulás esetén (ami gyakran megesik) az érmegeneráló tranzakció extraNonce részét növeljük tovább, a Merkle-gyökér értékét módosítva ezáltal.

Ha csak ezeket a mezőket vennénk figyelembe, úgy az emberek gyakorta generálnák le pontosan ugyanazokat a hashszekvenciákat, és mindig a legnagyobb számítókapacitással bíró gép nyerne. Valójában azonban (szinte) elképzelhetetlen, hogy két bányásznál is ugyanaz legyen a Merkle-gyökér értéke, mivel a blokkod első tranzakciójában szereplő érmék címzettje mindig a te egyik egyedi Bitcoin-címed. Mivel pedig a blokkod különbözik mindenki más blokkjaitól, ezért (szinte) garantált, hogy mindenki egészen eltérő hasheket fog generálni. Minden egyes újabb kiszámított hashnek pontosan ugyanannyi esélye van a nyerésre, mint a hálózatban éppen kiszámított összes többinek.

A Bitcoin SHA256(SHA256(Block_Header))-t használ, de óvatosnak kell lenned a bájtsorrenddel.

Az itt következő python-kód például a 2011. júniusi állás szerinti legalacsonyabb hashű blokk, az 125552-es hashét számolja ki. A fejléc a fent bemutatott hat mezőből épül fel, hexadecimálisan jelölt, “kicsi a végén” (little endian) értékekbe összesűrítve:

  >>> import hashlib
  >>> header_hex = ("01000000" +
    "81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" +
    "e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" +
    "c7f5d74d" +
    "f2b9441a" +
     "42a14695")
  >>> header_bin = header_hex.decode('hex')
  >>> hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
  >>> hash.encode('hex_codec')
  '1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000'
  >>> hash[::-1].encode('hex_codec')
  '00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d'

Érdemes megfigyelni, hogy az (alapállás szerint, az SHA-256 definíciójában lefektetett “nagy a végén” (big-endian) állandókkal összhangban) 256 bites “nagy a végén” számként értelmezett tényleges hash végén számos nullás bit sorakozik. Ha azonban, ahogyan azt a Bitcoin is teszi, “kicsi a végén” (little-endian) számként értelmezzük, úgy a hash máris egy sor nullával kezdődik, és pl. a Block Explorer által megjelenített adatoknál is ezt láthatjuk.

Itt van még egy további példa, sima C-ben, mindennemű optimalizálás, szálazás (threading) vagy hibaellenőrzés nélkül.

Forrás: Bitcoin Wiki

A lap szövege Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 3.0 licenc alatt áll, felhasználni csak forrásmegjelöléssel, és ide mutató linkkel szabad.

Még nincsen hozzászólás

Jump into a conversation

Még nincsen hozzászólás!

Szólj hozzá elsőként.