Como verifico os ativos na árvore de Merkle da OKX? (Árvore de Merkle V2)
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)### Regra de hash
valor de hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"} - Nós folha (exceto nós de preenchimento)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=SHA256(nonce+balances) __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áximahash 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)
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%.
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} |
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) |
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"} |
Etapas para verificação
Faça login em sua [Conta da OKX] (https://www.okx.com/) e acesse Ativos > Auditorias para ver as auditorias recentes, depois selecione Exibir detalhes para ver seus dados de auditoria.
Selecione Ativos e Exibir detalhes para entender melhor a auditoria de dadosVocê também pode verificar manualmente seus ativos na árvore de Merkle selecionando Copiar dados
Selecione Copiar dados para o processo de verificação manualAbra 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" }
}
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.
Selecione Baixar para obter o relatórioBaixe a [ferramenta de verificação de código aberto da OKX] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator)
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:
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_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 identificadosVerifique 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] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator) e da [definição de árvore de Merkle da OKX] (#what-s-a-merkle-tree) 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.