Como é que verifico os ativos na árvore Merkle da OKX? (Árvore de Merkle V1)

Publicado a 21/03/2023Atualizado a 13/10/2024Leitura de 8 minutos62

O que é uma árvore de Merkle?

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

Informação do nó

Cada nó da árvore armazena essa informação:

  • Valor de hash do nó

  • Montante da criptomoeda de um utilizador captado pelo instantâneo de auditoria (por exemplo, BTC, ETH, 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

  • Leaf Nodes (exceto nós de preenchimento)

hash=SHA256(nonce+balances)

O OKX atribuirá um nonce único a cada utilizador, que pode ser encontrado na página de auditoria do utilizador; balances é uma cadeia de carateres json composta pelos ativos e montantes dos utilizadores que foram capturados pela imagem de auditoria, por exemplo: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (NOTA: é necessário eliminar os zeros à direita e manter a precisão de 8 casas decimais)

  • 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 seu nó filho + 1, o nó raiz tem a altura máxima

Regra dos 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 atuais podem não satisfazer esse requisito e também pode haver um número ímpar de dados. Nestas circunstâncias, se o nó k não tiver nós irmãos, será automaticamente gerado um nó irmão k' como nó de preenchimento, de tal forma que hash(k')=hash(k), e os montantes dos ativos serão definidos como 0 para todas as moedas. Por exemplo:

Hash Saldos
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}

Neste exemplo, o nó de preenchimento h4=h3, e os saldos armazenados no nó são {"BTC": 0, "ETH": 0,"USDT": 0} , como mostrado na imagem abaixo (nó verde):

CT-verifymerkletree-v1-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) So: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)

Como faço para verificar se os 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, pode calcular o valor de hash de um nó pai de baixo para cima com base nos seus nós filho esquerdo e direito, até obter o valor de hash do nó raiz e, em seguida, pode comparar o valor de hash calculado do nó raiz com o valor recolhido do nó raiz do caminho da árvore de merkle, se forem idênticos, a verificação passa e vice-versa.

  • Exemplo: consulte a imagem acima e o texto json abaixo, com base no nó próprio do utilizador h3 e desde que o seu nó irmão h4, o hash do seu nó pai h6 possa ser calculado, e desde que o nó irmão h5 de h6, o hash do seu nó pai h7 possa ser calculado, depois compare o valor hash de h7 com o recolhido no nó raiz do caminho da árvore de merkle e veja se são idênticos para completar o processo de verificação.

  • dados do percurso da árvore de Merkle texto json

{ "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 }] }

Passos de verificação

  1. Para verificar se o saldo do ativo da sua conta foi incluído como uma folha de Merkle, inicie sessão na sua conta OKX, selecione Ativos e visite Auditorias para ver as auditorias recentes, selecione Ver detalhes para ver os seus dados de auditoria

    CT-verifymerkletree-v1-2

    Selecionar ativos e ver detalhes para uma melhor compreensão da auditoria de dados

  2. Também pode verificar manualmente os seus ativos na árvore de Merkle seguindo os passos do nosso guia. Obtenha os dados necessários para a verificação manual selecionando Copiar dados

    CT-verifymerkletree-v1-3

    Selecionar Copiar dados para o processo de verificação manual

  3. Depois de selecionar Copiar dados, abra o editor de texto (por exemplo, bloco de notas) e, em seguida, cole e guarde a cadeia de carateres json como um ficheiro json

Fases operacionais:

Mac:

  1. Abra o terminal, introduza o comando touch merkle_proof_file.json e, em seguida, será criado um ficheiro json. Por defeito, o ficheiro é guardado na secretária do sistema.

  2. Pode abrir o Finder e procurar por merkle_proof_file.json para encontrar este ficheiro. Abra este ficheiro json, cole os dados copiados e guarde-o.

Windows:

  1. Faça duplo clique para abrir um editor de texto (por exemplo, bloco de notas), cole os dados e guarde-os como um ficheiro json. No nosso caso, nomeamos o ficheiro como merkle_proof_file.json. O texto json de dados do caminho da árvore de Merkle é mostrado como apresentado 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 }] }

  2. Descarregar a ferramenta de verificação de código aberto OKX (MerkleValidator)

  3. Guardar a ferramenta de verificação de código aberto OKX (MerkleValidator) e o ficheiro de dados (merkle_proof_file.json) na mesma pasta. Neste caso, a ferramenta e o ficheiro de dados são colocados na pasta Downloads, e designados por proof-of-reserves, como se mostra abaixo:

    CT-verifymerkletree-v1-4
  4. Abra a aplicação de terminal (para Mac: Terminal enquanto Windows: Prompt de comando)

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

  6. Digite o comando abaixo e carregue no 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
    Nota: se estiver a utilizar o Mac e encontrar uma caixa de diálogo "não é possível abrir as ferramentas porque o programador não pode ser verificado", pode ir a Configurações do sistema > Privacidade e segurança > Segurança > Selecionar a App Store e programadores identificados na secção Segurança para permitir a [ferramenta]

  7. Verificar o resultado Se a verificação for bem sucedida, será apresentado um resultado que mostra A validação do caminho da árvore de Merkel foi bem sucedida, como se segue:

    CT-verifymerkletree-v1-6

    Se a verificação falhar, será apresentado um resultado com a indicação Falha na validação do percurso da árvore de Merkel, como indicado abaixo:

    CT-verifymerkletree-v1-5
  8. Também pode consultar o código da ferramenta de verificação de código aberto OKX (MerkleValidator) e definição de árvore de merkle OKX, escrever um programa para verificar se os seus ativos são capturados pela árvore de merkle construída a partir do instantâneo de auditoria, utilizando os dados do caminho da árvore de merkle recolhidos no passo 2