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

Опубліковано 21 бер. 2023 р.Оновлено 22 лист. 2024 р.3 хв читання

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

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

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

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

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

  • Сума криптовалют користувача, зафіксована на знімку аудиту (наприклад, 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}, як показано на зображенні нижче (зелений нод):

CT-verifymerkletree-v1-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 можна обчислити хеш-значення материнського ноду знизу догори за його лівим і правим дочірніми нодами, поки ви не отримаєте хеш-значення кореневого ноду. Потім можна порівняти обчислене хеш-значення кореневого ноду з тим, що було отримано з кореневого ноду шляху дерева Меркла; якщо вони збігаються, перевірка вважається пройденою.

  • Приклад. Розгляньмо це на прикладі зображення вище та наведеного нижче тексту 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, натисніть Активи й оберіть пункт «Аудити», щоб проглянути останні аудити, а для перегляду даних аудиту натисніть Переглянути дані.

CT-verifymerkletree-v1-2

Виберіть «Активи» та «Переглянути дані», щоб краще розуміти дані аудиту 2. Крім того, активи можна перевірити в дереві Меркла вручну, виконавши дії, описані в нашому посібнику. Щоб отримати дані, необхідні для ручної перевірки, натисніть Копіювати дані.

CT-verifymerkletree-v1-3

Виберіть Копіювати дані для ручної перевірки 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 }] }

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

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

CT-verifymerkletree-v1-4

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. Перевірте результат. Якщо перевірку пройдено, з’явиться повідомлення Перевірку шляху дерева Меркла пройдено (як показано нижче).

CT-verifymerkletree-v1-6

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

CT-verifymerkletree-v1-5

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