Il punto principale

  • Nel novembre 2022, Binance ha rilasciato un sistema Proof of Reserves che utilizza la crittografia Merkle Tree per consentire agli utenti di verificare le proprie partecipazioni.

  • Binance ha ora migliorato la sua soluzione implementando zk-SNARK, una forma di prova a conoscenza zero.

  • Gli utenti possono ora verificare che il saldo netto totale di ciascun account non sia negativo e che tutte le risorse dell'utente facciano parte del saldo netto totale delle risorse dell'utente rivendicate da Binance, in modo privato e sicuro.

Dai un'occhiata a come funziona la nuova soluzione di prova di riserva di Binance. Combinando le informazioni di zk-SNARK e Merkle tree, gli utenti hanno un modo nuovo e migliore per verificare lo stato delle riserve di Binance.

Negli ultimi mesi, il team di sviluppo di Binance ha lavorato duramente per creare una prova di solvibilità all’avanguardia. Lo strumento è diventato uno strumento cruciale per gli scambi di criptovalute centralizzati nel mezzo della crisi di fiducia che ha colpito il settore in seguito al crollo di FTX. I fondi degli utenti detenuti su Binance sono garantiti con un rapporto 1:1, più le riserve, e trovare un modo per dimostrarlo al pubblico senza problemi è stata una parte importante del piano di Binance per ripristinare la fiducia del settore. 

Nel novembre 2022, abbiamo rilasciato un sistema di prova di riserva utilizzando la tecnica di crittografia dell'albero Merkle per consentire agli utenti di verificare le proprie partecipazioni su Binance. Sebbene questo sia un progresso nel garantire la trasparenza dei fondi degli utenti di Binance, il progetto iniziale di questa soluzione presentava due difetti:

  1. Per proteggere la privacy dell'utente, i nodi foglia nella prova Merkle rappresentano l'hash di proprietà dell'utente, pertanto la radice Merkle non può riflettere la quantità di informazioni sul saldo dei suoi nodi foglia.

  1. Le entità le cui riserve sono in fase di verifica potrebbero potenzialmente aggiungere un saldo negativo sotto un conto falso da qualche parte nell'albero per far apparire più piccole le riserve totali richieste. Il diagramma seguente tratto dal blog di Vitalik Buterin mostra un esempio di un albero Merkle dannoso (anche se in questo caso le radici riflettono la somma dei saldi di tutti i nodi foglia che potrebbero sollevare problemi di privacy).

Ora abbiamo una soluzione in grado di risolvere questo difetto e quindi rafforzare il sistema di prova della riserva di Binance. Facendo affidamento sul protocollo di prova a conoscenza zero, zk-SNARK, possiamo dimostrare che:

  1. Tutti i nodi foglia dell'albero Merkle hanno contribuito al saldo utente totale che Binance richiede per ciascuna risorsa.

  2. Nessun utente con un saldo netto totale negativo (l'intero valore in USD di tutte le risorse possedute dall'utente) è incluso nell'albero Merkle.

Una parola sui saldi negativi e sulle prestazioni

Poiché Binance offre prodotti di margine, prestito di criptovalute e trading di futures, il saldo di ogni asset crittografico di ciascun utente può essere costituito sia da attività che da passività. Il saldo di un utente per un particolare asset crittografico può essere negativo, ma il saldo netto totale di tutti gli asset crittografici non può essere negativo (poiché tutti i prestiti sono completamente garantiti).

In questo scenario ipotetico, supponiamo che Alice abbia depositato 10.000 BUSD in Binance, quindi utilizzato 4.000 BUSD come garanzia per prendere in prestito 2 BNB (ad un tasso di 1 BNB = 1.000 BUSD, presupponendo che Binance garantisca sempre un eccesso di garanzia). La tabella seguente mostra lo stato patrimoniale di Alice.

BNB (prezzo: 1000 BUSD)

BUSD (prezzo: 1 BUSD)

Saldo netto totale (BUSD)

Risorse

Obbligo

Risorse

Obbligo

ALICE

2

2

10000

0

10000

Se Alice poi scambia 1 BNB per 1.000 BUSD con Bob (che ha anche depositato 10.000 BUSD), il loro bilancio sarebbe simile a questo dopo che le operazioni sono state abbinate:

BNB (prezzo: 1000 BUSD)

BUSD (prezzo: 1 BUSD)

Saldo netto totale (BUSD)

Risorse

Obbligo

Risorse

Obbligo

ALICE

1

2

11000

0

10000

Bob

1

0

9000

0

10000

In questo caso, il saldo BNB di Alice ammonterebbe a -1, che non è un nodo valido nell'albero Merkle e include solo un asset: BNB. Tuttavia, se consideriamo il saldo netto totale, Alice è ancora pari a 10.000 BUSD.

Un'altra sfida deriva dall'entità della base utenti di Binance. Una soluzione praticabile dovrebbe generare prove utente e prove zk-SNARK per decine di milioni di utenti, alcuni dei quali potrebbero possedere più di 300 asset crittografici sulla nostra piattaforma. 

Nel complesso, desideriamo fornire la prova dei seguenti fatti entro un termine ragionevole:

  1. Le risorse di ogni utente Binance fanno parte del saldo totale del nostro utente dichiarato mostrato nell'istantanea. Gli utenti possono verificare il saldo utente totale dichiarato in base alle risorse detenute presso indirizzi controllati da Binance utilizzando un blockchain explorer (come Etherscan per portafogli Ethereum o BscScan per portafogli BNB Chain).

  2. Il saldo netto totale di ciascun utente non è negativo. Ciò significa che Binance non crea conti fittizi con saldi negativi per ridurre artificialmente la dimensione delle nostre riserve verificate.

Cos'è zk-SNARK?

Prima di immergerci nei dettagli della nostra soluzione, è necessaria una breve panoramica del meccanismo di prova a conoscenza zero. I protocolli a conoscenza zero come zk-SNARK consentono a una parte, vale a dire il prover, di dimostrare a un'altra parte, vale a dire il verificatore, che il prover ha eseguito un determinato calcolo accuratamente con determinati input sotto determinati vincoli, il tutto senza rivelare l'input. Il calcolo può richiedere molto tempo, ma i meccanismi matematici sottostanti possono aiutare i verificatori a valutare le prove in modo rapido e sicuro.

Il prover (Binance) inizia definendo l'insieme di vincoli computazionali che vuole dimostrare. I vincoli sono definiti in circuiti che possono essere espressi in un linguaggio di programmazione di alto livello (nel nostro caso, una versione biforcuta di gnark).

Il prover esegue quindi calcoli pesanti, esegue l'hashing degli ID e dei bilanci di tutti gli utenti e produce una prova computazionale che soddisfa i vincoli predefiniti. Per fare ciò utilizza tracce computazionali (testimoni) e input pubblici o privati. 

Il verificatore (utente) ottiene una prova e la verifica con l'input pubblico dal circuito per accertarsi che il calcolo sia stato eseguito accuratamente con tutti i vincoli soddisfatti. Il calcolo della verifica richiede un tempo molto breve rispetto al tempo della prova. Se il prover non produce una prova su un circuito predefinito, il prover non può produrre una prova valida per superare la verifica.

Per uno sguardo più approfondito su come funziona zk-SNARK, puoi consultare questa serie di articoli.

La nostra soluzione

L’elemento fondamentale di una soluzione migliorata di prova della riserva è ancora l’albero Merkle. Per l'esempio sopra, sarebbe simile a questo:

Oltre all'albero Merkle, manteniamo anche uno stato globale che rappresenta un elenco del saldo netto totale di ciascuna risorsa posseduta da ciascun cliente Binance.

Per dimostrare la nostra contingenza, costruiremo una dimostrazione zk-SNARK per la costruzione dell'albero di Merkle. Per ogni insieme di saldi utente – i nodi foglia dell’albero Merkle – il nostro circuito garantirà che:

  1. Il saldo di ciascuna risorsa di questo utente è incluso nell'elenco degli stati globali menzionato sopra.

  2. Il saldo netto totale dell'utente non è negativo. 

  3. Le modifiche alla radice dell'albero Merkle diventano effettive dopo l'aggiornamento di queste informazioni utente negli hash del nodo foglia.

Si prega di consultare queste specifiche tecniche e il nostro codice sorgente per il circuito (limitazioni) per i dettagli di implementazione. 

In ogni esempio di prova di suggerimento, pubblicheremo:

1. Merkle Proof: hash per ogni utente (per Alice, rappresentato dal nodo blu nella foto sopra).

2. Prova di zk-SNARK e input pubblico (hash dell'elenco dei saldi netti totali di ciascun asset e radice Merkle) del circuito per tutti gli utenti. 

Verificando la prova Merkle, gli utenti possono garantire che il loro bilancio sia incluso nella radice dell'albero Merkle. Verificando la prova zk-SNARK, gli utenti possono garantire che la costruzione dell'albero Merkle soddisfi i vincoli specificati nel circuito.

La sicurezza di questa soluzione dipende in gran parte dall'impostazione di chiavi di prova e chiavi di verifica. Stiamo lavorando alla creazione di chiavi decentralizzate. Parlando delle cerimonie di installazione decentralizzate basate sulla fiducia, le cerimonie di Ethereum offrono un buon esempio. Presto avremo una soluzione MPC per la configurazione trustless.

Prestazione

Dato il numero di utenti Binance i cui saldi devono essere inclusi, non c’è modo di ottenere un’unica prova dalla costruzione dell’albero Merkle che includa tutti gli utenti contemporaneamente. La soluzione a questo problema è dividere gli utenti in lotti di 864 ciascuno in modo da avere circuiti su scala più piccola e procedure di prova parallele.

Per un batch di 864 utenti in cui ciascun utente dispone di 350 asset diversi, supponiamo che il saldo di ciascun asset sia compreso nell'intervallo [0, 2^64-1]. Con un server a 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 prove contemporaneamente per generare prove per tutti gli account entro 2 ore. Il costo del server di questa prova per un'ora è di circa 0,56 USD, quindi il costo totale per generare tutte le prove zk che coprono tutti gli utenti è di circa 1000 USD.

Conclusione

Forniremo le prime iterazioni di prova utente generate da questa nuova soluzione nel nostro prossimo annuncio di prova di riserva. Inoltre, abbiamo reso open source i nostri elaboratori di dati degli utenti, prover, circuiti e verificatori, in modo che qualsiasi scambio centralizzato che si basa sul nostro stesso modello possa generare facilmente prove per i propri utenti e risorse. 

Ci auguriamo che ciò svolga un ruolo importante nel portare la trasparenza del settore delle risorse digitali a un nuovo livello.  Stiamo anche lavorando per implementare le soluzioni menzionate nel blog di Vitalik per ottenere prestazioni migliori, che ci permetteranno di fornire prove più frequentemente a costi inferiori.

Poiché questa è la prima versione del nostro zk-SNARK, speriamo di ricevere feedback dalla community in modo da poter continuare a migliorare il sistema.

Codice e ulteriori letture

  • Il nostro codice sorgente

  • Prova delle riserve di Binance: cos'è un albero Merkle

  • Binance Academy - Migliorare la trasparenza delle criptovalute con la prova a conoscenza zero

  • Il blog di Vitalik: Avere un CEX sicuro: prova di solvibilità e oltre