Jak si ověřím aktiva v Merklově stromu společnosti OKX? (Merklův strom V2)

Publikováno dne 21. 3. 2023Aktualizováno dne 12. 4. 2024Doba čtení: 9 min24

Platí pro období auditu po březnu 2023

Co je Merklův strom?

Merklův strom (nebo také hashový strom) je datová struktura, která je obvykle binárním stromem. Používá předdefinované funkce pro výpočet hodnoty hash uzlu zdola nahoru až po vrcholový uzel kořene stromu.

Informace o uzlu

V každém uzlu stromu jsou uloženy určité informace, například:

  • Hash hodnota uzlu
  • Množství kryptoměny uživatele zachycené na snímku auditu (jako příklad můžeme uvést BTC, ETH, USDT).
    hash hodnota,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
    be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}
    ### Hash pravidlo
  • Koncové uzly (s výjimkou doplňkových uzlů)
    hash=SHA256(nonce + zůstatky)
    OKX přiřadí každému uživateli jedinečné __nonce__, které je možné najít na stránce auditu uživatele. __Zůstatky__ představují řetězec ve formátu json, který se skládá z aktiv uživatele a částek, které jsou zachycené na snímku auditu, například: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (POZNÁMKA: je nutné smazat nuly na konci a nechat jen 8 desetinných čísel přesnosti) ### Nadřazené uzly__
    hash hodnota nadřazeného uzlu = SHA256(h1 + h2 + (množství BTC při h1 + množství BTC při h2) + (množství ETH při h1 + množství ETH při h2) + (množství USDT při h1 + množství USDT při h2) + výška)
    __h1__ = Hash hodnota levého podřízeného uzlu aktuálního uzlu, __h2__ = Hash hodnota pravého podřízeného uzlu aktuálního uzlu, __audit_id__ = ID aktuálního auditu, __výška__ = výška uzlu h1 (nebo h2) Definice výšky: výška dolního koncového uzlu = 1, výška nadřazeného uzlu = výška jeho podřazeného uzlu + 1, uzel kořene má maximální výšku.

Pravidlo rozdělení uzlů

Z důvodu ochrany soukromí zákazníků společnost OKX náhodně rozdělí aktiva uživatelů do dvou uzlů s náhodným rozsahem mezi 0 a 1. Pokud jsou například aktiva uživatele: {"BTC": "10.2", "ETH": "4", "USDT": "5"} a náhodné číslo je 0,6, budou aktiva uživatele rozdělena na 60 % a 40 %.
CT-web-POR-4
Při následném generování Merklova stromu budou rozdělené koncové uzly náhodně zakódovány a rozděleny různé pozice ve stromu.

Pravidlo doplňkových uzlů

Pro konstrukci celého Merklova stromu (kompletního binárního stromu) je nutné 2^n koncových uzlů, ale vlastní data nemusí tyto požadavky splňovat, proto je možné mít i lichý počet dat. V takových případech, kdy uzel nemá žádný svůj protějšek, mu bude jeden automaticky vygenerován v podobě tzv. padding uzlu, (doplňkového uzlu), například hash(k') = hash(k). Hodnota aktiv tohoto doplňkového uzlu pak bude nastavena pro všechny měny na 0.
např.

Hash zůstatky
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}
V našem příkladu je doplňkový uzel h4 = h3 a zůstatky, které jsou v něm uložené jsou {"BTC": 0, "ETH": 0,"USDT": 0}, jak vidíme na obrázku 1 (zelený uzel): ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Obrázek 1*
hash hodnota nadřazeného uzlu = SHA256(h1 + h2 + (množství BTC při h1 + množství BTC při h2) + (množství ETH při h1 + množství ETH při h2) + (množství USDT při h1 + množství USDT při h2) + výška)
Takže: h6 = SHA256(h3 + h4 + (1 + 0) + (2 + 0) + (4 + 0) + výška) ## Jak ověřím, zda jsou moje aktiva na OKX zahrnuta v Merklově stromu? ### Teorie ověření Podle definice Merklova stromu OKX můžete vypočítat hash hodnotu nadřazeného uzlu tak, že budete postupovat zdola nahoru s využitím hash hodnot jeho levého a pravého podřízeného uzlu. Nakonec získáte hash hodnotu uzlu kořene. Tuto vypočtenou hash hodnotu uzlu kořene pak můžete porovnat s hodnotou získanou z cesty Merklova stromu k uzlu kořene Pokud se shodují, ověření proběhne úspěšně, v opačném případě bude neúspěšné. Příklad: viz obrázek 1 a níže text. Pokud vezmeme vlastní uzel uživatele h3 a k tomu je protějšek h4, dokážeme vypočítat hash hodnotu jejich nadřazeného uzlu h6, pak můžeme vzít protějšek uzlu h6 (uzel h5) a díky nim vypočítat hash hodnotu jejich nadřazeného uzlu h7. Potom můžeme porovnat hash hodnotu uzlu h7 s hodnotou, kterou jsme získali z cesty Merklova stromu k uzlu kořene, a uvidíme, jestli jsou obě hodnoty stejné. Tím proces ověření dokončíme. Text pro data cesty Merklova stromu:
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"}
__Poznámka__: Společnost OKX zavedla při generování Merklova stromu snímek čistých aktiv. Pokud si uživatel vypůjčil aktiva, zaznamená se ve snímku dluh (tedy záporný vlastní kapitál). Další podrobnosti naleznete zde.

Kroky ověření

  1. Přihlaste se ke svému účtu OKX, přejděte na Aktiva > Audity pro zobrazení posledních auditů a vyberte Podrobnosti pro zobrazení údajů o auditu.
    CT-web-POR-view audit detailsVyberte Aktiva a Zobrazit podrobnosti pro lepší pochopení údajů o auditu

  2. Svá aktiva v Merklově stromu můžete ověřit i ručně, pokud vyberte možnost Kopírovat data.
    CT-web-POR-copy dataVyberte Kopírovat data_ pro proces ručního ověření

  3. Otevřete textový editor (například poznámkový blok), vložte a uložte řetězec json jako soubor json.

Kroky postupu

Mac: Otevřete terminál, zadejte příkaz touch merkle_proof_file.json, tím vytvoříte soubor json. Soubor se ve výchozím nastavení uloží do systémové složky. Pokud ho chcete vyhledat, stačí otevřít Finder a zadat hledání souboru merkle_proof_file.json Vyhledaný soubor otevřete, vložte zkopírovaná data a uložte ho.
Windows: Dvojitým kliknutím otevřete textový editor (například poznámkový blok), vložte data a soubor uložte jako soubor json.
V našem případě dáme souboru název merkle_proof_file.json. Text souboru json pro data cesty Merklova stromu vidíte níže:
{
"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" }
}

  1. Stáhněte si soubory „Kompletní Merklův strom“ ve zprávě o závazcích, stažený soubor rozbalte a získáte tak „Kompletní Merklův strom“.
    CT-web-POR-7Vyberte Stáhnout pro získání zprávy

  2. Stáhněte si opensourcový ověřovací nástroj OKX (MerkleValidator)

  3. Uložte opensourcový ověřovací nástroj OKX (MerkleValidator) a oba datové soubory (merkle_proof_file.json, full-liabilities-merkle-tree.txt) do téže složky. V našem případě uložíme nástroj i datový soubor do složky Stažené soubory a pojmenujeme jej proof-of-reserves, jak je uvedeno níže:
    CT-web-POR-8 7. Spusťte příkaz a vyhledejte adresář stažené složky. V našem případě zadáme příkaz: cd ~/Downloads/proof-of-reserve

  4. Zadejte níže uvedený příkaz a stisknutím klávesy Enter zahajte ověření:
    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
    Poznámka: Pokud používáte Mac a zobrazí se vám chyba Nástroj nelze otevřít, protože vývojáře nelze ověřit, přejděte prosím do Předvolby systému > Zabezpečení a ochrana soukromí > Obecné > __Kliknutím na zámek proveďte změny __ > Povolit aplikace stažení z App Store a od identifikovaných vývojářů.

  5. Zkontrolujte výsledek:
    Pokud ověření proběhne úspěšně, zobrazí se výsledek Ověření cesty k Merklově stromu bylo úspěšné, jak je uvedeno níže:
    CT-web-POR-9 Pokud ověření proběhne neúspěšně, zobrazí se výsledek Ověření cesty Merklova stromu se nezdařilo, jak je uvedeno níže:
    CT-web-POR-10

  6. Můžete si také projít kód opensourcového ověřovacího nástroje OKX (MerkleValidator) a definici Merklova stromu v OKX a napsat si sami a program, který ověří, že jsou vaše aktiva zachycena v Merklově stromu vytvořeném na základě snímku auditu s využitím dat cesty Merklova stromu získaných v kroku 2.