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

Publikováno dne 21. 3. 2023Aktualizováno dne 11. 4. 2024Doba čtení: 7 min38

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).
Bash
hodnota hash,{"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ů)
TOML, also INI
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
Bash
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 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říklad:

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 (zelený uzel):
CT-verifymerkletree-v1-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 v OKX můžete spočítat hash hodnotu nadřazeného uzlu zdola nahoru na základně jeho podřízených uzlů nalevo a napravo, a to až tak daleko, než se dostanete k hodnotě uzlu kořene. Pak můžete vypočtenou hash hodnotu uzlu kořene porovnat s tou, kterou jste získali z cesty Merklova stromu k uzlu kořene. Pokud jsou obě hodnoty stejné, ověření úspěšně projde, pokud ne, pak neprojde.

  • Příklad: viz obrázek výše a text souboru json níže. 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 souboru json pro data cesty Merklova stromu:
JSON
{
 "self": {
  "balances": {
   "BTC": "1",
   "ETH": "1",
   "USDT": "1"
  },
  "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c",
  "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6",
  "type": 1,
  "height": 1
 },
 "path": [{
  "balances": {
   "BTC": "1",
   "ETH": "2",
   "USDT": "3"
  },
  "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e",
  "type": 2,
  "height": 1
 }, {
  "balances": {
   "BTC": "1",
   "ETH": "2",
   "USDT": "4"
  },
  "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db",
  "type": 2,
  "height": 2
 }, {
  "balances": {
   "BTC": "3",
   "ETH": "5",
   "USDT": "8"
  },
  "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959",
  "type": 3,
  "height": 3
 }]
}

Kroky ověření

  1. Pokud si chcete ověřit, zda byl zůstatek aktiv na vašem účtu zahrnut v podobě Merklova listu, přihlaste se ke svému účtu OKX, vyberte možnost Aktiva, navštivte Audity, kde si můžete zobrazit poslední audity, a kliknutím na Zobrazit podrobnosti si zobrazte údaje o auditu.
    CT-verifymerkletree-v1-2 Vyberte Aktiva a Zobrazit podrobnosti pro lepší pochopení údajů o auditu
  2. Svá aktiva v Merklově stromu můžete ověřit i ručně, pokud budete postupovat podle kroků v našem průvodci. Data, která budete pro ruční ověření potřebovat, získáte kliknutím na Kopírovat data.
    CT-verifymerkletree-v1-3Vyberte Kopírovat data pro proces ručního ověření
  3. Po výběru možnosti Kopírovat data otevřete textový editor (například poznámkový blok), vložte je a řetězec uložte 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:
JSON
{
 "self": {
  "balances": {
   "BTC": "1",
   "ETH": "1",
   "USDT": "1"
  },
  "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c",
  "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6",
  "type": 1,
  "height": 1
 },
 "path": [{
  "balances": {
   "BTC": "1",
   "ETH": "2",
   "USDT": "3"
  },
  "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e",
  "type": 2,
  "height": 1
 }, {
  "balances": {
   "BTC": "1",
   "ETH": "2",
   "USDT": "4"
  },
  "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db",
  "type": 2,
  "height": 2
 }, {
  "balances": {
   "BTC": "3",
   "ETH": "5",
   "USDT": "8"
  },
  "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959",
  "type": 3,
  "height": 3
 }]
}
  1. Stáhněte si opensourcový ověřovací nástroj OKX(MerkleValidator).
  2. Uložte opensourcový ověřovací nástroj OKX (MerkleValidator) a datový soubor (merkle_proof_file.json) do téže složky. V tomto případě jsou nástroj a datový soubor uloženy ve složce Stažené soubory a pojmenovány proof-of-reserves, jak je uvedeno níže:
    CT-verifymerkletree-v1-4
  3. Otevřete terminál (pro Mac: Terminál; naproti tomu Windows: Příkazový řádek)
  4. 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
  5. Zadejte níže uvedený příkaz a stisknutím klávesy Enter zahajte ověření:
    Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
    Windows: MerkleValidator.exe --merkle_proof_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 Nastavení systému > Ochrana soukromí a zabezpečení > Zabezpečení > vyberte App Store a od identifikovaných vývojářů v části Zabezpečení, tím [nástroj] povolíte.
  6. 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-verifymerkletree-v1-6
    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-verifymerkletree-v1-5
  7. 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 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.