Як перевірити активи в дереві Меркла на OKX? (Дерево Меркла V2)
Застосовується до періоду аудиту після березня 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%.
Під час наступної генерації дерева Меркла ноди розділених листків будуть випадково перемішані, щоб розподілити їх за різними позиціями в дереві.
Правило заповнювальних нодів
Для побудови повного дерева Меркла (повного бінарного дерева) потрібно 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 (зелений вузол):
Рисунок 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](http://www.okx.com/cdn/assets/plugins/announcements/contentful/tofttmniq0qv/2shXq38y5QOmn3hiSWwhV5/fe08f9ed3830a81b20ec2a5c1b2f99e3/CT-web-POR-view_audit_details.png)
Виберіть «Активи» та «Переглянути дані», щоб краще розуміти дані аудиту
2. Крім того, активи можна перевірити в дереві Меркла вручну, вибравши Копіювати дані
![CT-web-POR-copy data](http://www.okx.com/cdn/assets/plugins/announcements/contentful/tofttmniq0qv/6aHTDFLUnxnzBcv6HLieUC/8b1f7158a66b006ab099d53c2b9e9fd5/CT-web-POR-copy_data.png)
Виберіть «Копіювати» дані для ручної перевірки
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](http://www.okx.com/cdn/assets/plugins/announcements/contentful/tofttmniq0qv/3JMBAsSYr2E8iZWwVvsj9Z/6ff4b7c17b55eb1020ecee70091be7af/CT-web-POR-7.png)
Вибрати «Завантажити», щоб отримати звіт
Завантажте інструмент засіб перевірки з відкритим кодом від OKX (MerkleValidator)
6. Збережіть засіб перевірки з відкритим кодом від OKX (MerkleValidator) і два файли даних (merkle_proof_file.json, full-liabilities-merkle-tree.txt) в одній папці. У нашому прикладі ми розміщуємо засіб і файл даних у папці Завантаження під назвою proof-of-reserves, як показано нижче.
![CT-web-POR-8](http://www.okx.com/cdn/assets/plugins/announcements/contentful/tofttmniq0qv/6SyqTrTdqAeFGRI62haMHC/e1a277aaceb0024ccb2d94d1e81c6866/CT-web-POR-8.png)
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](http://www.okx.com/cdn/assets/plugins/announcements/contentful/tofttmniq0qv/63TwC2v5WCUG1ryPyD5wwA/f65b6af6084004c7674648ca191e5c76/CT-web-POR-9.png)
Якщо перевірку не пройдено, нижче буде показано результат Перевірку шляху дерева Меркла не пройдено.
![CT-web-POR-10](http://www.okx.com/cdn/assets/plugins/announcements/contentful/tofttmniq0qv/5cOZd4LpAU70nSkuHVTZRd/64b6d69dc72358304f12e5005abc401c/CT-web-POR-10.png)
10. Крім того, можна відкрити код засобу перевірки з відкритим кодом OKX (MerkleValidator) і визначення дерева Меркла від OKX, самостійно написати програму для перевірки того, чи ваші активи враховано в дереві Меркла, створеному на основі знімка аудиту, за даними шляху дерева Меркла, отриманими на кроці 2.