Как проверить, находятся ли активы вашей учетной записи в дереве Меркла
Что такое дерево Меркла
Дерево Меркла (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"}
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. Названия монет отсортированы по алфавиту.
1. Строка json имеет компактный формат без символов новой строки и пробелов.
2. Удалите недопустимый 0 в конце суммы монеты и сохраните только 8 цифр точности.
3. Названия монет отсортированы по алфавиту.
Родительский узел
hash = SHA256(h1 + h2 + balances)
· h1: Хеш-значение левого дочернего узла
· h2: Хеш-значение правого дочернего узла
· balances: Балансы левого дочернего узла + балансы правого дочернего узла, суммируется баланс той же монеты
· 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) тоже равны. (Обратите внимание, что когда родственный узел пуст, это указывает на отсутствие родственного узла, а хэш родительского узла вычисляется в соответствии с правилом заполняющего узла)
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. Если проверка пройдена, появится сообщение «Проверка пути дерева Меркла пройдена», а если проверка не пройдена, появится сообщение «Проверка пути дерева Меркла не удалась».
Вы также можете обратиться к инструкциям, приведенным в этом документе и к источнику [Исходный код инструмента проверки с открытым исходным кодом], чтобы самостоятельно написать программу проверки.