Como verifico os ativos na árvore de Merkle da OKX? (Árvore de Merkle V1)
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 de 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 de seu nó filho + 1, o nó raiz tem a altura máxima
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 imagem abaixo (nó verde):
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 verifico se meus ativos estão incluídos na árvore de Merkle da OKX?
Teoria da verificação
Com base na definição da árvore de Merkle da OKX, você pode calcular o valor de hash de um nó pai de baixo para cima com base em seus nós filho esquerdo e filho direito, até obter o valor de hash do nó raiz e, em seguida, comparar o valor de hash calculado do nó raiz com o valor coletado do nó raiz do caminho da árvore de Merkle; se forem idênticos, a verificação será aprovada e vice-versa.
- Exemplo: consulte a imagem acima e o texto json 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 json dos dados do caminho da árvore de Merkle: 
{ "self": { "balances": { "BTC": "1", "ETH": "1", "USDT": "1" }, "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c", "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6", "type": 1, "height": 1 }, "path": [{ "balances": { "BTC": "1", "ETH": "2", "USDT": "3" }, "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e", "type": 2, "height": 1 }, { "balances": { "BTC": "1", "ETH": "2", "USDT": "4" }, "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db", "type": 2, "height": 2 }, { "balances": { "BTC": "3", "ETH": "5", "USDT": "8" }, "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959", "type": 3, "height": 3 }] }
Etapas para verificação
- Para verificar se o saldo dos ativos da sua conta foi incluído como uma folha de Merkle, faça login em sua conta da OKX, selecione Ativos e acesse Auditorias para visualizar auditorias recentes, então selecione Exibir detalhes para visualizar seus dados de auditoria - Selecione Ativos e Exibir detalhes para melhor compreensão da auditoria de dados 
- Você também pode verificar manualmente seus ativos na árvore de Merkle seguindo as etapas do nosso guia. Obtenha os dados necessários para a verificação manual selecionando Copiar dados - Selecione Copiar dados para o processo de verificação manual 
- Após selecionar Copiar dados, 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. No nosso caso, nomeamos o arquivo como merkle_proof_file.json. O texto json dos dados do caminho da árvore de Merkle é mostrado abaixo: 
 { "self": { "balances": { "BTC": "1", "ETH": "1", "USDT": "1" }, "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c", "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6", "type": 1, "height": 1 }, "path": [{ "balances": { "BTC": "1", "ETH": "2", "USDT": "3" }, "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e", "type": 2, "height": 1 }, { "balances": { "BTC": "1", "ETH": "2", "USDT": "4" }, "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db", "type": 2, "height": 2 }, { "balances": { "BTC": "3", "ETH": "5", "USDT": "8" }, "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959", "type": 3, "height": 3 }] }
- Baixe a ferramenta de verificação de código aberto da OKX (MerkleValidator) 
- Salve a ferramenta de verificação de código aberto da OKX (MerkleValidator) e o arquivo de dados (merkle_proof_file.json) na mesma pasta. Nesse caso, a ferramenta e o arquivo de dados foram colocados na pasta Downloads e denominados proof-of-reserves, conforme mostrado abaixo: 
- Abra o aplicativo de terminal (para Mac: Terminal; no Windows: Prompt de comando) 
- Execute o comando e localize o diretório da pasta baixada. No nosso caso, insira o comando: cd ~/Downloads/proof-of-reserve 
- Digite o comando abaixo e dê enter para iniciar a verificação: 
 Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
 Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json
 Observação: se estiver usando Mac e encontrar uma caixa de diálogo "não é possível abrir as ferramentas porque o desenvolvedor não pode ser verificado", acesse Configurações do sistema > Privacidade e segurança > Segurança > Selecione App Store e desenvolvedores identificados na seção Segurança para permitir o uso da [ferramenta]
- 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: - Se a verificação for malsucedida, um resultado mostrando Erro na validação do caminho da árvore de Merkle será mostrado como abaixo: 
- 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.