Come gli zk-SNARK migliorano il sistema di Prova delle Riserve di Binance
Informazioni principali
Nel novembre 2022 Binance ha rilasciato il suo sistema di Prova delle Riserve che utilizza la crittografia ad albero di Merkle per consentire agli utenti di verificare i propri asset.
Binance ha ora migliorato ulteriormente la sua soluzione implementando gli zk-SNARK, una forma di dimostrazione a conoscenza zero.
Ora gli utenti possono verificare che il saldo netto totale di ogni conto non sia negativo e che tutti gli asset degli utenti siano parte del saldo netto totale degli asset degli utenti dichiarato da Binance, in modo privato e sicuro.
Scopriamo la nuova soluzione per la prova delle riserve di Binance. Combinando zk-SNARK e le informazioni dell'albero di Merkle, questo sistema offre agli utenti un modo nuovo e più efficiente per verificare lo stato delle riserve di Binance.
Negli ultimi mesi, il team di sviluppatori di Binance ha lavorato sodo per costruire soluzioni avanzate di prova della solvibilità. Tali strumenti sono diventati fondamentali per gli exchange crypto centralizzati in seguito alla crisi di fiducia che ha travolto il settore dopo il crollo di FTX. I fondi degli utenti depositati su Binance sono coperti da un rapporto 1:1, oltre alle riserve, e trovare un modo per dimostrarlo al pubblico in modo semplice e diretto è diventata una parte importante del piano di Binance per ripristinare la fiducia del settore.
A novembre 2022 abbiamo rilasciato il nostro sistema di Prova delle Riserve che utilizza una tecnica crittografica ad albero di Merkle per consentire agli utenti di verificare i propri asset su Binance. Sebbene si tratti di un passo avanti verso la spinta alla trasparenza dei fondi degli utenti di Binance, il progetto iniziale di questa soluzione presentava due difetti:
Per proteggere la privacy degli utenti, i nodi foglia nella prova di Merkle rappresentavano l'hash degli asset degli utenti; pertanto, la radice di Merkle non poteva riflettere la somma delle informazioni sul bilancio dei suoi nodi foglia.
L'entità di cui si verificano le riserve poteva potenzialmente aggiungere un saldo negativo sotto un falso account posizionato da qualche parte nell'albero, per far apparire il totale delle riserve necessarie più piccolo rispetto alla realtà. Il seguente diagramma, tratto dal blog di Vitalik Buterin, mostra un esempio di albero di Merkle maligno (anche se, in questo caso, la radice riflette la somma dei saldi di tutti i nodi foglia, cosa che può introdurre problemi di privacy).
Ora abbiamo una soluzione che può ovviare a queste carenze e rafforzare il sistema di Prova delle Riserve di Binance. Basandoci su protocolli di dimostrazione a conoscenza zero, zk-SNARK, possiamo dimostrare che:
Tutti i nodi foglia dell'albero di Merkle hanno contribuito al saldo totale degli utenti di Binance per ogni asset.
Nell'albero di Merkle non è presente alcun utente con un saldo netto totale negativo (valore complessivo in USD di tutte gli asset detenuti dall'utente).
Un chiarimento sui saldi negativi e sulla performance
Poiché Binance offre prodotti con margine, prestiti crypto e trading futures, il saldo crypto di ciascun utente può essere composto da asset e passività. Il saldo di un utente su una particolare crypto può essere negativo, ma il suo saldo netto totale su tutte le crypto non dovrebbe essere negativo (poiché tutti i prestiti sono completamente collateralizzati).
In questo scenario ipotetico, supponiamo che Alice abbia depositato 10.000 BUSD su Binance e che abbia usato 4.000 BUSD come garanzia per prendere in prestito 2 BNB (a un tasso di 1 BNB = 1.000 BUSD, ipotizzando che Binance sia sempre sovra-collateralizzato). La seguente tabella mostra lo stato patrimoniale di Alice.
Se Alice scambia 1 BNB per 1.000 BUSD con Bob (che ha depositato anche lui 10.000 BUSD), il loro bilancio sarà il seguente dopo lo scambio:
In questo caso, il saldo BNB di Alice sarà pari a -1, che non è un nodo valido in un albero di Merkle e che copre solo un asset: BNB. Tuttavia, se si considerano i saldi netti totali, Alice è ancora a 10.000 BUSD.
Un'altra sfida deriva dalla vastità della base di utenti di Binance. Una soluzione valida deve generare una prova utente e una prova zk-SNARK per decine di milioni di utenti, alcuni dei quali possono detenere più di 300 crypto sulla nostra piattaforma.
In sintesi, vogliamo fornire la prova dei seguenti fatti entro un lasso di tempo ragionevole:
Gli asset di ciascun utente Binance fanno parte del saldo totale degli utenti indicato nell'istantanea. Gli utenti possono verificare il saldo totale dell'utente dichiarato rispetto agli asset detenuti agli indirizzi controllati da Binance utilizzando un blockchain explorer (come Etherscan per i wallet Ethereum o BscScan per i wallet BNB Chain).
Il saldo netto totale di ogni utente non è negativo. Questo vuol dire che Binance non ha mai creato conti fittizi con un saldo negativo per ridurre artificialmente le dimensioni delle nostre riserve verificate.
Cosa sono gli zk-SNARK?
Prima di addentrarci nei dettagli della nostra soluzione, è necessario fare una breve panoramica del meccanismo di dimostrazioni a conoscenza zero. I protocolli a conoscenza zero come zk-SNARK consentono a una parte, l'interessato, di dimostrare a un'altra parte, il verificatore, di aver eseguito con precisione determinati calcoli con determinati input e sotto determinati vincoli, senza rivelare gli input. Il calcolo può richiedere molto tempo, ma il meccanismo matematico sottostante può aiutare il verificatore a valutare la prova in modo rapido e sicuro.
L'interessato (Binance) inizia con la definizione di un insieme di vincoli della computazione che vuole dimostrare. I vincoli sono definiti in circuiti che possono essere espressi in un linguaggio di programmazione di livello superiore (nel nostro caso, una versione fork di gnark).
L'interessato esegue quindi il calcolo pesante, con l'hashing degli id e dei bilanci di tutti gli utenti, e genera la prova che il calcolo soddisfa i vincoli stabiliti in precedenza. Per farlo, utilizza la traccia di calcolo (testimone) e gli input pubblici o privati.
Il verificatore (utente) riceve la prova e la verifica con l'input pubblico del circuito per accertarsi che il calcolo sia stato eseguito con precisione e che tutti i vincoli siano stati rispettati. Il calcolo della verifica richiede un tempo estremamente ridotto rispetto al tempo di dimostrazione. Se il prover non genera la prova sui circuiti predefiniti, non può produrre una prova valida per superare la verifica.
Per dare un'occhiata più approfondita agli zk-SNARK, puoi consultare questa serie di articoli.
La nostra soluzione
L'elemento fondamentale della soluzione aggiornata per la prova delle riserve è ancora un albero di Merkle. Per l'esempio precedente, seguirà questa procedura:
Oltre all'albero di Merkle, manteniamo anche uno stato globale che rappresenta un elenco dei saldi netti totali di ogni asset che ogni cliente di Binance possiede.
Per dimostrare le nostre riserve, genereremo una prova zk-SNARK per la costruzione dell'albero di Merkle. Per l'insieme dei bilanci di ciascun utente, un nodo foglia dell'albero di Merkle, il nostro circuito si assicurerebbe che:
Il saldo di ogni asset di questo utente è incluso nell'elenco globale degli stati di cui sopra.
Il saldo netto totale dell'utente non è negativo.
La modifica della radice dell'albero di Merkle è valida dopo l'aggiornamento delle informazioni dell'utente nell'hash del nodo foglia.
Per i dettagli sull'implementazione, consulta le specifiche tecniche e il codice sorgente per il circuito (vincoli).
Per ogni dimostrazione delle nostre riserve, pubblicheremo:
1. La prova Merkle: gli hash per ogni utente (per Alice, rappresentato dai nodi blu nell'immagine precedente).
2. Le prove zk-SNARK e l'input pubblico (un hash dell'elenco dei saldi netti totali di ogni asset e la radice di Merkle) del circuito per tutti gli utenti.
Verificando la prova Merkle, gli utenti possono assicurarsi che il loro bilancio sia incluso nella radice dell'albero Merkle. Verificando la prova zk-SNARK, gli utenti possono assicurarsi che la costruzione dell'albero di Merkle soddisfi i vincoli definiti nel circuito.
La sicurezza di questa soluzione si basa molto sull'impostazione della chiave di prova e della chiave di verifica. Stiamo lavorando a una configurazione decentralizzata delle chiavi. Per quanto riguarda le cerimonie di impostazione decentralizzata esistenti, quella di Ethereum offre un buon esempio. Siamo molto vicini ad avere una soluzione MPC per rendere trustless l'impostazione.
Performance
Dato il numero enorme di utenti di Binance i cui saldi dovrebbero essere inclusi, non c'è modo di ottenere una singola prova della costruzione dell'albero di Merkle che copra tutti gli utenti contemporaneamente. Una soluzione a questo problema è la suddivisione degli utenti in lotti da 864 ciascuno, in modo da avere un circuito su scala ridotta e procedure di prova parallele.
Per un lotto che contiene 864 utenti in cui ogni utente possiede 350 asset diversi, supponiamo che il saldo di ogni asset sia compreso nell'intervallo [0, 2^64-1]. Con un server 32-core da 128 GB, il tempo di generazione della prova zk è di circa 110 secondi e il tempo di verifica della prova è inferiore a 1 millisecondo.
Binance avvierà 1000 prover contemporaneamente in modo da generare prove per tutti i conti in 2 ore. Il costo di questo server prover per un'ora è di circa 0,56 USD, quindi il costo totale della generazione di tutte le prove zk per tutti gli utenti sarebbe di circa 1.000 USD.
Conclusione
Forniremo la prima iterazione della prova per gli utenti generata da questa nuova soluzione in un successivo annuncio sulla Prova delle Riserve. Inoltre, abbiamo reso open-source il nostro processore di dati utente, il nostro prover, il nostro circuito e il nostro verificatore, in modo che ogni exchange centralizzato che si basi sul nostro stesso modello possa generare facilmente prove per i propri utenti e i loro asset.
Ci auguriamo che questo passo sia determinante per portare la trasparenza nel settore degli asset digitali a un nuovo livello. Stiamo lavorando anche all'implementazione della soluzione menzionata nel blog di Vitalik per ottenere prestazioni migliori, che ci consentiranno di fornire la prova con una frequenza maggiore e a un costo inferiore.
Poiché questa è la prima versione del nostro zk-SNARK, non vediamo l'ora di ricevere il feedback della comunità in modo da poter continuare a migliorare il sistema.