Деякі зазначені продукти доступні не у всіх юрисдикціях.

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

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

Застосовується до періоду аудиту після березня 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.