Hajapuuta eli Merkle - puuta kutsutaan täydelliseksi binääripuuksi , jonka lehtipisteisiin sijoitetaan tietolohkojen tiivisteet ja sisäiset kärjet sisältävät hajautusarvoja alipisteissä olevien arvojen lisäämisestä . Puun juurisolmu sisältää koko tietojoukon tiivisteen, eli tiivistepuu on yksisuuntainen hajautusfunktio. Merkle-puuta käytetään transaktioiden tehokkaaseen tallentamiseen kryptovaluuttojen lohkoketjussa (esimerkiksi Bitcoinissa , Ethereumissa ). Sen avulla voit saada "sormenjäljen" kaikista lohkon tapahtumista sekä tarkistaa tapahtumat tehokkaasti [1] .
Puun solmujen arvojen täyttö tapahtuu alhaalta ylös. Ensinnäkin jokaiseen tietolohkoon sovelletaan tiivistystä ja niin edelleen. Tuloksena saadut arvot kirjoitetaan puun lehtiin. Yhden tason ylemmät lohkot täytetään tiivisteinä niiden lasten summasta, mikä tarkoittaa yleensä ketjuttamista . Tätä toimenpidettä toistetaan, kunnes saavutetaan suurin arvo - tai [1] . merkle_root
Bitcoin käyttää kaksois -SHA-256 :ta hash-funktionaan , eli [1] . Hash-funktio voi kuitenkin olla mikä tahansa, esimerkiksi p2p-tiedostonjakoverkoissa käytetty Tiger Tree Hash (TTH) on Merkle-puu, jossa on Tiger hash -funktio [2] .
Jos lohkojen määrä jollain puun tasolla osoittautuu parittomaksi, niin yksi lohko monistetaan [1] tai siirretään muuttumattomana seuraavalle tasolle, kuten tapahtuu Tiger Tree Hash -arvoa laskettaessa [2] .
Hash-puilla on etu hash-ketjuihin tai hash-funktioihin verrattuna. Hash-puita käytettäessä on paljon halvempaa todistaa, että tietty tietolohko kuuluu joukkoon. Koska eri lohkot ovat usein itsenäisiä tietoja, kuten tapahtumia tai tiedostojen osia, olemme kiinnostuneita mahdollisuudesta tarkistaa vain yksi lohko laskematta uudelleen hajautusarvoja muille puusolmuille. Olkoon meitä kiinnostava lohko tämä (katso kuva). Silloin todiste sen olemassaolosta ja pätevyydestä on juurihaja, samoin kuin muiden haarojen ylimmät tiivisteet ( ja ) [1] [3] . Tässä tapauksessa tarkistus epäonnistuu, jos .
Yleensä voi kirjoittaa
,
ja tarkista miten , missä
.
Lohkojen joukkoa kutsutaan autentikointipoluksi tai Merkle-poluksi [1] .
Voidaan nähdä, että yllä oleva tarkistus voidaan suorittaa vaiheittain, missä on puun korkeus tai todennuspolun pituus ja tietolohkojen lukumäärä. Sama tarkistus hash-ketjun tapauksessa olisi monimutkainen [1] [4] .
Alla oleva taulukko osoittaa, että vaikka lohkossa olisi huomattava määrä tapahtumia, sinun ei tarvitse huolehtia laskelmien monimutkaisuudesta [1] .
Tapahtumien määrä | Arvioitu lohkon koko | Polun koko (tiivisteinä) | Polun koko (tavuina) |
---|---|---|---|
16 tapahtumaa | 4 kilotavua | 4 tiivistettä | 128 tavua |
512 tapahtumaa | 128 kilotavua | 9 tiivistettä | 288 tavua |
2048 tapahtumaa | 512 kilotavua | 11 tiivistettä | 352 tavua |
65535 tapahtumaa | 16 megatavua | 16 tiivistettä | 512 tavua |
Bitcoin-lohko tallentaa vain merkle_roottapahtumiensa arvon. Näin voit saada tiettyjä etuja ja vähentää verkon kuormitusta.
Kun riittävä määrä lohkoja on kertynyt, vanhat tapahtumat voidaan poistaa tilan säästämiseksi. Samanaikaisesti itse lohko pysyy muuttumattomana, koska se tallentaa vain merkle_root. Lohko ilman tapahtumia vie 80 B tai 4,2 Mt vuodessa (kun lohko luodaan 10 minuutin välein) [5] .
Yksinkertainen maksun vahvistus tulee mahdolliseksi . SPV-solmu ei lataa koko lohkoa, vaan vain lohkootsikon. Häntä kiinnostavaa tapahtumaa varten hän pyytää myös sen todennuspolkua. Siten se lataa vain muutaman kilotavun, kun taas lohkon kokonaiskoko voi olla yli 10 megatavua (katso taulukko) [1] . Tämän menetelmän käyttäminen edellyttää kuitenkin, että käyttäjä luottaa isäntään, josta hän pyytää lohkootsikoita. Eräs tapa välttää hyökkäys eli solmun korvaaminen häikäilemättömän osapuolen toimesta on lähettää hälytyksiä koko verkkoon, kun lohkossa havaitaan virhe, jolloin käyttäjän on ladattava koko lohko [5] .
Niin kutsuttujen "ohuiden" bitcoin-asiakkaiden [6] [7] toiminta perustuu yksinkertaistettuun maksun varmentamiseen .
Merkle-puulla on myös haittoja, jotka ilmenevät kasvavalla lehtimäärällä. Kuten aiemmin näytettiin, mielivaltaisen lohkon allekirjoituksen laskemiseksi sinun on tiedettävä kaikki joukon arvot . Tämä ei ole ongelma, jos on mahdollista tallentaa kaikki puun sisäiset solmut muistiin, mutta suurille puille (lehtien lukumäärä voi kasvaa jopa ) tämä ei sovellu. On myös mahdollista laskea sisäiset lohkot uudelleen joka kerta, mutta tämä hidastaa merkittävästi tällaisen järjestelmän suorituskykyä. Tästä syystä puun tehokkaan läpikäynnin ja allekirjoituksen luomisen ongelma syntyy ( Merkle tree traversal problem ) [4] . Tähän mennessä on olemassa aikaa ja muistia käyttäviä ratkaisuja, missä on lehtien määrä. On myös todistettu, ettei ole olemassa ajallisesti ja muistissa parempaa läpikulkualgoritmia [8] .
Hash-funktiot | |
---|---|
yleinen tarkoitus | |
Kryptografinen | |
Avainten luontitoiminnot | |
Tarkista numero ( vertailu ) | |
Hashes |
|
Puu (tietorakenne) | |
---|---|
Binääripuut | |
Itsetasapainottavat binaaripuut |
|
B-puut | |
etuliite puita |
|
Avaruuden binaarinen osiointi | |
Ei-binääripuut |
|
Avaruuden hajottaminen |
|
Muut puut |
|
Algoritmit |