Как проверить активы в дереве Меркла 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"}

Правило хеша

  • Листовые ноды (кроме нод заполнения)
хеш = SHA256 (нонс + балансы) 

OKX назначает каждому пользователю уникальный номер (нонс), который можно увидеть на странице аудита пользователя; балансы — это строка json, включающая суммы активов пользователей, которые были зафиксированы на снапшоте в результате аудита, например: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (ПРИМЕЧАНИЕ: необходимо удалить нули в конце значения и оставить 8 знаков после запятой)

  • Родительские ноды
хеш родительской ноды = SHA256 (h1 + h2 + (h1 сумма BTC + h2 сумма BTC) + (h1 сумма ETH + h2 сумма ETH) + (h1 сумма USDT + h2 сумма USDT) + высота) 

h1 = хеш левой дочерней ноды текущей ноды, h2 = хеш правой дочерней ноды текущей ноды, аудит_id = ID текущего аудита, высота = высота ноды h1 (или h2) Определение высоты: высота нижней листовой ноды = 1, высота родительской ноды = высота дочерней ноды + 1, корневая нода имеет максимальную высоту

Правило нод заполнения

Для построения полного дерева Меркла (полного двоичного дерева) необходимо 2^n листовых нод, но фактические данные могут не соответствовать этому требованию, а количество данных также может быть нечетным. В этом случае, если нода k не имеет родственной ноды, будет автоматически сгенерирована одна родственная нода k’ как нода заполнения, поэтому хеш (k') = хеш (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 + h2 сумма BTC) + (h1 сумма ETH + h2 сумма ETH) + (h1 сумма USDT + h2 сумма USDT) + высота) Итого: h6 = SHA256 (h3 + h4 + (1 + 0) + (2 + 0) + (4 + 0) + высота)

Как проверить, включены ли мои активы в дерево Меркла OKX?

Теория проверки

Основываясь на определении дерева Меркла OKX, можно вычислить хеш родительской ноды снизу вверх на основе ее левой и правой дочерних нод вплоть до получения хеша корневой ноды. После этого можно сравнить полученный хеш корневой ноды с хешем, полученным из корневой ноды пути дерева Меркла. Если они совпадают, то проверка считается пройденной, и наоборот.

  • Пример: посмотрите на рисунок выше и текст json ниже. На основе собственной ноды пользователя h3 и предоставленной родственной ноды h4 можно рассчитать хеш их родительской ноды h6. А при помощи родственной ноды h6 под названием h5 можно вычислить хеш их родительской ноды 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-reserves
  5. Введите приведенную ниже команду и нажмите Enter, чтобы начать проверку:
    Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
    Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json
    Примечание: если на устройстве Mac появляется ошибка «Приложение нельзя открыть, так как не удалось проверить разработчика», перейдите в Системные настройкиКонфиденциальность и безопасностьБезопасность − Выберите App Store и от подтвержденных разработчиков, чтобы разрешить [инструмент]
  6. Проверьте результат
    Если проверка пройдена, появится сообщение Merkle tree path validation passed, как показано ниже:
    CT-verifymerkletree-v1-6
    Если проверка не пройдена, появится сообщение Merkle tree path validation failed, как показано ниже:
    CT-verifymerkletree-v1-5
  7. Вы также можете использовать код инструмента проверки OKX с открытым исходным кодом (MerkleValidator) и определение дерева Меркла от OKX, чтобы написать программу самостоятельно. С помощью данных пути дерева Меркла, полученных на шаге 2, вы сможете убедиться, что ваши активы включены в дерево Меркла на основе снапшота аудита.