Как проверить активы в дереве Меркла OKX? (Дерево Меркла V2)

Опубликовано 21 мар. 2023 г.Обновлено 12 апр. 2024 г.3 мин на чтение24

Применимо к периоду аудита после марта 2023 года

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

Дерево Меркла (хеш-дерево) — это структура данных, которая обычно представляет собой двоичное дерево. Она использует предопределенные функции для вычисления хеша ноды снизу вверх, до верхней корневой ноды дерева.

Информация в ноде

Каждая нода дерева хранит следующую информацию:

  • Хеш ноды
  • Сумма криптовалюты пользователя, зафиксированная на снапшоте в результате аудита (в качестве примера возьмем BTC, ETH, USDT)
    значение хеша,{"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, корневая нода имеет максимальную высоту

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

Для защиты конфиденциальности клиентов OKX случайным образом разделяет активы пользователей на две ноды, при этом случайный диапазон находится в пределах от 0 до 1. Например, если у пользователя есть {"BTC": "10.2", "ETH": "4", "USDT": "5"}, а случайное число равно 0,6, то активы пользователя будут разделены в соотношении 60% и 40%.
CT-web-POR-4
При последующей генерации дерева Меркла разделенные листовые ноды будут смешаны случайным образом для распределения по различным позициям в дереве.

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

Для построения полного дерева Меркла (полного двоичного дерева) необходимо 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}, как показано на Рисунке 1 (зеленая нода): ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Рисунок 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, хеш родительской ноды можно вычислить снизу вверх, используя хеш ее левой и правой дочерних нод. В конечном итоге вы получите хеш корневой ноды. После этого можно сравнить полученный хеш корневой ноды с хешем от корневой ноды пути дерева Меркла. Если они совпадают, то проверка считается пройденной, и наоборот.
Пример: посмотрите на Рисунок 1 и текст ниже. На основе собственной ноды пользователя h3 и предоставленной родственной ноды h4 можно рассчитать хеш их родительской ноды h6. А при помощи родственной ноды h6 под названием h5 можно вычислить хеш их родительской ноды h7, после чего сравнить хеш h7 с хешем, полученным от корневой ноды пути дерева Меркла. Если они совпадают, то процесс проверки можно завершить.
Текст для данных пути дерева Меркла:

h7,3,{"BTC":"3","ETH":"5","USDT":"8"}
h6,2,{"BTC":"1","ETH":"2","USDT":"4"}
h5,2,{"BTC":"2","ETH":"3","USDT":"4"}
h4,1,{"BTC":"0","ETH":"0","USDT":"0"}
h3,1,{"BTC":"1","ETH":"2","USDT":"4"}
h2,1,{"BTC":"1","ETH":"2","USDT":"3"}
h1,1,{"BTC":"1","ETH":"1","USDT":"1"}
__Примечание__: OKX использует снапшоты чистых активов при генерации дерева Меркла. Если пользователь занимал активы, в снапшоте отобразится его долг (например, отрицательный капитал). Узнайте больше по ссылке .

Этапы проверки

  1. Войдите в свой [аккаунт OKX] (https://www.okx.com/), перейдите в раздел Активы > Аудиты для просмотра последних аудитов и нажмите Подробнее для изучения данных аудита.
    CT-web-POR-view audit detailsОткройте раздел «Активы» и нажмите «Подробнее» для изучения данных аудита

  2. Вы можете самостоятельно проверить свои активы в дереве Меркла, нажав Копировать данные
    CT-web-POR-copy dataНажмите «Копировать данные» для самостоятельной проверки

  3. Откройте текстовый редактор (например, блокнот), затем вставьте и сохраните строку json в виде файла json.

Этапы проверки

Mac: откройте терминал и введите команду touch merkle_proof_file.json, чтобы создать файл json. Файл по умолчанию сохранится на рабочем столе. Чтобы найти этот файл, можно открыть Finder и выполнить поиск merkle_proof_file.json. Откройте созданный файл json, вставьте скопированные данные и сохраните их.
Windows: дважды щелкните, чтобы открыть текстовый редактор (например, блокнот), вставьте данные и сохраните их как файл json.
В нашем случае мы назовем файл «merkle_proof_file.json». Текст json для данных пути дерева Меркла выглядит следующим образом:
{
"hash": "7e5a588806ff1de23f81e3a092860de43367fb4ea5503a53d95a5bc36d77e0c2",
"nodes": [
{ "balances": { "BTC": "0.49997703", "ETH": "0", "USDT": "16.62437479" },
"hash": "4087972e6b4bd3897c19f76b94b27db8eaf19f0d27d1b73e18297c18c850c3c1"
},
{ "balances": { "BTC": "0.40002297", "ETH": "0", "USDT": "12.18752303" },
"hash": "da14bd34c8d933781b8ec20a7e16109d0d650306b049da52c755437c4f7ec5e5" }
],
"nonce": "b6f6ea7584742839791ab923f4f1980d7ca3ff7c5d3f3fd9cc2a18c598503553",
"totalBalances": { "BTC": "0.9", "ETH": "0", "USDT": "28.81189782" }
}

  1. Скачайте «полное дерево Меркла» в разделе «Отчет об обязательствах» и распакуйте загруженный файл.
    CT-web-POR-7Нажмите «Скачать», чтобы получить отчет

  2. Загрузите инструмент проверки OKX с открытым исходным кодом (MerkleValidator)

  3. Сохраните инструмент проверки OKX с открытым исходным кодом (MerkleValidator) и файлы данных (merkle_proof_file.json, full-liabilities-merkle-tree.txt) в одной папке. В нашем случае мы поместили инструмент и файлы данных в папку Загрузки, где мы создали общую папку под названием proof-of-reserves, как показано ниже:
    CT-web-POR-8

  4. Запустите команду и укажите путь к загруженной папке. В нашем примере необходимо ввести команду: cd ~/Downloads/proof-of-reserves

  5. Введите приведенную ниже команду и нажмите Enter, чтобы начать проверку:
    Mac
    ./MerkleValidator --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Windows
    MerkleValidator.exe --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Примечание: если на устройстве Mac появляется ошибка «Приложение нельзя открыть, так как не удалось проверить разработчика», перейдите в Системные настройкиКонфиденциальность и безопасностьОбщиеНажмите на значок замка, чтобы внести измененияРазрешите использование приложений, загруженных из App Store и от подтвержденных разработчиков

  6. Проверьте результат
    Если проверка пройдена, появится сообщение Merkle tree path validation passed, как показано ниже:
    CT-web-POR-9 Если проверка не пройдена, появится сообщение Merkle tree path validation failed, как показано ниже:
    CT-web-POR-10

  7. Вы также можете использовать код инструмента проверки OKX с открытым исходным кодом (MerkleValidator) и [определение дерева Меркла от OKX] (#hats-a-merkle-tree), чтобы написать программу самостоятельно. С помощью данных пути дерева Меркла, полученных на шаге 2, вы сможете убедиться, что ваши активы включены в дерево Меркла на основе снапшота аудита.