2023-11-11 13:35:13 +01:00
|
|
|
|
2023-11-14 12:40:13 +01:00
|
|
|
|
2023-11-23 13:25:26 +01:00
|
|
|
import std/[times,os]
|
|
|
|
|
import strformat
|
2023-11-14 12:40:13 +01:00
|
|
|
|
2023-11-17 09:43:43 +01:00
|
|
|
import groth16/prover
|
|
|
|
|
import groth16/verifier
|
|
|
|
|
import groth16/files/witness
|
|
|
|
|
import groth16/files/r1cs
|
|
|
|
|
import groth16/files/zkey
|
|
|
|
|
import groth16/zkey_types
|
|
|
|
|
import groth16/fake_setup
|
2023-11-11 13:35:13 +01:00
|
|
|
|
2023-11-23 13:25:26 +01:00
|
|
|
func seconds(x: float): string = fmt"{x:.4f} seconds"
|
|
|
|
|
|
2023-11-11 13:35:13 +01:00
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
2023-11-22 15:55:18 +01:00
|
|
|
proc testProveAndVerify*( zkey_fname, wtns_fname: string): (VKey,Proof) =
|
2023-11-11 13:35:13 +01:00
|
|
|
|
|
|
|
|
echo("parsing witness & zkey files...")
|
|
|
|
|
let witness = parseWitness( wtns_fname)
|
|
|
|
|
let zkey = parseZKey( zkey_fname)
|
|
|
|
|
|
|
|
|
|
echo("generating proof...")
|
2023-11-14 12:40:13 +01:00
|
|
|
let start = cpuTime()
|
2023-11-11 14:37:31 +01:00
|
|
|
let proof = generateProof( zkey, witness )
|
2023-11-14 12:40:13 +01:00
|
|
|
let elapsed = cpuTime() - start
|
2023-11-23 13:25:26 +01:00
|
|
|
echo("proving took ",seconds(elapsed))
|
2023-11-11 13:35:13 +01:00
|
|
|
|
|
|
|
|
echo("verifying the proof...")
|
2023-11-17 09:43:43 +01:00
|
|
|
let vkey = extractVKey( zkey)
|
|
|
|
|
let ok = verifyProof( vkey, proof )
|
2023-11-11 13:35:13 +01:00
|
|
|
echo("verification succeeded = ",ok)
|
|
|
|
|
|
2023-11-22 15:55:18 +01:00
|
|
|
return (vkey,proof)
|
2023-11-11 14:37:31 +01:00
|
|
|
|
2023-11-11 13:35:13 +01:00
|
|
|
#-------------------------------------------------------------------------------
|
2023-11-13 19:40:15 +01:00
|
|
|
|
2023-11-22 15:55:18 +01:00
|
|
|
proc testFakeSetupAndVerify*( r1cs_fname, wtns_fname: string, flavour=Snarkjs): (VKey,Proof) =
|
2023-11-13 19:40:15 +01:00
|
|
|
echo("trusted setup flavour = ",flavour)
|
|
|
|
|
|
|
|
|
|
echo("parsing witness & r1cs files...")
|
|
|
|
|
let witness = parseWitness( wtns_fname)
|
|
|
|
|
let r1cs = parseR1CS( r1cs_fname)
|
|
|
|
|
|
|
|
|
|
echo("performing fake trusted setup...")
|
2023-11-23 13:25:26 +01:00
|
|
|
let start1 = cpuTime()
|
2023-11-13 19:40:15 +01:00
|
|
|
let zkey = createFakeCircuitSetup( r1cs, flavour=flavour )
|
2023-11-23 13:25:26 +01:00
|
|
|
let elapsed1 = cpuTime() - start1
|
|
|
|
|
echo("fake setup took ",seconds(elapsed1))
|
2023-11-13 19:40:15 +01:00
|
|
|
|
|
|
|
|
# printCoeffs(zkey.coeffs)
|
|
|
|
|
|
|
|
|
|
echo("generating proof...")
|
|
|
|
|
let vkey = extractVKey( zkey)
|
2023-11-14 12:40:13 +01:00
|
|
|
|
|
|
|
|
let start = cpuTime()
|
2023-11-13 19:40:15 +01:00
|
|
|
let proof = generateProof( zkey, witness )
|
2023-11-14 12:40:13 +01:00
|
|
|
let elapsed = cpuTime() - start
|
2023-11-23 13:25:26 +01:00
|
|
|
echo("proving took ",seconds(elapsed))
|
2023-11-13 19:40:15 +01:00
|
|
|
|
|
|
|
|
echo("verifying the proof...")
|
|
|
|
|
let ok = verifyProof( vkey, proof )
|
|
|
|
|
echo("verification succeeded = ",ok)
|
|
|
|
|
|
2023-11-22 15:55:18 +01:00
|
|
|
return (vkey,proof)
|