# Sfiducia nel "sistema" e zkSNARKs
Un concetto fondamentale per spiegare l'utilitá degli zkSNARKs è la **Garanzia di Integrità Computazionale**.
Definiamo una computazione come un insieme di regole che possono essere espresse attraverso un programma informatico.
La computazione può essere semplice come sommare 2 numeri.

Una computazione più complessa è la validazione delle transazioni su una blockchain e la loro aggregazione in un blocco svolta da un miner.

In un network blockchain il motto è "don't trust, verify". Per questo motivo, migliaia di nodi sono chiamati a verificare che il miner abbia svolto il suo compito secondo le regole e senza, per esempio, aggiungere una valanga di token al proprio account.
Più formalmente, un nodo necessita una **Garanzia di Integrità Computazionale** riguardo l'operazione svolta dal miner affinchè possa approvarne l'operato.
Il modo naive per ottenere tale garanzie è rieffettuare la computazione con gli stessi input e verificare che l'output coincida.

Questo approccio ha un problema: il tempo di verifica cresce linearmente con il tempo necessario per eseguire la computazione original. Per raggiungere il consenso su un nuovo blocco, ogni nodo deve eseguire questa operazione computazionalmente intensiva. Questo è il principale ostacolo alla scalabilità di una Blockchain.
Gli zkSNARKs risolvono elegantemente questo problema fornendo un nuovo protocollo per eseguire qualsiasi computazione arbitraria che restituisce, insieme all'output, anche una prova π. Questa prova, pur essendo molto piccola, contiene abbastanza informazioni per fornire la Garanzia di Integrità Computazionale.

Per ottenere la Garanzia di Integrità Computazionale, il Nodo scettico non ha più bisogno di riprodurrre l'intero algoritmo, ma deve solo eseguire un programma leggero utilizzando π come input. Per molti protocolli zkSNARKs, il tempo di verifica è costante ed indipendente al tempo impiegato per eseguire la computazione originaria.

Una ulteriore caratteristica di tali protocolli, non rilevante in questo esempio, è che il Prover può decidere selettivamente cosa mantenere privato e cosa rendere pubblico; in altre parole, la prova fornisce al Verifier zero conoscenza riguardo a certi input e output della computazione.
Gli zkSNARKs sono utili in altri contesti per:
- Provare che un istituito finanziario sia solvente (**summa-dev**)
- Provare che un modello di machine learning esegua una funzione di inferenza come stabilito (**EZKL**)
- Provare che una foto non è soggetta a deep-fake (**zk-IMG**)
Gli zkSNARKs rappresentano un balzo in avanti significativo nella garanzia dell'integrità computazionale in qualsiasi contesto in cui sussista la mancanza di fiducia nei confronti dell'operatore del "sistema". Essi offrono un meccanismo che non solo riduce il carico computazionale necessario per validare le computazioni, ma lo fa mantenendo le proprietà di riservatezza.