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

Publicado em 21 de mar. de 2023Atualizado em 1 de abr. de 2025Leitura de 9min30

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

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 e acesse Ativos > Auditorias para ver as auditorias recentes, depois selecione Exibir detalhes para ver seus dados de auditoria.

CT-web-POR-view audit details

Selecione 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 data

Selecione 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" } }

4. 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-7

Selecione Baixar para obter o relatório

  1. Baixe a ferramenta de verificação de código aberto da OKX (MerkleValidator)

  2. 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

7. Execute o comando e localize o diretório da pasta baixada. No nosso caso, insira o comando: cd ~/Downloads/proof-of-reserve 8. 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

9. 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

10. Você também pode consultar o código da ferramenta de verificação de código aberto da OKX (MerkleValidator) e da definição de árvore de Merkle da OKX 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.