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

Publicado em 21 de mar. de 2023Atualizado em 11 de abr. de 2024Leitura de 7 minuto38

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)
Bash
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)
TOML, also INI
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
Bash
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):
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) 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:
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
 }]
}

Etapas para verificação

  1. 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.
    CT-verifymerkletree-v1-2Selecione Ativos e Exibir detalhes para melhor compreensão da auditoria de dados
  2. 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.
    CT-verifymerkletree-v1-3Selecione Copiar dados para o processo de verificação manual
  3. 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:
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
 }]
}
  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 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:
    CT-verifymerkletree-v1-4
  3. Abra o aplicativo de terminal (para Mac: Terminal; no Windows: Prompt de comando)
  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_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]
  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-verifymerkletree-v1-6
    Se a verificação for malsucedida, um resultado mostrando Erro na validação do caminho da árvore de Merkle será mostrado como abaixo:
    CT-verifymerkletree-v1-5
  7. 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.