Як перевірити активи в дереві Меркла на OKX? (Дерево Меркла V2)

Опубліковано 21 бер. 2023 р.Оновлено 12 квіт. 2024 р.3 хв читання

Застосовується до періоду аудиту після березня 2023 р.

Що таке дерево Меркла?

[Дерево Меркла] (https://en.wikipedia.org/wiki/Merkle_tree) (або хеш-дерево) — це структура даних, яка зазвичай є двійковим деревом. Вона використовує заздалегідь визначені функції для обчислення хеш-значення ноду знизу догори, до верхнього кореневого ноду дерева.

Інформація про ноду

У кожному ноді дерева зберігається така інформація:

  • Хеш-значення ноду
  • Сума криптовалют користувача, зафіксована на знімку аудиту (наприклад, BTC, ETH, USDT
    хеш-значення,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
    be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}
    ### Правило хешування
  • Листові ноди (крім заповнювальних нодів)
    hash=SHA256(nonce+balances)
    OKX присвоює кожному користувачу один унікальний код __nonce__, який можна знайти на сторінці аудиту користувача; __balances__ — це рядок json, що складається зі значень активів і сум користувачів, зафіксованих на знімку аудиту, наприклад: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (ПРИМІТКА. Потрібно прибрати кінцеві нулі й залишити 8 знаків після коми) ### Материнські ноди
    хеш материнського ноду = SHA256(h1+h2+(h1 BTC amount+h2 BTC amount)+(h1 ETH amount+h2 ETH amount)+(h1 USDT amount+h2 USDT amount)+height)
    __h1__ — хеш лівого дочірнього ноду поточного ноду, __h2__ — хеш правого дочірнього ноду поточного ноду, __audit_id__ ID поточного аудиту, __height__ — висота ноду h1 (або h2) Визначення висоти: висота нижнього листового ноду = 1, висота материнського ноду = висота його дочірнього ноду + 1, максимальна висота кореневого ноду обмежена

Правило розбиття нодів

Щоб захистити конфіденційність клієнтів, OKX випадково розділить ресурси користувачів на два ноди з випадковим діапазоном від 0 до 1. Наприклад, якщо активи користувача: {"BTC": "10.2", "ETH": "4", "USDT": "5"} і випадкове число дорівнює 0,6, активи користувача будуть поділені на 60% та 40%.
CT-web-POR-4
Під час наступної генерації дерева Меркла ноди розділених листків будуть випадково перемішані, щоб розподілити їх за різними позиціями в дереві.

Правило заповнювальних нодів

Для побудови повного дерева Меркла (повного бінарного дерева) потрібно 2^n листових нодів, але реальні дані можуть не відповідати цій вимозі. Крім того, кількість даних може бути непарною. За таких обставин, якщо нод k не має сестринських нодів, автоматично створюється один сестринський нод k' як заповнювальний нод, де hash(k')=hash(k), а сумам активів задається значення 0 для всіх валют.
Приклад:

Хеш balances
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}
У цьому прикладі заповнювальний нод h4=h3, а баланси, що зберігаються на ноді, мають значення {"BTC": 0, "ETH": 0,"USDT": 0}, як показано на рисунку 1 (зелений вузол): ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Рисунок 1*
хеш материнського ноду = SHA256(h1+h2+(h1 BTC amount+h2 BTC amount)+(h1 ETH amount+h2 ETH amount)+(h1 USDT amount+h2 USDT amount)+height)
Отже: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)

Як перевірити, чи мої активи враховані в дереві Меркла на OKX?

Теорія перевірки

Згідно з визначенням дерева Меркла OKX, ви можете обчислити хеш-значення батьківського нода, просуваючись знизу вгору, використовуючи хеш-значення його лівого та правого дочірніх нодів. Зрештою ви отримаєте хеш-значення кореневого нода. Потім ви можете порівняти це розраховане хеш-значення кореневого ноду зі значенням, отриманим із кореневого нода шляху дерева Меркла. Якщо вони збігаються, перевірку пройдено успішно, в іншому випадку — це невдача.
Розгляньмо це на прикладі рисунка 1 і наведеного нижче тексту: на основі власного ноду користувача h3 і сестринського ноду h4 можна обчислити хеш їхнього материнського ноду h6, а на основі сестринського ноду h6 можна обчислити хеш їхнього материнського ноду h7. Потім можна порівняти хеш-значення h7 зі значенням, отриманим у кореневому ноді шляху дерева Меркла та виявити, чи вони збігаються. На цьому процес перевірки завершується.
Текст даних шляху дерева Меркла:

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"}
__Примітка__. OKX представила моментальний знімок чистих активів під час створення дерева Меркла. Заборгованість (наприклад, негативний капітал) буде записаний у знімку, якщо користувач запозичив активи. Більш детальну інформацію можна отримати тут.

Етапи перевірки

  1. Увійдіть у свій акаунт OKX, натисніть Активи > Аудити, щоб проглянути останні аудити, і натисніть Деталі.
    CT-web-POR-view audit detailsВиберіть «Активи» та «Переглянути дані», щоб краще розуміти дані аудиту

  2. Крім того, активи можна перевірити в дереві Меркла вручну, вибравши Копіювати дані
    CT-web-POR-copy dataВиберіть «Копіювати» дані для ручної перевірки

  3. Відкрийте текстовий редактор (наприклад, Блокнот), вставте їх і збережіть рядок json як файл json.

Порядок виконання

Mac: Відкрийте термінал, введіть команду touch merkle_proof_file.json. Буде створено файл json. За умовчанням його буде збережено на робочому столі. Щоб знайти цей файл, відкрийте Finder і введіть в полі пошуку merkle_proof_file.json. Відкрийте файл json, вставте скопійовані дані та збережіть їх.
Windows: Двічі клацніть, щоб відкрити текстовий редактор (наприклад, Блокнот) подвійним натисканням, вставте дані та збережіть їх як файл json.
У нашому випадку ми називаємо файл merkle_proof_file.json. Далі показано текст json даних шляху дерева Меркла:
{
"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. Завантажте файли "Повне дерево Меркла" у розділі «Звіт про відповідальність» і розархівуйте завантажений файл, щоб отримати «Повний файл дерева Меркла».
    CT-web-POR-7Вибрати «Завантажити», щоб отримати звіт

  2. Завантажте інструмент засіб перевірки з відкритим кодом від OKX (MerkleValidator)

    1. Збережіть засіб перевірки з відкритим кодом від OKX (MerkleValidator) і два файли даних (merkle_proof_file.json, full-liabilities-merkle-tree.txt) в одній папці. У нашому прикладі ми розміщуємо засіб і файл даних у папці Завантаження під назвою proof-of-reserves, як показано нижче.
      CT-web-POR-8
  3. Виконайте команду та вкажіть каталог завантаженої папки. У нашому прикладі вводимо команду: cd ~/Downloads/proof-of-reserve

  4. Введіть команду нижче та натисніть клавішу введення, щоб почати перевірку:
    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
    Примітка. Якщо під час користування Mac з’явилося повідомлення «Не вдається відкрити засіб, тому що неможливо перевірити розробника», перейдіть у Системні налаштування > Безпека й конфіденційність > Загальні > __ натисніть значок замка, щоб внести зміни__ > дозвольте запуск програм, завантажених з App Store і від вказаних розробників

  5. Перевірте результат.
    Якщо перевірку пройдено, нижче з’явиться повідомлення Перевірку шляху дерева Меркла пройдено.
    CT-web-POR-9 Якщо перевірку не пройдено, нижче буде показано результат Перевірку шляху дерева Меркла не пройдено.
    CT-web-POR-10

  6. Крім того, можна відкрити код [засобу перевірки з відкритим кодом OKX] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator) і [визначення дерева Меркла від OKX] (#hats-a-merkle-tree), самостійно написати програму для перевірки того, чи ваші активи враховано в дереві Меркла, створеному на основі знімка аудиту, за даними шляху дерева Меркла, отриманими на кроці 2.