26 / 736MRKL

Merkle Tree

drzewo Merkle’a

Sposób podsumowania transakcji jednym odciskiem i sprawdzenia obecności płatności bez pobierania całego bloku.

Merkle Tree stopniowo łączy kryptograficzne odciski danych w jeden wynik. W Bitcoinie powstaje tak Merkle root zapisany w nagłówku bloku. Kilka dodatkowych odcisków pozwala sprawdzić, czy dana transakcja odpowiada temu korzeniowi, bez przesyłania wszystkich pozostałych.

Portfel pokazuje, że płatność trafiła do bloku. Jak to sprawdzić bez pobierania całej zawartości? Pomaga w tym Merkle Tree. Transakcje są najpierw reprezentowane przez hashe, czyli krótkie odciski kryptograficzne. Łączy się je stopniowo w jeden wspólny odcisk — korzeń. Nagłówek zawiera ten Merkle root i wiąże blok z jego transakcjami. Korzeń nie jest archiwum, z którego można odczytać wszystkie płatności; służy do weryfikacji przedstawionych danych. [1] [2]

Wyobraź sobie cztery transakcje A, B, C i D. Bierzemy ich odciski, łączymy A z B i obliczamy nowy hash AB. Tak samo z C i D otrzymujemy CD. Na koniec łączymy odciski AB i CD, obliczając korzeń. Litery oznaczają tu tylko transakcje i wyniki pośrednie, a nie rzeczywiste hashe. Przypomina to odwrócone drzewo: wiele liści przez gałęzie zbiega się w jeden korzeń. Przy większej liczbie transakcji dochodzą kolejne poziomy, ale zasada pozostaje ta sama. [3]

Chcąc sprawdzić B, masz jej dane i obliczasz odcisk. Potrzebujesz jedynie odcisku A i wspólnego odcisku CD wraz z ich właściwą kolejnością. Z A i B tworzysz AB, następnie z AB i CD obliczasz korzeń i porównujesz go z nagłówkiem. Ta uzupełniająca ścieżka to Merkle proof. Nie musisz znać treści A, C ani D. Dla zrównoważonego drzewa 1024 transakcji ścieżka obejmuje 10 sąsiednich hashy. Dowód rośnie więc znacznie wolniej niż pełna lista transakcji. [2] [3]

Zgodność dowodu z korzeniem nie oznacza, że można bezkrytycznie ufać otrzymanemu nagłówkowi. Trzeba również sprawdzić Proof of Work, czyli to, czy wynik obliczeń górnika spełnia wymaganą trudność, oraz powiązanie nagłówka z odpowiednim łańcuchem. Nawet wtedy Merkle proof nie sprawdza wszystkich podpisów i reguł wszystkich transakcji w bloku. Tym zajmuje się Full Node. Opisana w whitepaperze uproszczona weryfikacja płatności SPV ma zatem inne założenia bezpieczeństwa niż pełna walidacja. Reorganizacja może też usunąć blok z aktywnej gałęzi: jego zawartość pozostaje możliwa do udowodnienia, ale miejsce płatności w aktualnej historii może się zmienić. [2]

W zwykłym drzewie Bitcoina liśćmi są identyfikatory txid w kolejności transakcji bloku, począwszy od Coinbase Transaction, specjalnej transakcji, w której górnik pobiera nagrodę za blok. Pary łączy się jako bajty i dwukrotnie haszuje SHA-256. Gdy poziom kończy się hashem bez pary, podwaja się go na potrzeby tego obliczenia; nie tworzy to dodatkowej płatności. Przy jednej transakcji jej txid jest od razu korzeniem. Podwajanie wymaga starannych kontroli duplikatów w implementacji. Ulepszenie protokołu SegWit oddziela ponadto dane witness, takie jak podpisy. Z blokiem wiąże je kolejny odcisk kryptograficzny, zapisany w Coinbase Transaction. Ten odcisk nazywa się witness commitment. Zwykłego drzewa txid nie należy więc mylić z drzewem witness. [3] [4]

Pełniejszy obraz uzyskasz, czytając to hasło razem z Block, Transakcja, Block Header. Do tego hasła prowadzą również odsyłacze z Block Header, Hash, SHA-256, Potwierdzenie.

DOC · 001Bitcoin Developer Guide — Merkle TreesDokumentacja DOC · 002Bitcoin whitepaper — Simplified Payment VerificationŹródło pierwotne DOC · 003Bitcoin Core — Merkle tree implementationŹródło pierwotne DOC · 004BIP141: witness commitmentŹródło pierwotne
Zaktualizowano: Najpierw źródła · To nie jest porada inwestycyjna