Рынки
Спот
Фьючерсы
Финансы
Акции
Больше
Для новичков
Войти в систему

Как проверить, находятся ли активы вашей учетной записи в дереве Меркла

Что такое дерево Меркла
Дерево Меркла (Merkle Tree), также известное как Hash Tree, представляет собой структуру данных, обычно бинарное дерево, которое определенным образом вычисляет хэш-значение слой за слоем от листового узла до верхнего корневого узла.
Определение дерева Меркла CoinEx
Информация об узле
Информация, хранящаяся в каждом узле дерева, включает в себя: 1. Хэш-значение узла 2. Количество монет, охваченных снимками активов пользователя (в качестве примера возьмем BTC, ETH, USDT)
Хэш-значение{"BTC":"BTC баланс","ETH":"ETH баланс","USDT":"USDT баланс"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash-правила
Листовой узел
hash = SHA256(nonce + balances)
Например:
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Среди них CoinEx назначит каждому пользователю уникальный одноразовый номер. Этот одноразовый номер можно запросить в данных аудита; balances — это строка json, состоящая из количества монет, охватываемых снимком актива пользователя, например: {"BTC": "1.023" ,"ETH":"0","USDT":"20.2343322"}, следуйте следующим правилам:
1. Строка json имеет компактный формат без символов новой строки и пробелов.
2. Удалите недопустимый 0 в конце суммы монеты и сохраните только 8 цифр точности.
3. Названия монет отсортированы по алфавиту.
Родительский узел
hash = SHA256(h1 + h2 + balances)
· h1: Хеш-значение левого дочернего узла
· h2: Хеш-значение правого дочернего узла
· balances: Балансы левого дочернего узла + балансы правого дочернего узла, суммируется баланс той же монеты
Например:
Левый дочерний узел:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Правый дочерний узел:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Хэш родительского узла
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Заполнение правил узлов
Для построения полного дерева Меркла (полного бинарного дерева) требуются данные о 2 ^ n листовых узлах, но фактическое количество данных может быть недостаточным и может быть нечетным. В этом случае, если узел k не имеет одноуровневых узлов, заполнение автоматически сгенерирует одноуровневый узел k', хэш узла родственного узла (k') = hash (k), а количество монет узла k' полностью устанавливается равным нулю.
Например, узел K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Хэш родительского узла
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Правила проверки
1. Принцип проверки: Согласно определению дерева Меркла, хеш-значение родительского узла вычисляется из листового узла самого пользователя, пока не будет получено хеш-значение корневого узла (root). Хеш-значение корневого узла и узел пользователя сравнивается. Если два равны, то проверка пройдена, если значение неравны, проверка не пройдена.
2. Например, следующий текст json вычисляет хэш листового узла на основе пользовательских (self) данных, а затем вычисляет хэш родительского узла с каждым одноуровневым узлом на пути (path). Результирующий хэш узла должен быть равен хешу корневого узла (root), и балансы (balances) тоже равны. (Обратите внимание, что когда родственный узел пуст, это указывает на отсутствие родственного узла, а хэш родительского узла вычисляется в соответствии с правилом заполняющего узла)
Данные пути дерева Меркла (json текст):
{
    "root": {
        "balances": {
            "CET": "14373493.24153457",
            "ETH": "104543541.61407674",
            "USDC": "2419089.97192761",
            "USDT": "4836955256.81519091"
        },
        "hash": "c01a6c3b0fedde2a066f8a38968e40420c0b0742bb4ccda571a4349fb1c64f18"
    },
    "self": {
        "balances": {
            "USDT": "3990000"
        },
        "nonce": "9885b5df557ba3cec41a74347719a8a37d5792a1cf7f0e216510d60dd1b1fc95"
    },
    "path": [
        {
            "balances": {
                "CET": "10000.01994324",
                "USDC": "40000",
                "USDT": "1004.13066254"
            },
            "hash": "01f94322a74bee4431b809406997cee575bed3b85ef36b4ba3b2ff9dd140f99a",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "1000",
                "ETH": "0.90765244",
                "USDT": "143151.30772787"
            },
            "hash": "c99051749a3a83e60d1338454382044f9d7236928cfdc4b7fca1a7cc7450c7a6",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "548800.95984406",
                "ETH": "50000.00001068",
                "USDC": "9986.281143",
                "USDT": "62752.29303779"
            },
            "hash": "173a9a7ef562f1b537def5d58167d7402c8e268b1423c5f8e1d806cd0c524344",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "10023.01105146",
                "ETH": "9900.74253772",
                "USDT": "22516389.78119662"
            },
            "hash": "d79bd6c7a1536db199747061c119f98f86d99f9c7a8350fe63c6314ef3e8a24c",
            "pos": "right"
        },
        {
            "balances": {
                "CET": "5393361.46905487",
                "ETH": "23711.51394236",
                "USDC": "201404.61667184",
                "USDT": "230211961.3159725"
            },
            "hash": "115551fd3f85328d32858cc6d1bea9c1274984b0f8abba8140752f9d55e48277",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "1554146.8440552",
                "ETH": "100.0040003",
                "USDC": "160006.6",
                "USDT": "11201397.46983634"
            },
            "hash": "7b92897456af56f473b75d5e009be090726ad64694fd27971dc46f2631db51d8",
            "pos": "right"
        },
        {
            "balances": {
                "CET": "4712634.46013087",
                "ETH": "91469.27009748",
                "USDC": "1002463.00913027",
                "USDT": "830313049.62523756"
            },
            "hash": "0905786187f2c582902b84175813b063c31755a2930b25dee7ba005f7c8a7cf9",
            "pos": "right"
        },
        {
            "balances": {
                "CET": "2143526.47745487",
                "ETH": "104368359.17583576",
                "USDC": "1005229.4649825",
                "USDT": "3738515550.89151969"
            },
            "hash": "41dc5da7477fab3ac6fe233a1bf1bec0d26d0f5dea679b5d91f2f09c488fcb2f",
            "pos": "right"
        }
    ]
}
Этапы проверки
1. Войдите в свою учетную запись CoinEx, нажмите «Подтверждение резерва», перейдите на страницу «Подтверждение резерва» и нажмите «Копировать мой аудит».
2. Вставьте скопированные данные аудита в текстовый файл, например merkle_proof_file.json.
3. Скачайте [Инструмент проверки с открытым исходным кодом], предоставленный CoinEx.
4. Разархивируйте инструмент проверки, поместите распакованный файл и merkle_proof_file.json в одну папку, например ~/Downloads/proof-of-reserves.
5. Откройте терминал (MacOS: Terminal App; Windows: Terminal или PowerShell), введите cd ~/Downloads/proof-of-reserves, чтобы войти в указанный выше каталог.
6. Введите следующую команду для проверки ваших данных:
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Если проверка пройдена, появится сообщение «Проверка пути дерева Меркла пройдена», а если проверка не пройдена, появится сообщение «Проверка пути дерева Меркла не удалась».
Вы также можете обратиться к инструкциям, приведенным в этом документе и к источнику [Исходный код инструмента проверки с открытым исходным кодом], чтобы самостоятельно написать программу проверки.