Come si verificano gli asset nell'albero di Merkle di OKX? (Albero di Merkle V1)

Data di pubblicazione: 21 mar 2023Data di aggiornamento: 11 apr 20246 minuti di lettura38

Che cos'è un albero di Merkle?

Un Albero di Merkle (o Albero hash) è una struttura di dati che normalmente è un albero binario. Utilizza funzioni predefinite per calcolare il valore hash di un nodo dal basso verso l'alto, fino al nodo radice superiore dell'albero.

Informazioni sul nodo

Ogni nodo dell'albero presenta le seguenti informazioni:

  • Valore hash del nodo
  • Importo della criptovaluta di un utente catturato dall'istantanea di audit (prendere BTC, ETH, USDT come esempio)
Bash
valore hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}

Regola hash

  • Leaf Nodes (eccetto i padding nodes)
TOML, also INI
hash=SHA256(nonce+balances)

OKX assegnerà un nonce unico per ogni utente, che può essere trovato nella pagina di audit dell'utente; balances è una stringa json composta dagli asset e dagli importi degli utenti che sono stati catturati dall'istantanea di audit, ad esempio: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (NOTA: è necessario eliminare gli zeri finali e mantenere 8 decimali di precisione)

  • Parent Nodes
Bash
hash di un parent node = SHA256(h1+h2+(h1 importo BTC+h2 importo BTC)+(h1 importo ETH+h2 importo ETH)+(h1 importo USDT+h2 importo USDT)+height)

h1 = Hash del child node sinistro del nodo corrente, h2 = Hash del nodo figlio destro del nodo corrente, audit_id = ID dell'audit corrente, height = altezza del nodo h1 (o h2) Definizione di altezza: altezza del leaf node inferiore=1, altezza di un parent node=altezza del suo child node + 1, il nodo radice ha l'altezza massima

Regola di padding node

Per costruire un albero di Merkle completo (un albero binario completo), sono necessari 2^n nodi foglia, ma i dati effettivi potrebbero non soddisfare tale requisito, e in alcuni casi è possibile ottenere un numero dispari di dati. In tali circostanze, se il nodo k non ha nodi fratelli, un nodo fratello k' sarà generato automaticamente come nodo di riempimento, in modo che hash(k')=hash(k), e gli importi degli asset saranno impostati a 0 per tutte le valute.
Ad esempio:

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

In questo esempio, il padding node h4=h3 e i saldi memorizzati nel nodo sono {"BTC": 0, "ETH": 0,"USDT": 0} , come mostrato nell'immagine seguente (nodo verde):
CT-verifymerkletree-v1-1
hash di un parent node = SHA256(h1+h2+(h1 importo BTC+h2 importo BTC)+(h1 importo ETH+h2 importo ETH)+(h1 importo USDT+h2 importo USDT)+height) Quindi: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)

Come faccio a verificare se i miei asset sono inclusi nell'albero di Merkle di OKX?

Teoria della verifica

In base alla definizione dell'albero di Merkle di OKX, è possibile calcolare il valore di hash di un nodo genitore dal basso verso l'alto in base ai nodi figli a destra e a sinistra, risalendo fino a ottenere il valore di hash del nodo radice. A questo punto, è possibile confrontare il valore di hash del nodo radice che è stato calcolato con quello ottenuto seguendo il percorso del nodo radice dell'albero di Merkle. Se sono identici, allora la verifica è considerata superata.

  • Esempio: fare riferimento all'immagine sopra e al testo json sotto, basandosi sul nodo self dell'utente h3 e fornendo il suo nodo fratello h4, è possibile calcolare l'hash del loro nodo genitore h6, e fornendo il nodo fratello h5 di h6, è possibile calcolare l'hash del loro parent node h7, quindi confrontare il valore dell'hash di h7 con quello raccolto nel nodo radice del percorso dell'albero di merkle e vedere se sono identici per completare il processo di verifica.
  • Testo json del percorso dei dati dell'albero 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
 }]
}

Fasi di verifica

  1. Per verificare se il saldo patrimoniale del tuo conto è stato incluso come foglia Merkle, accedi al tup conto OKX, seleziona Asset e vai su Audit per visualizzare gli audit recenti, seleziona Visualizza dettagli per visualizzare i tuoi dati di audit.
    CT-verifymerkletree-v1-2Seleziona gli asset e visualizza i dettagli per una migliore comprensione della verifica dei dati
  2. Puoi verificare manualmente i tuoi asset nell'albero di Merkle seguendo i passaggi indicati all'interno della nostra guida. Per ottenere i dati necessari per la verifica manuale, seleziona Copia dati.
    CT-verifymerkletree-v1-3Seleziona Copia dati per il processo di verifica manuale
  3. Dopo aver selezionato Copia dati, apri l'editor di testo (ad esempio, notebook), quindi incolla e salva la stringa json come file json.
    Fasi operative:
    Mac: apri il terminale, inserisci il comando touch merkle_proof_file.json e verrà creato un file json. Per impostazione predefinita, il file viene salvato nella scrivania del sistema. Puoi utilizzare l'opzione Trova e cercare merkle_proof_file.json per trovare questo file. Apri il file json, incolla i dati copiati e salvalo.
    Windows: fai doppio clic per aprire un editor di testo (ad esempio, notebook), incolla i dati e salvali come file json.
    Nel nostro caso, nominiamo il file merkle_proof_file.json. Il testo json del percorso dei dati dell'albero Merkle viene mostrato nel seguente modo:
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. Scarica lo strumento di verificaOKX open-source (MerkleValidator)
  2. Salva lo strumento di verifica open-source OKX (MerkleValidator) e il file di dati (merkle_proof_file.json) nella stessa cartella. In questo caso, lo strumento e il file di dati sono collocati nella cartella Download e denominati proof-of-reserves, come mostrato di seguito:
    CT-verifymerkletree-v1-4
  3. Apri l'applicazione terminale (per Mac: Terminale in Windows: Prompt dei comandi)
  4. Esegui il comando e individua la directory della cartella dei download. Nel nostro caso, inserisci il comando: cd ~/Downloads/proof-of-reserve
  5. Digita il comando seguente e dai invio per avviare la verifica:
    Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
    Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json
    Nota: se utilizzi un Mac e viene visualizzata una finestra di dialogo "non è possibile aprire gli strumenti perché lo sviluppatore non può essere verificato", è possibile andare su Impostazioni di sistema > Privacy e sicurezza > Sicurezza > Seleziona App Store e sviluppatori identificati nella sezione Sicurezza per consentire lo [strumento]
  6. Controlla il risultato
    Se la verifica viene superata, verrà mostrato il risultato Validazione percorso albero di Merkle superata come di seguito:
    CT-verifymerkletree-v1-6
    Se la verifica fallisce, verrà mostrato il risultato Validazione percorso albero di Merkle fallita come di seguito:
    CT-verifymerkletree-v1-5
  7. Puoi anche fare riferimento al codice di strumento di verifica open-source di OKX (MerkleValidator) e definizione dell'albero di merkle di OKX , scrivere da soli un programma per verificare che gli asset siano catturati dall'albero di Merkle costruito a partire dall'istantanea di audit, utilizzando i dati del percorso dell'albero di Merkle raccolti al punto 2.