From 0ba5af4754173e19a8cd5f1cfb8afe5c65cd2f69 Mon Sep 17 00:00:00 2001 From: Balazs Komuves Date: Fri, 19 Jan 2024 12:56:22 +0100 Subject: [PATCH] use sparse matrices when doing fake trusted setup --- cli/cli_main.nim | 17 ++++++-- groth16/fake_setup.nim | 95 +++++++++++++++++++++++++++++++++++------- groth16/prover.nim | 10 +++++ 3 files changed, 103 insertions(+), 19 deletions(-) diff --git a/cli/cli_main.nim b/cli/cli_main.nim index 3a08375..1ebff17 100644 --- a/cli/cli_main.nim +++ b/cli/cli_main.nim @@ -178,11 +178,20 @@ proc cliMain(cfg: Config) = if cfg.measure_time: echo("parsing the r1cs took ",seconds(elapsed)) if cfg.do_setup: - echo("\nerror:setup is not yet implemented") - quit() + if not (cfg.zkey_file == ""): + echo("\nwe are doing a fake trusted setup, don't specify the zkey file!") + quit() + if (cfg.r1cs_file == ""): + echo("\nerror: r1cs file is required for the fake setup!") + quit() + echo("\nperforming fake trusted setup...") + let start = cpuTime() + zkey = createFakeCircuitSetup( r1cs, flavour=Snarkjs ) + let elapsed = cpuTime() - start + if cfg.measure_time: echo("fake setup took ",seconds(elapsed)) if cfg.do_prove: - if (cfg.wtns_file == "") or (cfg.zkey_file == ""): + if (cfg.wtns_file=="") or (cfg.zkey_file=="" and cfg.do_setup==false): echo("cannot prove: missing witness and/or zkey file!") quit() else: @@ -199,7 +208,7 @@ proc cliMain(cfg: Config) = exportPublicIO( cfg.io_file, proof ) if cfg.do_verify: - if (cfg.zkey_file == ""): + if (cfg.zkey_file == "" and cfg.do_setup==false): echo("cannot verify: missing vkey (well, zkey)") quit() else: diff --git a/groth16/fake_setup.nim b/groth16/fake_setup.nim index 45c467d..b75dcf4 100644 --- a/groth16/fake_setup.nim +++ b/groth16/fake_setup.nim @@ -7,6 +7,7 @@ # import sugar +import std/tables import constantine/math/arithmetic except Fp, Fr @@ -64,18 +65,21 @@ func r1csToCoeffs*(r1cs: R1CS): seq[Coeff] = return coeffs #------------------------------------------------------------------------------- +# Note: dense matrices can be very big, this is only feasible for small circuits -type Column*[T] = seq[T] +type DenseColumn*[T] = seq[T] -type Matrix*[T] = seq[Column[T]] +type DenseMatrix*[T] = seq[DenseColumn[T]] type - Matrices* = object - A* : Matrix[Fr] - B* : Matrix[Fr] - C* : Matrix[Fr] + DenseMatrices* = object + A* : DenseMatrix[Fr] + B* : DenseMatrix[Fr] + C* : DenseMatrix[Fr] -func r1csToMatrices*(r1cs: R1CS): Matrices = +#[ + +func r1csToDenseMatrices*(r1cs: R1CS): DenseMatrices = let n = r1cs.constraints.len let m = r1cs.cfg.nWires let p = r1cs.cfg.nPubIn + r1cs.cfg.nPubOut @@ -83,7 +87,7 @@ func r1csToMatrices*(r1cs: R1CS): Matrices = let logDomSize = ceilingLog2(n+p+1) let domSize = 1 shl logDomSize - var matA, matB, matC: Matrix[Fr] + var matA, matB, matC: DenseMatrix[Fr] for i in 0..