Як перевірити активи в дереві Меркла на OKX? (Дерево Меркла V1)
Що таке дерево Меркла?
Дерево Меркла (або хеш-дерево) — це структура даних, яка зазвичай є двійковим деревом. Вона використовує заздалегідь визначені функції для обчислення хеш-значення ноду знизу догори, до верхнього кореневого ноду дерева.
Інформація про ноду
У кожному ноді дерева зберігається така інформація:
Хеш-значення ноду
Сума криптовалют користувача, зафіксована на знімку аудиту (наприклад, 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, максимальна висота кореневого ноду обмежена
Правило заповнювальних нодів
Для побудови повного дерева Меркла (повного бінарного дерева) потрібно 2^n листових ноди, але реальні дані можуть не відповідати цій вимозі. Крім того, кількість даних може бути непарною. За таких обставин, якщо нод k не має сестринських нодів, автоматично створюється один сестринський нод k' як заповнювальний нод, де hash(k')=hash(k), а сумам активів задається значення 0 для всіх валют. Наприклад:
Хеш | Баланси |
---|---|
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}, як показано на зображенні нижче (зелений нод):
хеш батьківського вузла = 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 можна обчислити хеш-значення материнського ноду знизу догори за його лівим і правим дочірніми нодами, поки ви не отримаєте хеш-значення кореневого ноду. Потім можна порівняти обчислене хеш-значення кореневого ноду з тим, що було отримано з кореневого ноду шляху дерева Меркла; якщо вони збігаються, перевірка вважається пройденою.
Приклад. Розгляньмо це на прикладі зображення вище та наведеного нижче тексту json: на основі власного ноду користувача h3 і сестринського ноду h4 можна обчислити хеш їхнього материнського ноду h6, а на основі сестринського ноду h6 можна обчислити хеш їхнього материнського ноду h7. Потім можна порівняти хеш-значення h7 зі значенням, отриманим у кореневому ноді шляху дерева Меркла та дізнатись, чи вони збігаються. На цьому процес перевірки завершується.
Текст json даних шляху дерева Меркла:
{ "self": { "balances": { "BTC": "1", "ETH": "1", "USDT": "1" }, "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c", "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6", "type": 1, "height": 1 }, "path": [{ "balances": { "BTC": "1", "ETH": "2", "USDT": "3" }, "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e", "type": 2, "height": 1 }, { "balances": { "BTC": "1", "ETH": "2", "USDT": "4" }, "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db", "type": 2, "height": 2 }, { "balances": { "BTC": "3", "ETH": "5", "USDT": "8" }, "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959", "type": 3, "height": 3 }] }
Етапи перевірки
1. Щоб перевірити, чи включено баланс активів на вашому акаунті у вигляді листка Меркла, увійдіть у свій акаунт OKX, натисніть Активи й оберіть пункт «Аудити», щоб проглянути останні аудити, а для перегляду даних аудиту натисніть Переглянути дані.
Виберіть «Активи» та «Переглянути дані», щоб краще розуміти дані аудиту 2. Крім того, активи можна перевірити в дереві Меркла вручну, виконавши дії, описані в нашому посібнику. Щоб отримати дані, необхідні для ручної перевірки, натисніть Копіювати дані.
Виберіть Копіювати дані для ручної перевірки 3. Натиснувши Копіювати дані, відкрийте текстовий редактор (наприклад, Блокнот), вставте їх і збережіть рядок json як файл json. Порядок виконання: Mac: відкрийте термінал, введіть команду touch merkle_proof_file.json. Буде створено файл json. За умовчанням його буде збережено на робочому столі. Щоб знайти цей файл, відкрийте Finder і введіть в полі пошуку merkle_proof_file.json. Відкрийте файл json, вставте скопійовані дані та збережіть їх. Windows: відкрийте текстовий редактор (наприклад, Блокнот) подвійним натисканням, вставте дані та збережіть їх як файл json. У нашому випадку ми назвемо файл merkle_proof_file.json. Далі показано текст json даних шляху дерева Меркла:
{ "self": { "balances": { "BTC": "1", "ETH": "1", "USDT": "1" }, "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c", "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6", "type": 1, "height": 1 }, "path": [{ "balances": { "BTC": "1", "ETH": "2", "USDT": "3" }, "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e", "type": 2, "height": 1 }, { "balances": { "BTC": "1", "ETH": "2", "USDT": "4" }, "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db", "type": 2, "height": 2 }, { "balances": { "BTC": "3", "ETH": "5", "USDT": "8" }, "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959", "type": 3, "height": 3 }] }
Завантажте засіб перевірки з відкритим кодом від OKX (MerkleValidator).
Збережіть засіб перевірки з відкритим кодом від OKX (MerkleValidator) і файл даних (merkle_proof_file.json) в одній папці. У цьому випадку засіб і файл даних зберігаються в папці Завантаження й називаються proof-of-reserves, як показано нижче.
6. Відкрийте термінал (для Mac: Термінал у Windows: командний рядок). 7. Виконайте команду та вкажіть каталог завантаженої папки. У нашому випадку введіть команду: cd ~/Downloads/proof-of-reserve 8. Введіть команду нижче та натисніть клавішу введення, щоб почати перевірку. Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json Якщо під час користування Mac з’явилося повідомлення «Не вдається відкрити засіб, тому що неможливо перевірити розробника», перейдіть до Системних налаштувань > Безпека та конфіденційність > Безпека > дозвольте запуск програм, завантажених з App Store і від вказаних розробників у розділі «Безпека», щоб дозволити [засіб] 9. Перевірте результат. Якщо перевірку пройдено, з’явиться повідомлення Перевірку шляху дерева Меркла пройдено (як показано нижче).
Якщо перевірку не пройдено, з’явиться повідомлення Перевірку шляху дерева Меркла не пройдено (як показано нижче).
10. Крім того, можна відкрити код засобу перевірки з відкритим кодом OKX (MerkleValidator) і визначення дерева Меркла від OKX, самостійно написати програму для перевірки того, чи ваші активи враховано в дереві Меркла, створеному на основі знімка аудиту, за даними шляху дерева Меркла, отриманими на кроці 2.