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

Опубліковано 21 бер. 2023 р.Оновлено 1 квіт. 2025 р.4 хв читання30

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

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

Дерево Меркла (або хеш-дерево) — це структура даних, яка зазвичай є двійковим деревом. Вона використовує заздалегідь визначені функції для обчислення хеш-значення ноду знизу догори, до верхнього кореневого ноду дерева.

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

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

  • Хеш-значення ноду

  • Сума криптовалют користувача, зафіксована на знімку аудиту (наприклад, 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

Рисунок 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" } }

4. Завантажте файли "Повне дерево Меркла" у розділі «Звіт про відповідальність» і розархівуйте завантажений файл, щоб отримати «Повний файл дерева Меркла».

CT-web-POR-7

Вибрати «Завантажити», щоб отримати звіт

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

  2. 6. Збережіть засіб перевірки з відкритим кодом від OKX (MerkleValidator) і два файли даних (merkle_proof_file.json, full-liabilities-merkle-tree.txt) в одній папці. У нашому прикладі ми розміщуємо засіб і файл даних у папці Завантаження під назвою proof-of-reserves, як показано нижче.

CT-web-POR-8

7. Виконайте команду та вкажіть каталог завантаженої папки. У нашому прикладі вводимо команду: cd ~/Downloads/proof-of-reserve

8. Введіть команду нижче та натисніть клавішу введення, щоб почати перевірку:

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 і від вказаних розробників

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

CT-web-POR-9

Якщо перевірку не пройдено, нижче буде показано результат Перевірку шляху дерева Меркла не пройдено.

CT-web-POR-10

10. Крім того, можна відкрити код засобу перевірки з відкритим кодом OKX (MerkleValidator) і визначення дерева Меркла від OKX, самостійно написати програму для перевірки того, чи ваші активи враховано в дереві Меркла, створеному на основі знімка аудиту, за даними шляху дерева Меркла, отриманими на кроці 2.