Blog.

Zero Knowledge Proof: zk-SNARK e zk-STARK | Prova a conoscenza zero


Autore
Andrea Provino
Data
Tempo di lettura
6 minuti
Categoria
Privacy Preserving

zero-knowledge-proof-zkp-zk-STARK-zk-SNARK

Una Prova a conoscenza zero, o Zero Knowledge Proof (ZKP), è uno straordinario sistema attraverso cui un prover è in grado di dimostrare a un verifier il possesso di un’informazione, definita witness, che soddisfi una specifica relazione, senza rivelare il witness al verifier o a chiunque altro.

In altri termini con un sistema basato su Prova a conoscenza zero, una persona può dimostrare di possedere una certa conoscenza senza rivelare alcuna informazione riguardo alla conoscenza stessa.

Avevamo trattato in precedenza le Prove a conoscenza zero in un precedente articolo introduttivo, senza però entrare nel merito, cosa che invece faremo oggi.

Devi sapere che esistono differenti versioni di Zero Knowledge Proof (ZKP) e con questo post inizieremo a esaminare le non-interactive zero knwowledge proofs, in cui il witness è un Data Blob (i.e. Dati di grandi dimensioni in formato binario) che può essere verificato senza alcuna interazione dal prover.

Zero Knowledge Proof di tipo Zk-SNARK

Zk-SNARK è acronimo di Zero Knowledge Succint Non-Interactive Argument of Knowledge.

Ora comprendiamo il significato di ciascuna di queste parole.

La prima, succint, è molto importante. Significa che le prove sono di piccole dimensioni, alcune centinaia di bytes anche per dichiarazioni su programmi molto grandi, e possono essere verificate velocemente, nell’ordine dei millisecondi.

Mentre Non-Interactive indica l’interazione nulla o comunque minima tra prover e verifier.

Teniamo infatti a mente che versioni precedenti di Zero Knowledge Proof richiedevano un’intensa comunicazione tra le due entità, ed erano pertanto definite Interactive.

Zk-SNARK richiede invece lo scambio di una sola prova.

Attualmente le prove zero knowledge proof di tipo Zk-SNARK dipendono da una configurazione iniziale che richiede una serie di parametri pubblici per elaborare le prove a conoscenza zero. Questo è il punto più delicato del protocollo, e per assicurarne l’integrità sono spesso adottate delle operazioni apparentemente stravaganti, ma necessarie a ragion veduta.

Tra poco potrò spiegarti meglio questo particolare.

Continuando l’analisi dell’acronimo, la parola Arguments si differenzia dalla Proof per alcuni aspetti tecnici su cui sorvoliamo per il momento.

Infine la parola of Knowledge allude all’impossibilità del prover di generare una proof (i.e. Argument in questo caso) senza essere effettivamente in possesso del witness, ovvero dell’informazione.

Cerchiamo di capire ora come funzioni questo tipo di protocollo a zero knowledge proof

Come funziona Zk-SNARK?

Il funzionamento del protocollo di Zk-SNARK si basa essenzialmente su tre algoritmi, che possiamo chiamare G, P e V e definiti come segue.

Key Generator G

L’algoritmo G e un key generator, che richiede un parametro segreto lambda 🤐 e un programma C 📑, generando due chiavi pubbliche:

  1. 🔑 proving key, o pk
  2. 🗝 verification key, vk

Queste due chiavi pubbliche devono essere generate una sola volta per ogni programma C 📑

Prover P

L’algoritmo P richiede la proving key 🔑, un numero pubblico x 🔓 e un witness w 🕵️‍♂️, per generare una proof 🧪

prf = P(pk, x, w) | 🧪 = P(🔑,🔓, 🕵️‍♂️)

La prova 🧪 indica che il prover conosce l’informazione 🕵️‍♂️ e che questa soddisfi il programma 📑.

Verifier V

Infine l’algoritmo verifier V richiede la prova 🧪 e il numero pubblico 🔓 per validare con la verification key 🗝 che la prova 🧪 sia effettivamente corretta restituendo true o false.

V(vk, x, prf ) | V(🗝, 🔓, 🧪) = true | false

Il parametro lambda

In questa danza di operazioni per assicurare il corretto funzionamento del protocollo di zero knowledge proof, il parametro lambda 🤐 è di cruciale importanza.

Infatti la sicurezza di Zk-SNARK si riduce al sistema con cui il parametro lambda è generato.

Chiunque sia in possesso di questo valore, sarebbe in grado di generare false prove 🧪 che all’atto della verifica risulterebbero valide. (e.g. Certificare che sia stata fatta una transazione di 1mld sul mio conto).

Questo perché dato un qualsiasi programma C 📑, e un numero pubblico x 🔓 una persona con lambda nota 🤐 potrebbe generare una falsa prova tale che V(vk, x, fake_prf) risulti vera senza conoscere il segreto w 🕵️‍♂️.

Ecco perché la generazione del segreto lambda, chiamato Common Reference String (CRS), richiede un processo altamente sicuro che garantisca che nessuno sia in possesso dell’informazione e la salvi da qualche parte.

Ancora meglio, una volta creato il CRS, le informazioni usate per la sua generazione, definite toxic waste, andrebbero eliminate assicurando l’impossibilità di ricreare lambda.

Ecco perché, nel tentativo di ovviare al problema, è possibile fare ricorso al Secure Multiparty computation.

La generazione dei parametri pubblici, le due chiavi, a partire da un parametro lambda creato partendo da una serie di informazione è chiamata setup cerymony.

In questo articolo puoi trovare un approfondimento tecnico e di qualità sulla setup cerymony per Zk-SNARK.

Applicazione di Zero knowledge proof in Zcash

Zcash è certamente l’applicazione meglio riuscita e diffusa di un protocollo Zk-SNARK. Contrariamente ad altre reti decentralizzate come blockchain, in cui le transazioni sono pubbliche, all’interno della rete Zcash i trasferimenti possono rimanere criptati.

A questo punto, la verifica della validità deve necessariamente passare da un sistema che consenta di validare la transazione assicurando che l’informazione criptata risulti corretta senza tuttavia decriptarla. E cioè che il witness 🕵️‍♂️ dietro la cifratura sia corretto senza che questa venga corrotta.

Anche qui, la sicura generazione delle chiavi pubbliche è cruciale per la sicurezza del sistema, ecco perché gli sviluppatori di Zcash hanno elaborato una complessa setup cerymony che puoi trovare qui.

Una cerimonia caratterizzata da persone con identità tutt’oggi sconosciuta, computer smontati per rimuovere antenne e trasformarli in air gapped pc, DVD-R non riscrivibili per il trasferimento da un PC all’altro e hash dei programmi per assicurare che nulla sia stato compromesso, con bonus di pubblicazione di stringe alfanumeriche su twitter.

Infine, per comprendere come Zk-SNARK sia effettivamente usato in Zcash ti esorterei a leggere questa paper.

Angolo sviluppatori

Chiudiamo il discorso Zk-SNARK con una nota pratica che da sempre caratterizza il blog. Propongo infatti Zokrates, un toolbox per creare Zk-SNARK su rete Ethereum.

Zero Knowledge Proof di tipo Zk-STARK

Le Prove a conoscenza zero di tipo Zk-STARK sono state create come variante migliorativa delle Zk-SNARK, e offrono maggiori velocità implementative nonché un’elevata trasparenza (T, Transaprent nell’acronimo) evitando la necessità di una configurazione iniziale fidata.

Tale vantaggio è ottenuto sfruttando una configurazione basata su crittografia simmetrica con funzioni di hash resistenti alla collisione, e più sicure in un epoca post-quant.

In definitiva, a fronte di un costo computazionale costante anziché crescente all’aumentare della dimensione del programma C iniziale, come rilevato per le Zero Knowledge Proof tipo Zk-SNARK, quelle Zk-STARK garantiscono prestazioni migliori e inferiori comunicazioni tra prover e verifier.

Per il momento è tutto.

Per aspera, ad astra.

Un caldo abbraccio, Andrea

Taggedprivacy


Ultimi post

Patricia Merkle Trie

Il Practical Algorithm To Retrieve Information Coded In Alphanumeric Merkle Trie, o Patricia Merkle Trie è una struttura dati chiave-valore usatada Ethereum e particolarmente efficiente per il salvataggio e la verifica dell’integrità dell’informazione. In questo post ne studieremo le caratteristiche. Prima di procedere, ci conviene ripassare l’introduzione al Merkle Tree nella quale abbiamo chiarito il […]

Andrea Provino
ethereum-patricia-merkle-tree
Tree Data Structure: cos’è un Merkle Tree

Un Merkle Tree è una struttura dati efficiente per verificare che un dato appartenga a un insieme esteso di elementi. È comunemente impiegato nelle Peer to Peer network in cui la generazione efficiente di prove (proof) contribuisce alla scalabilità della rete. Capire i vantaggi di questa struttura ci tornerà utile nel nostro percorso di esplorazione […]

Andrea Provino
merkle-tree-cover
UTXO: come funziona il modello Unspent Transaction Outputs

Per tenere traccia dei bilanci utente, la blockchain di Bitcoin sfrutta un modello di contabilità definito UTXO o Unspent Transaction Outputs. In questo articolo ne esaminiamo le caratteristiche. Ogni blockchain è dotata di un sistema di contabilità, un meccanismo attraverso cui tenere traccia dei bilanci di ciascun utente. I due grandi modelli di riferimento nel […]

Andrea Provino
bitcoin-utxo
Cos’è Ethereum

Possiamo definire Ethereum come una macchina a stati distribuita che traccia le transizioni di un archivio dati general-purpose (i.e. una memoria in grado di registrare qualsiasi dato esprimibile come coppia di chiave e valore o key-value) all’interno della Ethereum Blockchain. È arrivato il momento di esplorare uno dei progetti tecnologici più innovativi e interessanti degli […]

Andrea Provino
ethereum