Jak sprawdzić, czy moje aktywa znajdują się w drzewie Merkle?
Czym jest drzewo Merkle’a
Drzewo Merkle (drzewo Merkle), znane również jako drzewo hash, jest strukturą danych i zazwyczaj drzewem binarnym, które oblicza wartość hasha warstwa po warstwie, od węzła liścia do górnego węzła korzenia w określony sposób.
Definicja drzewa Merkle CoinEx
Dane węzła
Dane przechowywane w każdym węźle drzewa obejmują: 1. Wartość hasha węzła. 2. Liczba monet uwzględnionych w snapshotach aktywów użytkownika (na przykład BTC, ETH, USDT).
Wartość hasha{"BTC":"Saldo BTC","ETH":"Saldo ETH","USDT":"Saldo USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Zasady haszowania
Węzeł liścia
hash = SHA256(nonce + balances)
Np.
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Wśród nich CoinEx przypisze każdemu użytkownikowi unikalny nonce, który można sprawdzić w danych audytu, natomiast „salda” to ciąg json składający się z liczby monet uwzględnionych w snapshocie aktywów użytkownika, na przykład: {"BTC": "1.023", "ETH": "0", "USDT": "20.2343322"}. Postępuj zgodnie z poniższymi regułami:
1. Ciąg json ma kompaktowy format bez nowych linii i spacji.
2. Usuń nieprawidłowe 0 na końcu kwoty monety i pozostaw dokładne 8 cyfr.
3. Nazwy monet są uporządkowane alfabetycznie.
1. Ciąg json ma kompaktowy format bez nowych linii i spacji.
2. Usuń nieprawidłowe 0 na końcu kwoty monety i pozostaw dokładne 8 cyfr.
3. Nazwy monet są uporządkowane alfabetycznie.
Węzeł nadrzędny
hash = SHA256(h1 + h2 + balances)
· h1: Wartość hash węzła potomnego po lewej stronie.
· h2: Wartość hash węzła potomnego po prawej stronie.
· salda: saldo węzła podrzędnego po lewej stronie + saldo węzła podrzędnego po prawej stronie, sumując saldo tego samego aktywa
· h2: Wartość hash węzła potomnego po prawej stronie.
· salda: saldo węzła podrzędnego po lewej stronie + saldo węzła podrzędnego po prawej stronie, sumując saldo tego samego aktywa
Np.
Węzeł potomny po lewej:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Węzeł potomny po prawej:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Hash węzła nadrzędnego:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Reguły wypełniania węzłów
Utworzenie kompletnego drzewa Merkle (w pełni binarnego) wymaga 2^n danych węzła liścia, jednak rzeczywista liczba danych może nie być wystarczająca lub parzysta. W takim wypadku, jeśli węzeł k nie ma węzła rodzeństwa, funkcja wypełniania automatycznie wygeneruje węzeł rodzeństwa k', przy czym węzeł rodzeństwa hash(k') = hash(k), a liczba monet w węźle k' zostanie całkowicie ustawiona na zero.
Np. węzeł K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash węzła nadrzędnego:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Reguły walidacji
1. Zasady walidacji: Zgodnie z definicją drzewa Merkle wartość hasha węzła nadrzędnego jest obliczana na podstawie węzła liścia użytkownika, aż do uzyskania wartości hasha węzła głównego, i porównywana jest wartość hasha węzła głównego. Jeśli obie wartości są równe, walidacja zostaje zatwierdzona; jeśli nie, walidacja kończy się niepowodzeniem.
2. Na przykład poniższy tekst json najpierw oblicza hash węzła liścia na podstawie danych własnych, a następnie oblicza hash węzła nadrzędnego z każdym węzłem potomnym na ścieżce, a wynikowy hash węzła powinien być równy hashowi węzła głównego, z równoważnymi saldami. (Zwróć uwagę, że nie ma węzła potomnego, gdy węzeł potomny wyświetla pustą wartość, a hash węzła nadrzędnego jest obliczany zgodnie z regułami węzła dopełniającego).
2. Na przykład poniższy tekst json najpierw oblicza hash węzła liścia na podstawie danych własnych, a następnie oblicza hash węzła nadrzędnego z każdym węzłem potomnym na ścieżce, a wynikowy hash węzła powinien być równy hashowi węzła głównego, z równoważnymi saldami. (Zwróć uwagę, że nie ma węzła potomnego, gdy węzeł potomny wyświetla pustą wartość, a hash węzła nadrzędnego jest obliczany zgodnie z regułami węzła dopełniającego).
Dane ścieżki drzewa Merkle (tekst json):
{ "root": { "balances": { "CET": "14373493.24153457", "ETH": "104543541.61407674", "USDC": "2419089.97192761", "USDT": "4836955256.81519091" }, "hash": "c01a6c3b0fedde2a066f8a38968e40420c0b0742bb4ccda571a4349fb1c64f18" }, "self": { "balances": { "USDT": "3990000" }, "nonce": "9885b5df557ba3cec41a74347719a8a37d5792a1cf7f0e216510d60dd1b1fc95" }, "path": [ { "balances": { "CET": "10000.01994324", "USDC": "40000", "USDT": "1004.13066254" }, "hash": "01f94322a74bee4431b809406997cee575bed3b85ef36b4ba3b2ff9dd140f99a", "pos": "left" }, { "balances": { "CET": "1000", "ETH": "0.90765244", "USDT": "143151.30772787" }, "hash": "c99051749a3a83e60d1338454382044f9d7236928cfdc4b7fca1a7cc7450c7a6", "pos": "left" }, { "balances": { "CET": "548800.95984406", "ETH": "50000.00001068", "USDC": "9986.281143", "USDT": "62752.29303779" }, "hash": "173a9a7ef562f1b537def5d58167d7402c8e268b1423c5f8e1d806cd0c524344", "pos": "left" }, { "balances": { "CET": "10023.01105146", "ETH": "9900.74253772", "USDT": "22516389.78119662" }, "hash": "d79bd6c7a1536db199747061c119f98f86d99f9c7a8350fe63c6314ef3e8a24c", "pos": "right" }, { "balances": { "CET": "5393361.46905487", "ETH": "23711.51394236", "USDC": "201404.61667184", "USDT": "230211961.3159725" }, "hash": "115551fd3f85328d32858cc6d1bea9c1274984b0f8abba8140752f9d55e48277", "pos": "left" }, { "balances": { "CET": "1554146.8440552", "ETH": "100.0040003", "USDC": "160006.6", "USDT": "11201397.46983634" }, "hash": "7b92897456af56f473b75d5e009be090726ad64694fd27971dc46f2631db51d8", "pos": "right" }, { "balances": { "CET": "4712634.46013087", "ETH": "91469.27009748", "USDC": "1002463.00913027", "USDT": "830313049.62523756" }, "hash": "0905786187f2c582902b84175813b063c31755a2930b25dee7ba005f7c8a7cf9", "pos": "right" }, { "balances": { "CET": "2143526.47745487", "ETH": "104368359.17583576", "USDC": "1005229.4649825", "USDT": "3738515550.89151969" }, "hash": "41dc5da7477fab3ac6fe233a1bf1bec0d26d0f5dea679b5d91f2f09c488fcb2f", "pos": "right" } ] }
Jak dokonać walidacji
1. Zaloguj się na swoje konto CoinEx, kliknij opcję „Proof of Reserve”, przejdź do strony i kliknij opcję „Kopiuj mój audyt”.
2. Wklej skopiowane dane audytu do pliku tekstowego, na przykład „merkle_proof_file.json”.
3. Pobierz [narzędzie do walidacji o otwartym kodzie źródłowym] udostępnione przez CoinEx.
4. Rozpakuj narzędzie do walidacji i umieść zdekompresowany plik oraz plik „merkle_proof_file.json” w tym samym folderze, na przykład „~/Downloads/proof-of-reserves”.
5. Otwórz aplikację Terminal (MacOS: Terminal; Windows: Terminal lub PowerShell), wpisz „cd ~/Downloads/proof-of-reserves” i przejdź do powyższego katalogu.
6. Wpisz następujące polecenie, aby dokonać walidacji danych: MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Jeśli walidacja zostanie zatwierdzona, wyświetlony zostanie komunikat „Walidacja ścieżki drzewa Merkle została zatwierdzona”. Jeśli nie, wyświetlony zostanie komunikat „Walidacja ścieżki drzewa Merkle się nie powiodła”.
Możesz również skorzystać z instrukcji podanych w tym dokumencie i [kodzie źródłowym narzędzia weryfikacyjnego open source], aby utworzyć własne narzędzie weryfikacyjne.