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)
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 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 do nó filho + 1, o nó raiz tem a altura máxima
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} |
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 Figura 1 (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 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"} |
Observação: A OKX introduziu o snapshot de ativos líquidos ao gerar a árvore de Merkle. Um débito (por exemplo, patrimônio negativo) será registrada no snapshot se o usuário tiver tomado ativos emprestados. Clique aqui para obter mais detalhes.
Etapas para verificação
1. Faça login em sua Conta da OKX e acesse Ativos > Auditorias para ver as auditorias recentes, depois selecione Exibir detalhes para ver seus dados de auditoria.
2. Você também pode verificar manualmente seus ativos na árvore de Merkle selecionando Copiar dados
3. 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. 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" } }
4. 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.
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 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:
7. Execute o comando e localize o diretório da pasta baixada. No nosso caso, insira o comando: cd ~/Downloads/proof-of-reserve 8. 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 identificados
9. 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:
10. 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.