Witness
(Of a general purpose SNARK). All the circuit variables that the verifier does not see: the prover’s private inputs and all the intermediate values computed in the circuit.
In a general purpose SNARK, we call the witness the collection of values that the verifier does not read; either because they are private to the prover, or because they are too long to satisfy the succinctness property.
Consider the following example:
Peggy sends a string
stringto Victor and wants to convince him that she knows a secret valueseedsuch that applying theKeccakhash 1000 times to it producesstring. That is,string = Keccak(Keccak(...(Keccak(seed)...))).Peggy and Victor therefore agree on a SNARK circuit that takes
seedas a private input andstringas a public input. The circuit applies Keccak once toseedto produce a 1st intermediate value. This value is then fed into Keccak again, producing another intermediate value. This process is repeated 1000 times until a final value is produced. Finally, this last value is compared tostring.
In this example, Peggy wants to keep the value seed secret, so it must certainly be part of the witness. Secondly, notice that the circuit produces 1000 intermediate values. Victor (rightfully so) doesn’t care about these values and shouldn’t have to read through them! He just wants to see string and a short proof that Peggy is saying the truth. So the 1000 intermediate values are also part of the witness.