Proof circuit input generator

This is a Nim program to generate inputs for the proof circuit, and also the main component of the circuit (it needs some global parameters).

Note: this is only for testing purposes, it's not optimized, and does not use real data.

Usage

$ ./cli [options] --output=proof_input.json --circom=proof_main.circom

available options:
 -h, --help                         : print this help
 -v, --verbose                      : verbose output (print the actual parameters)
 -d, --depth      = <maxdepth>      : maximum depth of the slot tree (eg. 32)
 -N, --maxslots   = <maxslots>      : maximum number of slots (eg. 256)
 -c, --cellsize   = <cellSize>      : cell size in bytes (eg. 2048)
 -b, --blocksize  = <blockSize>     : block size in bytes (eg. 65536)
 -s, --nslots     = <nslots>        : number of slots in the dataset (eg. 13)
 -n, --nsamples   = <nsamples>      : number of samples we prove (eg. 100)
 -e, --entropy    = <entropy>       : external randomness (eg. 1234567)
 -S, --seed       = <seed>          : seed to generate the fake data (eg. 12345)
 -f, --file       = <datafile>      : slot data file, base name (eg. "slotdata" would mean "slotdata5.dat" for slot index = 5)
 -i, --index      = <slotIndex>     : index of the slot (within the dataset) we prove
 -k, --log2ncells = <log2(ncells)>  : log2 of the number of cells inside this slot (eg. 10)
 -K, --ncells     = <ncells>        : number of cells inside this slot (eg. 1024; must be a power of two)
 -o, --output     = <input.json>    : the JSON file into which we write the proof input
 -C, --circom     = <main.circom>   : the circom main component to create with these parameters

You can generate only the .json or only the .circom file, or both at the same time.

There are some default values for all the rest of the parameters.

NOTE: When using actual files for the slot data (which is untested :), you will need all slots to be able to compute the dataset root. The convention used is that you specify the base name of the file, say "slotdata"; and the individual slots file names are derived from this to be for example "slotdata5.dat" for the slot with index 5 (note: indexing starts from 0).