Hašovací strom , Merkle strom , se nazývá úplný binární strom , v jehož listových vrcholech jsou umístěny hashe z datových bloků a vnitřní vrcholy obsahují hashe z přidávání hodnot v podřízených vrcholech. Kořenový uzel stromu obsahuje hash celé datové sady, tj. hashovací strom je jednosměrná hashovací funkce. Strom Merkle se používá pro efektivní ukládání transakcí v blockchainu kryptoměn (například v bitcoinech , ethereu ). Umožňuje získat „otisk“ všech transakcí v bloku a také efektivně ověřovat transakce [1] .
Vyplnění hodnot v uzlech stromu jde zdola nahoru. Nejprve se na každý blok dat použije hašování a tak dále. Výsledné hodnoty se zapisují do listů stromu. Bloky o jednu úroveň výše jsou vyplněny jako hash součtu jejich potomků , kde obvykle znamená zřetězení . Tato operace se opakuje, dokud není získána nejvyšší hodnota - nebo [1] . merkle_root
Bitcoin používá jako svou hashovací funkci double SHA-256 , tedy [1] . Hašovací funkcí však může být cokoliv, například Tiger Tree Hash (TTH), používaný v sítích pro sdílení souborů p2p , je Merkle strom s tigerovou hašovací funkcí [2] .
Pokud se ukáže, že počet bloků na některé úrovni stromu je lichý, pak je jeden blok duplikován [1] nebo přenesen beze změny na další úroveň, jako se to stává při výpočtu hash Tiger Tree [2] .
Hašovací stromy mají výhodu oproti hašovacím řetězcům nebo hašovacím funkcím. Při použití hash stromů je mnohem méně nákladné prokázat, že určitý datový blok patří do sady. Vzhledem k tomu, že různé bloky jsou často nezávislá data, jako jsou transakce nebo části souborů, zajímá nás možnost kontrolovat pouze jeden blok bez přepočítávání hashů pro ostatní uzly stromu. Nechť je blok, který nás zajímá, tento (viz obr.). Pak důkazem jeho existence a platnosti bude root hash, stejně jako top hashe dalších větví ( a ) [1] [3] . V tomto případě se kontrola nezdaří, pokud .
Obecně se dá psát
,
a zkontrolovat jak , kde
.
Sada bloků se nazývá autentizační cesta nebo Merkleova cesta [1] .
Je vidět, že výše uvedenou kontrolu lze provádět v krocích, kde je výška stromu nebo délka autentizační cesty a počet datových bloků. Stejná kontrola v případě hash řetězce by byla složitá [1] [4] .
Níže uvedená tabulka ukazuje, že i při značném počtu transakcí v bloku se nemusíte obávat složitosti výpočtů [1] .
Počet transakcí | Přibližná velikost bloku | Velikost cesty (v hash) | Velikost cesty (v bajtech) |
---|---|---|---|
16 transakcí | 4 kilobajty | 4 hashe | 128 bajtů |
512 transakcí | 128 kilobajtů | 9 hashů | 288 bajtů |
2048 transakcí | 512 kilobajtů | 11 hashů | 352 bajtů |
65535 transakcí | 16 megabajtů | 16 hashů | 512 bajtů |
Bitcoinový blok ukládá pouze hodnotu merkle_rootsvých transakcí. To vám umožní získat určité výhody a snížit zatížení sítě.
Po nashromáždění dostatečného počtu bloků lze staré transakce smazat, aby se ušetřilo místo. Samotný blok přitom zůstává nezměněn, protože ukládá pouze merkle_root. Blok bez transakcí zabere 80 B, tedy 4,2 MB za rok (při generování bloku každých 10 minut) [5] .
Je možné zjednodušené ověření platby . Uzel SPV nestahuje celý blok, ale pouze hlavičku bloku. Pro transakci, která ho zajímá, si také vyžádá její autentizační cestu. Stáhne tedy pouze několik kilobajtů, přičemž celková velikost bloku může být více než 10 megabajtů (viz tabulka) [1] . Použití této metody však vyžaduje, aby uživatel důvěřoval hostiteli, ze kterého se bude dotazovat na hlavičky bloků. Jedním ze způsobů, jak se vyhnout útoku, tedy nahrazení uzlu bezohlednou stranou, je posílat výstrahy po celé síti, když je detekována chyba v bloku, což uživatele donutí stáhnout celý blok [5] .
Provoz tzv. „tenkých“ bitcoinových klientů [6] [7] je založen na zjednodušeném ověřování plateb .
Strom Merkle má i nevýhody, které se projevují rostoucím počtem listů. Jak bylo uvedeno výše, pro výpočet podpisu libovolného bloku potřebujete znát všechny hodnoty ze sady . To není problém, pokud je možné uložit všechny vnitřní uzly stromu do paměti, ale pro velké stromy (počet listů se může zvýšit až na ) to není vhodné. Je také možné pokaždé přepočítat vnitřní bloky, což ale výrazně zpomalí výkon takového systému. Proto vyvstává problém efektivního procházení stromů a generování signatur ( Merkle tree traversal problem ) [4] . K dnešnímu dni existují řešení, která využívají čas a paměť, kde je počet listů. Bylo také prokázáno, že neexistuje žádný algoritmus procházení, který by byl lepší v čase i paměti [8] .
Hashovací funkce | |
---|---|
obecný účel | |
Kryptografický | |
Funkce generování klíčů | |
Kontrolní číslo ( srovnání ) | |
Hashe |
|
Strom (datová struktura) | |
---|---|
Binární stromy | |
Samovyrovnávací binární stromy |
|
B-stromy |
|
předponové stromy |
|
Binární dělení prostoru | |
Nebinární stromy |
|
Rozbití prostoru |
|
Jiné stromy |
|
Algoritmy |
|