Et hash-træ , et Merkle -træ kaldes et komplet binært træ , i hvis bladspidser er placeret hashes fra datablokke, og de interne knudepunkter indeholder hashes fra tilføjelse af værdier i underordnede knudepunkter. Træets rodknude indeholder hashen af hele datasættet, dvs. hash-træet er en envejs hashfunktion. Merkle-træet bruges til effektiv opbevaring af transaktioner i blockchain af kryptovalutaer (for eksempel i Bitcoin , Ethereum ). Det giver dig mulighed for at få et "fingeraftryk" af alle transaktioner i blokken, samt effektivt verificere transaktioner [1] .
Påfyldningen af værdier i træets noder går fra bund til top. Først anvendes hashing på hver datablok , og så videre. De resulterende værdier skrives til træets blade. Blokke et niveau op er udfyldt som hashes af summen af deres børn , hvor det normalt betyder sammenkædning . Denne operation gentages, indtil topværdien er opnået - eller [1] . merkle_root
Bitcoin bruger dobbelt SHA-256 som sin hash-funktion , dvs. [1] . Imidlertid kan hash-funktionen være hvad som helst, for eksempel er Tiger Tree Hash (TTH), der bruges i p2p-fildelingsnetværk , et Merkle-træ med en Tiger - hash-funktion [2] .
Hvis antallet af blokke på et eller andet niveau af træet viser sig at være ulige, så duplikeres en blok [1] eller overføres uændret til det næste niveau, som det sker, når man beregner Tiger Tree Hash [2] .
Hash-træer har en fordel i forhold til hashkæder eller hashfunktioner. Når du bruger hash-træer, er det meget billigere at bevise, at en bestemt datablok tilhører sættet. Da forskellige blokke ofte er uafhængige data, såsom transaktioner eller dele af filer, er vi interesserede i muligheden for kun at kontrollere én blok uden at genberegne hashes for andre træknuder. Lad den blok, vi er interesseret i, være denne (se fig.). Så vil beviset for dets eksistens og gyldighed være root-hashen, såvel som de øverste hashes af andre grene ( og ) [1] [3] . I dette tilfælde mislykkes kontrollen, hvis .
Generelt kan man skrive
,
og tjek hvordan , hvor
.
Sættet af blokke kaldes autentificeringsstien eller Merkle-stien [1] .
Det kan ses, at kontrollen ovenfor kan udføres i trin, hvor er højden af træet eller længden af autentificeringsstien, og er antallet af datablokke. Den samme kontrol i tilfælde af en hashkæde ville have kompleksitet [1] [4] .
Tabellen nedenfor viser, at selv med et betydeligt antal transaktioner i en blok, behøver du ikke bekymre dig om kompleksiteten af beregninger [1] .
Antal transaktioner | Omtrentlig blokstørrelse | Stistørrelse (i hash) | Stistørrelse (i bytes) |
---|---|---|---|
16 transaktioner | 4 kilobyte | 4 hash | 128 bytes |
512 transaktioner | 128 kilobyte | 9 hashes | 288 bytes |
2048 transaktioner | 512 kilobyte | 11 hashes | 352 bytes |
65535 transaktioner | 16 megabyte | 16 hashes | 512 bytes |
En Bitcoin-blok gemmer kun værdien af merkle_rootsine transaktioner. Dette giver dig mulighed for at få visse fordele og reducere belastningen på netværket.
Efter at have akkumuleret et tilstrækkeligt antal blokke, kan gamle transaktioner slettes for at spare plads. Samtidig forbliver selve blokken uændret, da den kun gemmer merkle_root. En blok uden transaktioner fylder 80 B, eller 4,2 MB om året (når en blok genereres hvert 10. minut) [5] .
Forenklet betalingsverifikation bliver mulig . SPV-noden downloader ikke hele blokken, men kun blokhovedet. For transaktionen, der er af interesse for ham, anmoder han også om dens autentificeringssti. Den downloader således kun få kilobyte, mens den samlede blokstørrelse kan være mere end 10 megabyte (se tabel) [1] . Brug af denne metode kræver dog, at brugeren har tillid til værten, hvorfra der kan forespørges efter blokoverskrifter. En måde at undgå et angreb på, det vil sige udskiftning af en node af en skruppelløs part, er at sende advarsler gennem netværket, når der opdages en fejl i en blok, hvilket tvinger brugeren til at downloade hele blokken [5] .
Driften af de såkaldte "tynde" bitcoin-klienter [6] [7] er baseret på forenklet betalingsverifikation .
Merkle-træet har også ulemper, som viser sig med et voksende antal blade. Som vist tidligere, for at beregne signaturen af en vilkårlig blok , skal du kende alle værdierne fra sættet . Dette er ikke et problem, hvis det er muligt at gemme alle træets interne noder i hukommelsen, men for store træer (antallet af blade kan stige op til ) er dette ikke egnet. Det er også muligt at genberegne de interne blokke hver gang, men dette vil sænke ydeevnen af et sådant system betydeligt. Derfor opstår problemet med effektiv trægennemgang og signaturgenerering ( Merkle trægennemløbsproblem ) [4] . Til dato er der løsninger, der bruger tid og hukommelse, hvor er antallet af blade. Det er også blevet bevist, at der ikke findes en traversal-algoritme, der både er bedre i tid og hukommelse [8] .
Hash funktioner | |
---|---|
generelle formål | |
Kryptografisk | |
Nøglegenereringsfunktioner | |
Tjek nummer ( sammenligning ) | |
Hashes |
|
Træ (datastruktur) | |
---|---|
Binære træer | |
Selvbalancerende binære træer |
|
B-træer | |
præfiks træer |
|
Binær opdeling af rummet | |
Ikke-binære træer |
|
At bryde rummet op |
|
Andre træer |
|
Algoritmer |
|