Come si verificano gli asset nell'albero di Merkle di OKX? (Albero di Merkle V2)
Sono applicabili al periodo di revisione dopo il mese di marzo 2023
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 in criptovaluta di un utente catturato dall'istantanea di audit (ad esempio BTC, ETH, USDT)
valore hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"} be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"} |
Regola hash - Leaf Node (eccetto i padding node)
hash=SHA256(nonce+balances) |
OKX assegnerà un nonce univoco per ogni utente, che può essere trovato nella pagina di audit dell'utente; balances è una stringa json composta dalle attività 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 node
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)+altezza) |
h1=Hash del child node sinistro del nodo corrente, h2=Hash del child node 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 root node ha l'altezza massima
Regola della divisione dei nodi
Per proteggere la privacy dei clienti, OKX dividerà in modo casuale gli asset degli utenti in due nodi, con un intervallo di casualità compreso tra 0 e 1. Ad esempio, se gli asset di un utente sono: {"BTC": "10.2", "ETH": "4", "USDT": "5"} e il numero casuale è 0,6, il patrimonio dell'utente sarà suddiviso in 60% e 40%.
Durante la successiva generazione dell'albero di Merkle, i leaf node divisi saranno rimescolati in modo casuale per distribuirli in posizioni diverse nell'albero.
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. es.
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 nella Figura 1 (nodo verde):
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)+altezza) |
Quindi: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+altezza)
Come posso verificare se i miei asset sono inclusi nell'albero di Merkle di OKX?
Teoria della verifica
Secondo la definizione dell'albero di Merkle OKX, è possibile calcolare il valore hash di un parent node procedendo dal basso verso l'alto, utilizzando i valori hash dei child node di sinistra e di destra. Alla fine si otterrà il valore hash del root node. È quindi possibile confrontare il valore hash calcolato del root node con quello ottenuto dal root node del percorso dell'albero di Merkle. Se corrispondono, la verifica ha esito positivo, altrimenti fallisce. Esempio: fare riferimento alla Figura 1 e al testo seguente, in base al self node dell'utente h3 e al suo sibling node h4, è possibile calcolare l'hash del parent node h6 e del sibling node h5 di h6, è possibile calcolare l'hash del parent node h7, quindi confrontare il valore dell'hash di h7 con quello raccolto nel root node del percorso dell'albero di Merkle e verificare se sono identici per completare il processo di verifica. Testo dei dati del percorso dell'albero di 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"} |
Nota: OKX ha introdotto l'istantanea degli asset netti durante la generazione dell'albero di Merkle. Un debito (ad esempio, un equity negativo) sarà registrato nell'istantanea se l'utente ha preso in prestito degli asset. Per maggiori dettagli, fare riferimento qui .
Fasi di verifica
1. Accedi al tuo conto OKX, vai su Asset > Audit per visualizzare gli audit recenti, seleziona Dettagli_ per visualizzare i tuoi dati di audit.
2. È anche possibile verificare manualmente gli asset nell'albero di Merkle selezionando Copia dati
3. Apri l'editor di testo (ad esempio, notebook), 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, abbiamo denominato il file "merkle_proof_file.json". Il testo json del percorso dei dati dell'albero Merkle viene mostrato nel seguente modo: { "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. Scarica i documenti dal link "Full Merkle Tree" sotto il report Responsabilità e decomprimi il file scaricato per ottenere un "documento dell'albero di Merkle completo".
Scarica lo strumento di verifica open-source di OKX (MerkleValidator)
Salva strumento OKX di verifica open-source di OKX (MerkleValidator) e i due file di dati (merkle_proof_file.json, full-liabilities-merkle-tree.txt) nella stessa cartella. Nel nostro caso: abbiamo inserito lo strumento e il file di dati nella cartella Downloads, denominata proof-of-reserves, come mostrato di seguito:
7. Esegui il comando e individua la directory della cartella dei download. Nel nostro caso, digita il comando: cd ~/Downloads/proof-of-reserve 8. Digita il comando seguente e dai invio per avviare la verifica:
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
Nota: Se utilizzi un Mac e appare "Impossibile aprire gli strumenti perché lo sviluppatore non può essere verificato", accedi a Preferenze di sistema > Sicurezza e privacy > Generale > Fai clic sul lucchetto per apportare modifiche > Consenti le app scaricate da App Store e da sviluppatori identificati
9. Controlla il risultato Se la verifica ha esito positivo, verrà mostrato il risultato Validazione percorso albero di Merkle superata, come di seguito:
Se la verifica fallisce, verrà mostrato il risultato Validazione percorso albero di Merkle fallita come di seguito:
10. 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.