Experimental features

ZoKrates supports some experimental features.

Nova

ZoKrates supports the nova proof system using the bellperson backend. Nova is accessed with the subcommand nova.

API

To use Nova, programs must have the following signature, for any types State and StepInput:

def main(public State state, private StepInput step_input) -> State

Then, using Nova lets the user prove many steps of this program, given an initial state.

For example:

def main(public field sum, private field element) -> field {
    return sum + element;
}

We compile this program using the Pallas curve:

zokrates compile -i sum.zok --curve pallas

Then we can prove three iterations as follows:

echo "\"0\"" > init.json
echo "[\"1\", \"7\", \"42\"]" > steps.json
zokrates nova prove

The proof created at proof.json proves the statement 0 + 1 + 7 + 42 == 50.

We can extend it by running more steps, for example with the same intermediate inputs:

zokrates nova prove --continue

The proof updated at proof.json proves the statement 50 + (0 + 1 + 7 + 42) == 100.

Once we're done, we compress the proof to a compressed snark:

zokrates nova compress

Finally, we can verify this proof

zokrates nova verify

Limitations

  • The step circuit must be compiled with --curve pallas
  • The resulting recursive proof cannot currently be verified on the EVM