A hash-fát , a Merkle - fát teljes bináris fának nevezzük , amelynek levélcsúcsaiban az adatblokkokból származó hash -ek, a belső csúcsok pedig a gyermekcsúcsokban hozzáadott értékekből származó hash-eket tartalmaznak. A fa gyökércsomópontja a teljes adathalmaz hash-ét tartalmazza, azaz a hash fa egy egyirányú hash függvény. A Merkle-fát a tranzakciók hatékony tárolására használják a kriptovaluták blokkláncában (például Bitcoinban , Ethereumban ). Lehetővé teszi, hogy "ujjlenyomatot" kapjon a blokkban lévő összes tranzakcióról, valamint hatékonyan ellenőrizze a tranzakciókat [1] .
Az értékek kitöltése a fa csomópontjaiban alulról felfelé halad. Először is a rendszer minden adatblokkra kivonatolást alkalmaz , és így tovább. A kapott értékeket a fa leveleire írják. Az egy szinttel feljebb lévő blokkok a gyermekeik összegének hash-jeként vannak kitöltve , ahol általában összefűzést jelent . Ezt a műveletet addig ismételjük, amíg el nem érjük a felső értéket - vagy [1] . merkle_root
A Bitcoin kettős SHA-256- ot használ hash függvényként , azaz [1] . A hash függvény azonban bármi lehet, például a p2p fájlmegosztó hálózatokban használt Tiger Tree Hash (TTH) egy Merkle-fa Tiger hash funkcióval [2] .
Ha a blokkok száma a fa valamely szintjén páratlannak bizonyul, akkor az egyik blokk megkettőződik [1] , vagy változatlanul átkerül a következő szintre, ahogy az a Tiger Tree Hash [2] kiszámításakor történik .
A hash fák előnyt élveznek a hash láncokkal vagy a hash függvényekkel szemben. Hash-fák használatakor sokkal olcsóbb annak bizonyítása, hogy egy adott adatblokk a halmazhoz tartozik. Mivel a különböző blokkok gyakran független adatok, például tranzakciók vagy fájlok részei, érdekel bennünket, hogy csak egy blokkot ellenőrizzünk anélkül, hogy a többi fa csomópontjához újra kellene számítani a hash-eket. Legyen ez a minket érdeklő blokk (lásd ábra). Ekkor létezésének és érvényességének bizonyítéka a gyökérkivonat, valamint más ágak felső hash-ei ( és ) [1] [3] . Ebben az esetben az ellenőrzés sikertelen, ha .
Általában lehet írni
,
és ellenőrizze, hogyan , hol
.
A blokkok halmazát hitelesítési útvonalnak vagy Merkle útvonalnak [1] nevezzük .
Látható, hogy a fenti ellenőrzés lépésenként hajtható végre, ahol a fa magassága vagy a hitelesítési út hossza, illetve az adatblokkok száma. Ugyanez az ellenőrzés egy hash lánc esetén bonyolult lenne [1] [4] .
Az alábbi táblázat bemutatja, hogy még jelentős számú tranzakció esetén sem kell aggódnia a számítások bonyolultsága miatt [1] .
Tranzakciók száma | Hozzávetőleges blokkméret | Útvonal mérete (kivonatokban) | Útvonal mérete (bájtban) |
---|---|---|---|
16 tranzakció | 4 kilobájt | 4 hash | 128 bájt |
512 tranzakció | 128 kilobájt | 9 hash | 288 bájt |
2048 tranzakció | 512 kilobájt | 11 hash | 352 bájt |
65535 tranzakció | 16 megabájt | 16 hash | 512 bájt |
merkle_rootA Bitcoin blokk csak a tranzakcióinak értékét tárolja . Ez lehetővé teszi bizonyos előnyök megszerzését és a hálózat terhelésének csökkentését.
Elegendő számú blokk felhalmozása után a régi tranzakciók helytakarékosság céljából törölhetők. Ugyanakkor maga a blokk változatlan marad, mivel csak a merkle_root. Egy tranzakció nélküli blokk 80 B-t, vagyis 4,2 MB-ot foglal el évente (amikor 10 percenként generálódik egy blokk) [5] .
Lehetővé válik az egyszerűsített fizetési ellenőrzés . Az SPV csomópont nem tölti le a teljes blokkot, hanem csak a blokkfejlécet. Az őt érdeklő tranzakcióhoz annak hitelesítési útvonalát is kéri. Így csak néhány kilobájtot tölt le, miközben a teljes blokkméret több mint 10 megabájt lehet (lásd a táblázatot) [1] . Ennek a módszernek a használata azonban megköveteli, hogy a felhasználó megbízzon abban a gazdagépben, amelyről a blokkfejléceket lekérdezheti. A támadások elkerülésének, vagyis a csomópont gátlástalan fél általi helyettesítésének egyik módja az, hogy riasztásokat küldenek a hálózaton, ha hibát észlel egy blokkban, és arra kényszeríti a felhasználót, hogy töltse le a teljes blokkot [5] .
Az úgynevezett "vékony" bitcoin kliensek [6] [7] működése az egyszerűsített fizetés-ellenőrzésen alapul .
A Merkle-fának vannak hátrányai is, amelyek a levelek növekedésével nyilvánulnak meg. Mint korábban bemutattuk, egy tetszőleges blokk aláírásának kiszámításához ismernie kell a halmaz összes értékét . Ez nem probléma, ha a fa összes belső csomópontját el lehet tárolni a memóriában, de nagy fáknál (a levelek száma akár ig is növekedhet ) ez nem megfelelő. Lehetőség van arra is, hogy minden alkalommal újraszámolják a belső blokkokat, de ez jelentősen lelassítja egy ilyen rendszer teljesítményét. Ezért felmerül a hatékony fa bejárás és aláírás generálás problémája ( Merkle tree traversal problem ) [4] . A mai napig vannak időt és memóriát használó megoldások, hol van a levelek száma. Az is bebizonyosodott, hogy nincs olyan bejárási algoritmus, amely mind időben, mind memóriában jobb lenne [8] .
Hash függvények | |
---|---|
Általános rendeltetésű | |
Kriptográfia | |
Kulcsgenerálási funkciók | |
Csekkszám ( összehasonlítás ) | |
Hashes |
|
Fa (adatstruktúra) | |
---|---|
Bináris fák | |
Önkiegyensúlyozó bináris fák |
|
B-fák | |
előtag fák |
|
A tér bináris particionálása | |
Nem bináris fák |
|
A tér felosztása |
|
Más fák |
|
Algoritmusok |
|