Come verificare se i miei asset sono nell'Albero di Merkle
Cos'è un Albero di Merkle
L'albero di Merkle (Merkle Tree), noto anche come albero hash, è una struttura di dati, solitamente un albero binario, che calcola il valore di hash strato per strato, dal nodo foglia al nodo radice superiore in un modo specifico.
Definizione dell'albero di Merkle di CoinEx
Informazioni sul nodo
Le informazioni memorizzate in ciascun nodo dell'albero comprendono: 1. Valore di hash del nodo. 2. Il numero di monete coperte dalle istantanee degli asset dell'utente (prendiamo ad esempio BTC, ETH, USDT).
Valore di hash{"BTC":"Saldo BTC","ETH":"Saldo ETH","USDT":"Saldo USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Regole di hash
Nodo foglia
hash = SHA256(nonce + balances)
Ad esempio:
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Tra questi, CoinEx assegnerà un nonce univoco a ciascun utente, che potrà essere interrogato nei dati di verifica, mentre "balances" è una stringa json composta dal numero di monete coperte dalla snapshot degli asset dell'utente, come ad esempio: {"BTC": "1.023", "ETH": "0", "USDT": "20.2343322"}, segui le regole seguenti:
1. La stringa json è in formato compatto senza ritorni a capo e spazi.
2. Rimuovi lo 0 non valido dalla fine dell'importo della moneta e mantieni le 8 cifre di precisione.
3. I nomi delle monete sono ordinati in ordine alfabetico.
1. La stringa json è in formato compatto senza ritorni a capo e spazi.
2. Rimuovi lo 0 non valido dalla fine dell'importo della moneta e mantieni le 8 cifre di precisione.
3. I nomi delle monete sono ordinati in ordine alfabetico.
Nodo genitore
hash = SHA256(h1 + h2 + balances)
· h1: il valore di hash del Nodo figlio a sinistra
· h2: il valore di hash del Nodo figlio a destra
· balances: i saldi del Nodo figlio a sinistra + i saldi del Nodo figlio a destra, sommando il saldo dello stesso asset
· h2: il valore di hash del Nodo figlio a destra
· balances: i saldi del Nodo figlio a sinistra + i saldi del Nodo figlio a destra, sommando il saldo dello stesso asset
Ad esempio:
Nodo figlio a sinistra:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Nodo figlio a destra:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
L'hash del nodo genitore:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Compilazione delle regole del nodo
La costruzione di un albero di Merkle completo (binario completo) richiede 2^n dati di nodi foglia, ma il numero effettivo di dati potrebbe non essere sufficiente o pari. In questo caso, se un nodo k non ha un nodo fratello, la compilazione (padding) genererà automaticamente un nodo fratello k', e questo nodo fratello hash(k') = hash(k), e il numero di monete nel nodo k' sarà interamente impostato su zero.
Ad esempio, Nodo K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
L'hash del nodo genitore:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Regole di convalida
1. Principi di convalida: secondo la definizione di Albero di Merkle, il valore di hash del nodo genitore viene calcolato a partire dal nodo foglia dell'utente stesso, fino a ottenere il valore di hash del nodo radice, e il valore di hash del nodo radice viene confrontato. Se i due valori sono uguali, la convalida è approvata; in caso contrario, la convalida è fallita.
2. Ad esempio, il seguente testo json calcola prima l'hash del nodo foglia sulla base dei dati auto, quindi calcola l'hash del nodo genitore con ogni nodo fratello sul percorso e l'hash del nodo risultante dovrebbe essere uguale all'hash del nodo radice, con saldi equivalenti (non esiste un nodo fratello quando il nodo fratello compare vuoto e l'hash del nodo genitore viene calcolato in base alle regole di compilazione del nodo).
2. Ad esempio, il seguente testo json calcola prima l'hash del nodo foglia sulla base dei dati auto, quindi calcola l'hash del nodo genitore con ogni nodo fratello sul percorso e l'hash del nodo risultante dovrebbe essere uguale all'hash del nodo radice, con saldi equivalenti (non esiste un nodo fratello quando il nodo fratello compare vuoto e l'hash del nodo genitore viene calcolato in base alle regole di compilazione del nodo).
Dati del percorso dell'Albero di Merkle (testo json):
{ "root": { "balances": { "CET": "14373493.24153457", "ETH": "104543541.61407674", "USDC": "2419089.97192761", "USDT": "4836955256.81519091" }, "hash": "c01a6c3b0fedde2a066f8a38968e40420c0b0742bb4ccda571a4349fb1c64f18" }, "self": { "balances": { "USDT": "3990000" }, "nonce": "9885b5df557ba3cec41a74347719a8a37d5792a1cf7f0e216510d60dd1b1fc95" }, "path": [ { "balances": { "CET": "10000.01994324", "USDC": "40000", "USDT": "1004.13066254" }, "hash": "01f94322a74bee4431b809406997cee575bed3b85ef36b4ba3b2ff9dd140f99a", "pos": "left" }, { "balances": { "CET": "1000", "ETH": "0.90765244", "USDT": "143151.30772787" }, "hash": "c99051749a3a83e60d1338454382044f9d7236928cfdc4b7fca1a7cc7450c7a6", "pos": "left" }, { "balances": { "CET": "548800.95984406", "ETH": "50000.00001068", "USDC": "9986.281143", "USDT": "62752.29303779" }, "hash": "173a9a7ef562f1b537def5d58167d7402c8e268b1423c5f8e1d806cd0c524344", "pos": "left" }, { "balances": { "CET": "10023.01105146", "ETH": "9900.74253772", "USDT": "22516389.78119662" }, "hash": "d79bd6c7a1536db199747061c119f98f86d99f9c7a8350fe63c6314ef3e8a24c", "pos": "right" }, { "balances": { "CET": "5393361.46905487", "ETH": "23711.51394236", "USDC": "201404.61667184", "USDT": "230211961.3159725" }, "hash": "115551fd3f85328d32858cc6d1bea9c1274984b0f8abba8140752f9d55e48277", "pos": "left" }, { "balances": { "CET": "1554146.8440552", "ETH": "100.0040003", "USDC": "160006.6", "USDT": "11201397.46983634" }, "hash": "7b92897456af56f473b75d5e009be090726ad64694fd27971dc46f2631db51d8", "pos": "right" }, { "balances": { "CET": "4712634.46013087", "ETH": "91469.27009748", "USDC": "1002463.00913027", "USDT": "830313049.62523756" }, "hash": "0905786187f2c582902b84175813b063c31755a2930b25dee7ba005f7c8a7cf9", "pos": "right" }, { "balances": { "CET": "2143526.47745487", "ETH": "104368359.17583576", "USDC": "1005229.4649825", "USDT": "3738515550.89151969" }, "hash": "41dc5da7477fab3ac6fe233a1bf1bec0d26d0f5dea679b5d91f2f09c488fcb2f", "pos": "right" } ] }
Come effettuare la convalida
1. Accedi al conto di CoinEx, fai clic su "Prova delle riserve", accedi alla pagina e fai clic su "Copia la mia verifica".
2. Incolla i dati della verifica in un file di testo, come ad esempio "merkle_proof_file.json".
3. Scarica lo [Strumento di verifica open source] fornito da CoinEx.
4. Decomprimi lo strumento di convalida e inserisci il file decompresso e "merkle_proof_file.json" nella stessa cartella, ad esempio "~/Downloads/proof-of-reserves"
5. Apri il terminale (MacOS: Terminal App; Windows: Terminal o PowerShell), inserisci "cd ~/Downloads/proof-of-reserves" per accedere alla directory di cui sopra.
6. Inserisci il seguente comando per convalidare i tuoi dati:MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Se la convalida viene approvata, viene visualizzato il messaggio "Convalida del percorso dell'albero di Merkle superata". In caso contrario, verrà visualizzato il messaggio "Convalida del percorso dell'albero di Merkle fallita".
Per creare il tuo strumento di verifica, puoi anche fare riferimento alle istruzioni fornite in questo documento e al [Codice sorgente dello strumento di verifica open source].