Como verifico os ativos na árvore de Merkle da OKX? (Árvore de Merkle V2)

Publicado em 21 de mar. de 2023Atualizado em 12 de abr. de 2024Leitura de 9 minuto24

Aplicável ao período de auditoria após março de 2023

O que é uma árvore de Merkle?

Uma Árvore de Merkle (ou Árvore de Hash) é uma estrutura de dados, que normalmente é uma árvore binária. Ela usa funções predefinidas para calcular o valor de hash de um nó de baixo para cima, até o nó raiz superior da árvore.

Informações do nó

Cada nó da árvore armazena estas informações:

  • Valor de hash do nó
  • Valor da criptomoeda de um usuário capturado pelo snapshot de auditoria (por exemplo, BTC, ETH e USDT)
    valor de hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
    be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}
    ### Regra de hash
  • Nós folha (exceto nós de preenchimento)
    hash=SHA256(nonce+balances)
    A OKX atribuirá um __nonce__ exclusivo para cada usuário, que pode ser encontrado na página de auditoria do usuário; __balances__ é uma string json composta dos ativos e valores dos usuários, que foram capturados pelo snapshot de auditoria, por exemplo: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (OBSERVAÇÃO: é necessário eliminar os zeros finais e manter 8 casas decimais de precisão) ### Nós pais
    hash de um nó pai = SHA256(h1+h2+(h1 BTC amount+h2 BTC amount)+(h1 ETH amount+h2 ETH amount)+(h1 USDT amount+h2 USDT amount)+height)
    __h1__=Hash do nó filho esquerdo do nó atual, __h2__=Hash do nó filho direito do nó atual, __audit_id__=ID da auditoria atual, __height__=a altura do nó h1 (ou h2) Definição de altura: altura do nó folha inferior = 1, altura de um nó pai = altura do nó filho + 1, o nó raiz tem a altura máxima

Regra de nós de divisão

Para proteger a privacidade dos clientes, a OKX dividirá aleatoriamente os ativos do usuário em dois nós, com o intervalo aleatório entre 0 e 1. Por exemplo, se os ativos de um usuário forem: {"BTC": "10.2", "ETH": "4", "USDT": "5"} e o número aleatório for 0,6, os ativos do usuário serão divididos em 60% e 40%.
CT-web-POR-4
Durante a geração subsequente da árvore de Merkle, os nós de folha divididos serão embaralhados aleatoriamente para distribuí-los em diferentes posições na árvore.

Regra de nós de preenchimento

Para construir uma árvore de Merkle completa (uma árvore binária completa), são necessários 2^n nós de folhas, mas os dados reais podem não atender a esse requisito e também pode haver um número ímpar de dados. Nessas circunstâncias, se o nó k não tiver nós irmãos, um nó irmão k' será gerado automaticamente como um nó de preenchimento, de modo que hash(k')=hash(k), e os valores dos ativos serão definidos como 0 para todas as moedas.
Por exemplo,

Hash balances
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}
Nesse exemplo, o nó de preenchimento h4=h3 e os saldos armazenados no nó são {"BTC": 0, "ETH": 0,"USDT": 0} , conforme mostrado na Figura 1 (nó verde): ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Figura 1*
hash de um nó pai = SHA256(h1+h2+(h1 BTC amount+h2 BTC amount)+(h1 ETH amount+h2 ETH amount)+(h1 USDT amount+h2 USDT amount)+height)
Portanto: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)

Como fverifico se meus ativos estão incluídos na árvore de Merkle da OKX?

Teoria da verificação

De acordo com a definição da árvore de Merkle da OKX, você pode calcular o valor de hash de um nó pai subindo a partir da base, usando os valores de hash dos nós filhos à esquerda e à direita. Por fim, você obterá o valor de hash do nó raiz. Em seguida, você pode comparar esse valor de hash calculado do nó raiz com o valor obtido do nó raiz do caminho da árvore de Merkle. Se forem iguais, a verificação será bem-sucedida; caso contrário, será malsucedida.
Exemplo: consulte a Figura 1 e o texto abaixo, com base no nó próprio do usuário h3 e fornecendo seu nó irmão h4, o hash de seu nó pai h6 pode ser calculado e, fornecendo o nó irmão h5 de h6, o hash de seu nó pai h7 pode ser calculado e, em seguida, compare o valor de hash de h7 com o coletado no nó raiz do caminho da árvore de Merkle e veja se eles são idênticos para concluir o processo de verificação.
Texto dos dados do caminho da árvore de Merkle:

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"}
__Observação__: A OKX introduziu o snapshot de ativos líquidos ao gerar a árvore de Merkle. Um débito (por exemplo, patrimônio negativo) será registrada no snapshot se o usuário tiver tomado ativos emprestados. Clique aqui para obter mais detalhes.

Etapas para verificação

  1. Faça login em sua [Conta da OKX] (https://www.okx.com/) e acesse Ativos > Auditorias para ver as auditorias recentes, depois selecione Exibir detalhes para ver seus dados de auditoria.
    CT-web-POR-view audit detailsSelecione Ativos e Exibir detalhes para entender melhor a auditoria de dados

  2. Você também pode verificar manualmente seus ativos na árvore de Merkle selecionando Copiar dados
    CT-web-POR-copy dataSelecione Copiar dados para o processo de verificação manual

  3. Abra o editor de texto (por exemplo, bloco de notas), cole e salve a string json como um arquivo json.

Etapas operacionais

Mac: Abra o terminal, insira o comando touch merkle_proof_file.json e, em seguida, um arquivo json será criado. Por padrão, o arquivo é salvo na área de trabalho do sistema. Você pode abrir o Finder e procurar por merkle_proof_file.json para encontrar esse arquivo. Abra esse arquivo json, cole os dados copiados e salve-o.
Windows: Clique duas vezes para abrir um editor de texto (por exemplo, bloco de notas), cole os dados e salve-os como um arquivo json.
Em nosso caso, nomeamos o arquivo como "merkle_proof_file.json". O texto json dos dados do caminho da árvore de Merkle é mostrado abaixo:
{
"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. Baixe a "Árvore de Merkle completa" em Relatório de passivo e descompacte o arquivo baixado para obter o arquivo da árvore de Merkle completa.
    CT-web-POR-7Selecione Baixar para obter o relatório

  2. Baixe a [ferramenta de verificação de código aberto da OKX] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator)

  3. Salve a ferramenta de verificação de código aberto da OKX (MerkleValidator) e os dois arquivos de dados (merkle_proof_file.json, full-liabilities-merkle-tree.txt) na mesma pasta. Em nosso caso: colocamos a ferramenta e o arquivo de dados na pasta Downloads, denominada proof-of-reserves, conforme mostrado abaixo:
    CT-web-POR-8

  4. Execute o comando e localize o diretório da pasta baixada. No nosso caso, insira o comando: cd ~/Downloads/proof-of-reserve

  5. Digite o comando abaixo e dê enter para iniciar a verificação:
    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
    Observação: - Se você estiver usando um Mac e receber uma mensagem de que "não é possível abrir a ferramenta porque o desenvolvedor não pode ser verificado", vá em__Preferências do Sistema__ > Segurança e Privacidade > Geral e clique no cadeado para permitir permitir aplicativos baixados de App Store e desenvolvedores identificados

  6. Verifique o resultado
    Se a verificação for aprovada, um resultado mostrando A validação do caminho da árvore de Merkle foi aprovada será mostrado como abaixo:
    CT-web-POR-9 Se a verificação for malsucedida, um resultado mostrando Erro na validação do caminho da árvore de Merkle será mostrado como abaixo:
    CT-web-POR-10

  7. Você também pode consultar o código da [ferramenta de verificação de código aberto da OKX] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator) e da [definição de árvore de Merkle da OKX] (#what-s-a-merkle-tree) e escrever um programa para verificar se seus ativos são capturados pela árvore de Merkle criada a partir do snapshot de auditoria, usando os dados de caminho da árvore de Merkle coletados na etapa 2.