Ett hash-träd , ett Merkle- träd kallas ett komplett binärt träd , i vars bladhörn placeras hash från datablock, och de interna hörnen innehåller hash från att lägga till värden i underordnade hörn. Trädets rotnod innehåller hash för hela datamängden, dvs hashträdet är en enkelriktad hashfunktion. Merkle-trädet används för effektiv lagring av transaktioner i blockkedjan av kryptovalutor (till exempel i Bitcoin , Ethereum ). Det låter dig få ett "fingeravtryck" av alla transaktioner i blocket, samt effektivt verifiera transaktioner [1] .
Fyllningen av värden i trädets noder går från botten till toppen. Först tillämpas hashing på varje datablock , och så vidare. De resulterande värdena skrivs till trädets löv. Block en nivå upp fylls i som hash av summan av deras barn , där vanligtvis betyder sammanlänkning . Denna operation upprepas tills toppvärdet erhålls - eller [1] . merkle_root
Bitcoin använder dubbel SHA-256 som sin hashfunktion , dvs [1] . Hashfunktionen kan dock vara vad som helst, till exempel är Tiger Tree Hash (TTH), som används i p2p fildelningsnätverk, ett Merkle- träd med en Tiger - hashfunktion [2] .
Om antalet block på någon nivå av trädet visar sig vara udda, så dupliceras ett block [1] eller förs över oförändrat till nästa nivå, vilket händer när man beräknar Tiger Tree Hash [2] .
Hashträd har en fördel framför haschkedjor eller hashfunktioner. När du använder hashträd är det mycket billigare att bevisa att ett visst datablock tillhör uppsättningen. Eftersom olika block ofta är oberoende data, såsom transaktioner eller delar av filer, är vi intresserade av möjligheten att kontrollera endast ett block utan att räkna om hash för andra trädnoder. Låt blocket vi är intresserade av vara detta (se fig.). Då kommer beviset på dess existens och giltighet att vara rothashen, såväl som topphascharna för andra grenar ( och ) [1] [3] . I det här fallet misslyckas kontrollen om .
I allmänhet kan man skriva
,
och kolla hur , var
.
Uppsättningen av block kallas autentiseringsvägen eller Merkle-vägen [1] .
Det kan ses att kontrollen ovan kan utföras i steg, där är höjden på trädet eller längden på autentiseringsvägen, och är antalet datablock. Samma kontroll i fallet med en hashkedja skulle ha komplexitet [1] [4] .
Tabellen nedan visar att även med ett betydande antal transaktioner i ett block behöver du inte oroa dig för komplexiteten i beräkningarna [1] .
Antal transaktioner | Ungefärlig blockstorlek | Sökvägsstorlek (i hash) | Sökvägsstorlek (i byte) |
---|---|---|---|
16 transaktioner | 4 kilobyte | 4 hash | 128 byte |
512 transaktioner | 128 kilobyte | 9 hash | 288 byte |
2048 transaktioner | 512 kilobyte | 11 hash | 352 byte |
65535 transaktioner | 16 megabyte | 16 hash | 512 byte |
Ett Bitcoin-block lagrar bara värdet av merkle_rootsina transaktioner. Detta gör att du kan få vissa fördelar och minska belastningen på nätverket.
Efter att ha samlat ett tillräckligt antal block kan gamla transaktioner raderas för att spara utrymme. Samtidigt förblir själva blocket oförändrat, eftersom det endast lagrar merkle_root. Ett block utan transaktioner tar upp 80 B, eller 4,2 MB per år (när ett block genereras var 10:e minut) [5] .
Förenklad betalningsverifiering blir möjlig . SPV-noden laddar inte ner hela blocket, utan bara blockhuvudet. För transaktionen av intresse för honom begär han också dess autentiseringsväg. Således laddar den bara ned några få kilobyte, medan den totala blockstorleken kan vara mer än 10 megabyte (se tabell) [1] . Att använda den här metoden kräver dock att användaren litar på den värd från vilken man kan fråga efter blockrubriker. Ett sätt att undvika en attack, d.v.s. ersättning av en nod av en skrupelfri part, är att skicka varningar i hela nätverket när ett fel upptäcks i ett block, vilket tvingar användaren att ladda ner hela blocket [5] .
Driften av de så kallade "tunna" bitcoinklienterna [6] [7] är baserad på förenklad betalningsverifiering .
Merkleträdet har också nackdelar, som visar sig med ett växande antal löv. Som visats tidigare, för att beräkna signaturen för ett godtyckligt block , måste du känna till alla värden från uppsättningen . Detta är inget problem om det är möjligt att lagra alla interna noder i trädet i minnet, men för stora träd (antalet löv kan öka upp till ) är detta inte lämpligt. Det är också möjligt att räkna om de interna blocken varje gång, men detta kommer avsevärt att bromsa prestandan för ett sådant system. Därför uppstår problemet med effektiv trädgenomgång och signaturgenerering ( Merkle tree traversal problem ) [4] . Hittills finns det lösningar som använder tid och minne, där är antalet löv. Det har också bevisats att det inte finns någon traversalalgoritm som är både bättre i tid och minne [8] .
Hash-funktioner | |
---|---|
generell mening | |
Kryptografisk | |
Nyckelgenereringsfunktioner | |
Kontrollnummer ( jämförelse ) | |
Hashes |
|
Träd (datastruktur) | |
---|---|
Binära träd | |
Självbalanserande binära träd |
|
B-träd | |
prefix träd |
|
Binär uppdelning av utrymme | |
Icke-binära träd |
|
Bryter upp utrymmet |
|
Andra träd |
|
Algoritmer |