Як перевірити активи в дереві Меркла на OKX? (Дерево Меркла V2)
Застосовується до періоду аудиту після березня 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"} - Листові ноди (крім заповнювальних нодів)OKX присвоює кожному користувачу один унікальний код __nonce__, який можна знайти на сторінці аудиту користувача; __balances__ — це рядок json, що складається зі значень активів і сум користувачів, зафіксованих на знімку аудиту, наприклад: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (ПРИМІТКА. Потрібно прибрати кінцеві нулі й залишити 8 знаків після коми) ### Материнські ноди
hash=SHA256(nonce+balances) __h1__ — хеш лівого дочірнього ноду поточного ноду, __h2__ — хеш правого дочірнього ноду поточного ноду, __audit_id__ ID поточного аудиту, __height__ — висота ноду h1 (або h2) Визначення висоти: висота нижнього листового ноду = 1, висота материнського ноду = висота його дочірнього ноду + 1, максимальна висота кореневого ноду обмеженахеш материнського ноду = SHA256(h1+h2+(h1 BTC amount+h2 BTC amount)+(h1 ETH amount+h2 ETH amount)+(h1 USDT amount+h2 USDT amount)+height)
Правило розбиття нодів
Щоб захистити конфіденційність клієнтів, 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} |
хеш материнського ноду = SHA256(h1+h2+(h1 BTC amount+h2 BTC amount)+(h1 ETH amount+h2 ETH amount)+(h1 USDT amount+h2 USDT amount)+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, натисніть Активи > Аудити, щоб проглянути останні аудити, і натисніть Деталі.
Виберіть «Активи» та «Переглянути дані», щоб краще розуміти дані аудитуКрім того, активи можна перевірити в дереві Меркла вручну, вибравши Копіювати дані
Виберіть «Копіювати» дані для ручної перевіркиВідкрийте текстовий редактор (наприклад, Блокнот), вставте їх і збережіть рядок 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" }
}
Завантажте файли "Повне дерево Меркла" у розділі «Звіт про відповідальність» і розархівуйте завантажений файл, щоб отримати «Повний файл дерева Меркла».
Вибрати «Завантажити», щоб отримати звітЗавантажте інструмент засіб перевірки з відкритим кодом від OKX (MerkleValidator)
- Збережіть засіб перевірки з відкритим кодом від OKX (MerkleValidator) і два файли даних (merkle_proof_file.json, full-liabilities-merkle-tree.txt) в одній папці. У нашому прикладі ми розміщуємо засіб і файл даних у папці Завантаження під назвою proof-of-reserves, як показано нижче.
- Збережіть засіб перевірки з відкритим кодом від OKX (MerkleValidator) і два файли даних (merkle_proof_file.json, full-liabilities-merkle-tree.txt) в одній папці. У нашому прикладі ми розміщуємо засіб і файл даних у папці Завантаження під назвою proof-of-reserves, як показано нижче.
Виконайте команду та вкажіть каталог завантаженої папки. У нашому прикладі вводимо команду: cd ~/Downloads/proof-of-reserve
Введіть команду нижче та натисніть клавішу введення, щоб почати перевірку:
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 і від вказаних розробниківПеревірте результат.
Якщо перевірку пройдено, нижче з’явиться повідомлення Перевірку шляху дерева Меркла пройдено.
Якщо перевірку не пройдено, нижче буде показано результат Перевірку шляху дерева Меркла не пройдено.Крім того, можна відкрити код [засобу перевірки з відкритим кодом OKX] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator) і [визначення дерева Меркла від OKX] (#hats-a-merkle-tree), самостійно написати програму для перевірки того, чи ваші активи враховано в дереві Меркла, створеному на основі знімка аудиту, за даними шляху дерева Меркла, отриманими на кроці 2.