| | 1 | = zero-knowledge proofs/arguments of knowledge: reading list = |
| | 2 | |
| | 3 | This page collects useful papers, articles, and links about |
| | 4 | multi-party computation and zero-knowledge proofs. |
| | 5 | |
| | 6 | == SNARKs == |
| | 7 | |
| | 8 | [http://tau.ac.il/~tromer/papers/csnark-20131007.pdf SNARKs for C: |
| | 9 | Verifying Program Executions Succinctly and in Zero Knowledge]: |
| | 10 | (Ben-Sasson, Chiesa, Genkin, Tromer, Virza). This defines the |
| | 11 | zk-SNARK (zero-knowledge Succinct Non-interactive ARgument of |
| | 12 | Knowledge) scheme used by Zerocash. |
| | 13 | |
| | 14 | This paper collects a number of previous clever ideas, adds some |
| | 15 | new ones, and finds ways to optimize the combination enough to make |
| | 16 | everything useful. The resulting system does the following: |
| | 17 | |
| | 18 | * compiles an arbitrary C program into a simple virtual machine |
| | 19 | named "TinyRAM" |
| | 20 | * performs a one-time key-generation phase that takes the program |
| | 21 | and limits on runtime and input size, and produces two keys: the |
| | 22 | "proving key" and the "verification key". The proving key is very |
| | 23 | big, while the verification key is pretty small. |
| | 24 | * for each run of the program (given some primary input): |
| | 25 | * the Prover runs the TinyRAM program in a special way that |
| | 26 | gathers information about its execution (order of execution, |
| | 27 | changes to memory values). It also gets "auxilliary input", |
| | 28 | which is not revealed to the verifier, and represents |
| | 29 | nondeterminism (somehow). |
| | 30 | * the Prover combines this information with the proving key to |
| | 31 | create the proof. These proofs are very small. |
| | 32 | * later, the Verifier can combine the proof, the primary input, |
| | 33 | and the verification key, and compute a single "accept/reject" |
| | 34 | value. Verifying a proof is much much faster than creating one. |
| | 35 | |
| | 36 | One example they use is a proof of a good solution for the |
| | 37 | "rectilinear Traveling Salesman Problem", whose input is the node |
| | 38 | locations (x,y), the starting point (x,y), and a distance bound. |
| | 39 | You can solve this problem by measuring the Manhattan distance for |
| | 40 | all possible routes (permutations of the non-starting-point nodes) |
| | 41 | and finding at least one whose total distance is lower than the |
| | 42 | bound. Their example uses such a solution as the "auxilliary |
| | 43 | input", and a TinyRAM program which sums the distances and compares |
| | 44 | it against the bound. The verifier learns that the program really |
| | 45 | does run and emits "yes", without learning what the route is. |
| | 46 | |
| | 47 | For a 200-node graph, their TinyRAM program had 1105 instructions |
| | 48 | and needed 11001 steps to complete. It took 247 minutes to create |
| | 49 | the proving and verification keys. The proving key was about 12GB |
| | 50 | (using an 80-bit security level), and the verification key was 620 |
| | 51 | bytes. It then took 155 minutes to create one instance of the |
| | 52 | proof, and the proof itself was 322 bytes. Verifying the proof took |
| | 53 | 0.11 seconds. |
| | 54 | |