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

Опубліковано 21 бер. 2023 р.Оновлено 11 квіт. 2024 р.2 хв читання40

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

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

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

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

  • Хеш-значення ноду
  • Сума криптовалют користувача, зафіксована на знімку аудиту (наприклад, BTC, ETH, USDT)
Bash
хеш-значення,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}

Правило хешування

  • Листові ноди (крім заповнювальних нодів)
TOML, also INI
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 даних шляху дерева Меркла:
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 даних шляху дерева Меркла:
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
  3. Відкрийте термінал (для Mac: Термінал у Windows: командний рядок).
  4. Виконайте команду та вкажіть каталог завантаженої папки. У нашому випадку введіть команду: cd ~/Downloads/proof-of-reserve
  5. Введіть команду нижче та натисніть клавішу введення, щоб почати перевірку.
    Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
    Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json
    Якщо під час користування Mac з’явилося повідомлення «Не вдається відкрити засіб, тому що неможливо перевірити розробника», перейдіть до Системних налаштувань > Безпека та конфіденційність > Безпека > дозвольте запуск програм, завантажених з App Store і від вказаних розробників у розділі «Безпека», щоб дозволити [засіб]
  6. Перевірте результат.
    Якщо перевірку пройдено, з’явиться повідомлення Перевірку шляху дерева Меркла пройдено (як показано нижче).
    CT-verifymerkletree-v1-6
    Якщо перевірку не пройдено, з’явиться повідомлення Перевірку шляху дерева Меркла не пройдено (як показано нижче).
    CT-verifymerkletree-v1-5
  7. Крім того, можна відкрити код засобу перевірки з відкритим кодом OKX (MerkleValidator) і визначення дерева Меркла від OKX, самостійно написати програму для перевірки того, чи ваші активи враховано в дереві Меркла, створеному на основі знімка аудиту, за даними шляху дерева Меркла, отриманими на кроці 2.