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.