Mercado
Spot
Futuros
Finanças
Promoção
Mais
Zona de iniciantes
Fazer Login

Como examinar se os meus ativos estão na Árvore Merkle

O que é Árvore Merkle
Árvore Merkle (Merkle Tree), também conhecida como Árvore de Hash, é uma estrutura de dados, geralmente uma árvore binária, que calcula o valor de hash camada por camada, do node folha ao node raiz superior de uma maneira específica.
Definição da Árvore Merkle da CoinEx
Informações do Node
As informações armazenadas em cada node da árvore incluem: 1. Valor de hash do node. 2. O número de moedas cobertas pelos resumos de ativos do usuário (como BTC, ETH, USDT).
Valor de Hash{"BTC":"Saldo BTC","ETH":"Saldo ETH","USDT":"Saldo USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Regras de hash
Node folha
hash = SHA256(nonce + balances)
Por exemplo
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Entre eles, a CoinEx atribuirá um nonce (número arbitrário que só pode ser usado uma vez) exclusivo para cada usuário, que pode ser consultado nos dados de auditoria, enquanto "saldos" é uma string json composta pelo número de moedas cobertas pelo resumo de ativos do usuário, como: {"BTC" :"1.023", "ETH":"0", "USDT":"20.2343322"}, siga as regras abaixo:
1. A string json está em um formato compacto sem novas linhas e espaços.
2. Remova o 0 inválido no final do valor da moeda e mantenha 8 dígitos de precisão.
3. Os nomes das moedas são classificados em ordem alfabética.
Node Pai
hash = SHA256(h1 + h2 + balances)
· h1: O valor de hash do node filho à esquerda
· h2: O valor de hash do node filho à direita
· saldos: Os saldos do Node Filho à esquerda + os saldos do Node Filho à direita, somando o saldo do mesmo ativo
Por exemplo
Node filho à esquerda:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Node filho à direita:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Hash do node pai:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Regras de preenchimento do node
Construir uma Árvore Merkle completa (binário completo) requer 2^n dados do node folha, no entanto, o número real de dados pode não ser suficiente ou uniforme. Nesse caso, se um node k não tiver um node irmão, o preenchimento gerará automaticamente um node irmão k', e esse node hash(k') irmão = hash(k); o número de moedas no node k' será totalmente definido como zero.
Por exemplo, o node K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash do node pai:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Regras de Validação
1. Princípios de validação: De acordo com a definição da Árvore Merkle, o valor de hash do node pai é calculado a partir do node folha do próprio usuário, até que o valor de hash do node raiz seja obtido e o valor de hash do node raiz seja comparado. Se os dois forem iguais, a validação é aprovada; caso contrário, a validação falhou.
2. Por exemplo, o seguinte texto json primeiro calcula o hash do node folha com base nos dados próprios e, em seguida, calcula o hash do node pai com cada node irmão no caminho, e o hash do node resultante deve ser igual ao hash do node raiz, com os saldos equivalentes. (Observe que não há node irmão quando o node irmão exibe vazio e o hash do node pai é calculado de acordo com as regras do node de preenchimento)
Dados do trajeto da Árvore Merkle (texto 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"
        }
    ]
}
Como validar
1. Faça login na sua conta CoinEx, clique em "Comprovante de Reserva", entre na página e clique em "Copiar minha audição".
2. Cole os dados de auditoria copiados em um arquivo de texto, como merkle_proof_file.json.
3. Faça o download da [ferramenta de verificação de código aberto] fornecida pela CoinEx.
4. Descompacte a ferramenta de validação e coloque o arquivo descompactado merkle_proof_file.json na mesma pasta, como ~/Downloads/proof-of-reservas
5. Abra o terminal (MacOS: Terminal App; Windows: Terminal ou PowerShell), digite cd ~/Downloads/proof-of-reservas e vá para o diretório acima.
6. Digite o seguinte comando para validar seus dados:
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Se a validação for aprovada, o prompt será exibido como 'Validação de trajeto da árvore Merkle aprovada'. Caso contrário, o prompt será exibido como Falha na validação do trajéto da árvore Merkle.
Você também pode consultar as instruções fornecidas neste documento e no [Código-fonte da ferramenta de verificação de código aberto] para criar sua própria ferramenta de verificação.