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 conversationMég nincsen hozzászólás!
Szólj hozzá elsőként.