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