Jak mogę zweryfikować aktywa w drzewie OKX Merkle? (Drzewo merkle V2)

Opublikowano 21 mar 2023Zaktualizowano 16 wrz 20249 min czytania26

Dotyczy okresu audytu po marcu 2023 r.

Co to jest drzewo Merkle?

Merkle Tree (lub drzewo hash) to struktura danych, która zazwyczaj jest drzewem binarnym. Używa predefiniowanych funkcji do obliczania wartości skrótu węzła od dołu do góry, do najwyższego węzła korzenia drzewa.

Szczegóły węzła

Każdy węzeł drzewa przechowuje następujące informacje:

  • Wartość hash węzła

  • Kwota kryptowaluty użytkownika zarejestrowana przez migawkę audytu (na przykład BTC, ETH, USDT)

wartość hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}

Zasada Hash - Węzły liści (z wyjątkiem węzłów przedłużających)

hash=SHA256(nonce+salda)

OKX przypisze jedną, unikatową wartość nonce dla każdego użytkownika, którą można znaleźć na stronie audytu użytkownika; salda to ciąg json składający się z aktywów i kwot użytkowników, które zostały przechwycone na przykład przez migawkę audytu: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (UWAGA: należy pozbyć się końcowych zer i zachować precyzję 8 miejsc po przecinku)

Węzły nadrzędne

hash węzła nadrzędnego = SHA256(h1+h2+(h1 kwota BTC+h2 kwota BTC)+(h1 kwota ETH+h2 kwota ETH)+(h1 kwota USDT+h2 kwota USDT)+wysokość)

h1=Hash lewego węzła podrzędnego bieżącego węzła, h2=Hash prawego węzła podrzędnego bieżącego węzła, audit_id=ID bieżącego audytu, wysokość=wysokość węzła h1 (lub h2) Definicja wysokości: wysokość dolnego węzła liścia=1, wysokość węzła nadrzędnego=wysokość jego węzła podrzędnego + 1, węzeł główny ma maksymalną wysokość

Reguła podziału węzła

Aby chronić prywatność klientów, OKX losowo dzieli aktywa użytkownika na dwa węzły, z losowym zakresem od 0 do 1. Na przykład, jeśli zasoby użytkownika to: {"BTC": "10.2", "ETH": "4", "USDT": "5"}, a liczba losowa wynosi 0,6, zasoby użytkownika zostaną podzielone na 60% i 40%.

CT-web-POR-4

Podczas kolejnego generowania drzewa Merkle podzielone węzły liści zostaną losowo zakodowane, aby rozdzielić je na różne pozycje w drzewie.

Zasada węzłów przedłużających

Aby zbudować pełne drzewo Merle (pełne drzewo binarne), wymagane są 2^n węzły terminalne, lecz aktualne dane mogą nie spełniać takiego wymagania, jak również może występować nieparzysta liczba danych. W takiej sytuacji, jeżeli węzeł k nie ma węzłów równorzędnych, jeden węzeł równorzędny k’ zostanie automatycznie wygenerowany jako węzeł przedłużający, tak aby hash(k')=hash(k), a kwoty aktywów zostaną ustawione na 0 dla wszystkich walut. np.

Hash salda
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}

W tym przykładzie, węzeł przedłużający h4=h3 i salda przechowywane w węźle wynoszą {"BTC": 0, "ETH": 0,"USDT": 0} jak pokazano na Zdjęciu 1 (węzeł zielony):

CT-web-POR-5

Zdjęcie 1

hash węzła nadrzędnego = SHA256(h1+h2+(h1 kwota BTC+h2 kwota BTC)+(h1 kwota ETH+h2 kwota ETH)+(h1 kwota USDT+h2 kwota USDT)+wysokość)

Więc: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height) ## Jak sprawdzić, czy moje aktywa są zawarte w drzewie OKX Merkle?

Teoria weryfikacji

Zgodnie z definicją drzewa Merkle OKX można obliczyć wartość skrótu węzła nadrzędnego, przechodząc od dołu do góry, używając wartości skrótu jego lewego i prawego węzła podrzędnego. Ostatecznie uzyska się wartość skrótu węzła głównego. Następnie można porównać obliczoną wartość skrótu węzła głównego z wartością uzyskaną z węzła głównego ścieżki drzewa Merkle. Jeśli są one zgodne, weryfikacja zakończy się pomyślnie; w przeciwnym razie nie powiedzie się. Na przykład: spójrz na Zdjęcie 1 i poniższy tekst, w oparciu o własny węzeł użytkownika h3 i przedstawiony węzeł równorzędny h4, można obliczyć wartość hash ich węzła nadrzędnego h6 oraz w oparciu o przedstawiony węzeł równorzędny h5 dla h6, można obliczyć wartość hash ich węzła nadrzędnego h7, następnie można porównać wartość hash h7 z wartością zgromadzoną na węźle centralnym ścieżki drzewa Merkle i sprawdzić, czy są one identyczne, w celu przeprowadzenia procesu weryfikacji. Tekst danych ścieżki drzewa Merkle:

h7,3,{"BTC":"3","ETH":"5","USDT":"8"}
h6,2,{"BTC":"1","ETH":"2","USDT":"4"}
h5,2,{"BTC":"2","ETH":"3","USDT":"4"}
h4,1,{"BTC":"0","ETH":"0","USDT":"0"}
h3,1,{"BTC":"1","ETH":"2","USDT":"4"}
h2,1,{"BTC":"1","ETH":"2","USDT":"3"}
h1,1,{"BTC":"1","ETH":"1","USDT":"1"}

Uwaga: OKX wprowadził migawkę aktywów netto podczas generowania drzewa Merkle. Zadłużenie (np. ujemny kapitał własny) zostanie zarejestrowane w migawce, jeśli użytkownik pożyczył aktywa. Więcej informacji można znaleźć tutaj .

Kroki weryfikacji

1. Zaloguj się do konta OKX, przejdź do Aktywa > Audyty , aby wyświetlić ostatnie audyty, wybierz Szczegóły, aby wyświetlić dane audytu.

CT-web-POR-view audit details

Wybierz Aktywa i Wyświetl szczegóły dla lepszego zrozumienia audytu danych

2. Można również ręcznie zweryfikować aktywa w drzewie Merkle, wybierając opcję Kopiuj dane

CT-web-POR-copy data

Wybierz opcję Kopiuj dane dla procesu weryfikacji ręcznej

3. Otwórz edytor tekstu (np. notatnik), wklej i zapisz String json jako plik json.

Kroki operacyjne

Mac: Otwórz terminal, wpisz polecenie dotknij merkle_proof_file.json, po czym zostanie utworzony plik json. Plik jest domyślnie zapisany na biurku systemu. Możesz otworzyć Finder i wyszukać merkle_proof_file.json, aby znaleźć ten plik. Otwórz plik json, wklej skopiowane dane i zapisz plik.

Windows Kliknij dwukrotnie, aby otworzyć edytor tekstu (np. notatnik), wklej dane i zapisz jako plik json. W naszym przypadku nazwiemy plik „merkle_proof_file.json“. Poniżej pokazano tekst json danych ścieżki drzewa Merkle: { "hash": "7e5a588806ff1de23f81e3a092860de43367fb4ea5503a53d95a5bc36d77e0c2", "nodes": [ { "balances": { "BTC": "0.49997703", "ETH": "0", "USDT": "16.62437479" }, "hash": "4087972e6b4bd3897c19f76b94b27db8eaf19f0d27d1b73e18297c18c850c3c1" }, { "balances": { "BTC": "0.40002297", "ETH": "0", "USDT": "12.18752303" }, "hash": "da14bd34c8d933781b8ec20a7e16109d0d650306b049da52c755437c4f7ec5e5" } ], "nonce": "b6f6ea7584742839791ab923f4f1980d7ca3ff7c5d3f3fd9cc2a18c598503553", "totalBalances": { "BTC": "0.9", "ETH": "0", "USDT": "28.81189782" } }

4. Pobierz „Pełne drzewo Merkle” pod raportem odpowiedzialności i rozpakuj pobrany plik, aby uzyskać „Pełny plik drzewa Merkle”.

CT-web-POR-7

Wybierz pobierz, aby uzyskać raport

5." Pobierz narzędzie weryfikacji open-source OKX (MerkleValidator)

6. Zapisz narzędzie weryfikacji open-source OKX (MerkleValidator) i dwa pliki danych (merkle_proof_file.json, full-liabilities-merkle-tree.txt) w tym samym folderze. W naszym przypadku: umieściliśmy narzędzie oraz plik danych w folderze Pobierz, o nazwie proof-of-reserves, jak pokazano poniżej:

CT-web-POR-8

7. Uruchom polecenie i zlokalizuj katalog pobranego folderu. W naszym przypadku wprowadź polecenie: cd ~/Downloads/proof-of-reserve 8. Wpisz poniższe polecenie i naciśnij enter, aby rozpocząć weryfikację:

Mac ./MerkleValidator --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json

Windows MerkleValidator.exe --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json

Uwaga: - Jeśli używasz komputera Mac i napotkasz komunikat „nie można otworzyć narzędzi, ponieważ nie można zweryfikować dewelopera”, przejdź do Ustawienia systemowe > Prywatność i ochrona > Ogólne > Kliknij kłódkę, aby wprowadzić zmiany_ > Zezwalaj na aplikacje pobrane z App Store i zidentyfikowanych deweloperów

9. Sprawdź wynik Jeśli weryfikacja będzie pomyślna, pojawi się komunikat Pomyślne zatwierdzenie ścieżki drzewa Merkle zgodnie z poniższym:

CT-web-POR-9

Jeśli weryfikacja nie powiedzie się, poniżej zostanie wyświetlony komunikat Niepomyślne zatwierdzenie ścieżki drzewa Merkle:

CT-web-POR-10

10. Można również odwołać się do kodu narzędzia OKX open-source verification tool (MerkleValidator) i OKX merkle tree definition, napisać program samodzielnie, aby zweryfikować, czy zasoby są przechwytywane przez drzewo merkle zbudowane z migawki audytu, przy użyciu danych ścieżki drzewa merkle zebranych w kroku 2.