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.