Как проверить, находятся ли активы вашей учетной записи в дереве Меркла
Что такое дерево Меркла
Дерево Меркла (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. Если проверка пройдена, появится сообщение «Проверка пути дерева Меркла пройдена», а если проверка не пройдена, появится сообщение «Проверка пути дерева Меркла не удалась».
Вы также можете обратиться к инструкциям, приведенным в этом документе и к источнику [Исходный код инструмента проверки с открытым исходным кодом], чтобы самостоятельно написать программу проверки.