nim-groth16/tests/groth16/testFakeSetup.nim
2026-01-29 12:43:03 +01:00

147 lines
4.7 KiB
Nim

import std/unittest
import groth16/bn128/fields
import groth16/fake_setup
import groth16/zkey_types
import groth16/files/r1cs
suite "fake setup":
const testWitnessCfg =
WitnessConfig( nWires: 5
, nPubOut: 1
, nPubIn: 1
, nPrivIn: 2
, nLabels: 0
)
const testConstraint1: Constraint = (
@[ (wireIdx: 0, value: oneFr) ] ,
@[ (wireIdx: 1, value: oneFr) ] ,
@[ (wireIdx: 2, value: oneFr) ]
)
const testConstraints: seq[Constraint] = @[ testConstraint1 ]
const testLabels: seq[int] = @[]
const testR1CS =
R1CS( r: primeR
, cfg: testWitnessCfg
, nConstr: testConstraints.len
, constraints: testConstraints
, wireToLabel: testLabels
)
test "create fake circuit setup - JensGroth":
let zkey = createFakeCircuitSetup( testR1CS, flavour=JensGroth )
check zkey.header.curve == "bn128"
check zkey.header.flavour == JensGroth
check zkey.header.nvars == testWitnessCfg.nWires
check zkey.header.npubs == testWitnessCfg.nPubOut + testWitnessCfg.nPubIn
test "create fake circuit setup - Snarkjs":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
check zkey.header.curve == "bn128"
check zkey.header.flavour == Snarkjs
check zkey.header.nvars == testWitnessCfg.nWires
check zkey.header.npubs == testWitnessCfg.nPubOut + testWitnessCfg.nPubIn
test "fake setup header consistency":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
let header = zkey.header
check header.domainSize == (1 shl header.logDomainSize)
check header.domainSize >= testR1CS.nConstr + header.npubs + 1
test "fake setup spec points":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
let spec = zkey.specPoints
check true
check true
test "fake setup verifier points":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
let vPoints = zkey.vPoints
let expectedLen = testWitnessCfg.nPubOut + testWitnessCfg.nPubIn + 1
check vPoints.pointsIC.len == expectedLen
test "fake setup prover points":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
let pPoints = zkey.pPoints
check pPoints.pointsA1.len == testWitnessCfg.nWires
check pPoints.pointsB1.len == testWitnessCfg.nWires
check pPoints.pointsB2.len == testWitnessCfg.nWires
check pPoints.pointsC1.len == testWitnessCfg.nWires - (testWitnessCfg.nPubOut + testWitnessCfg.nPubIn + 1)
check pPoints.pointsH1.len > 0
test "fake setup coefficients":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
check zkey.coeffs.len > 0
for coeff in zkey.coeffs:
check coeff.row >= 0
check coeff.col >= 0
check coeff.col < testWitnessCfg.nWires
test "random toxic waste":
let toxic1 = randomToxicWaste()
let toxic2 = randomToxicWaste()
check not isEqualFr(toxic1.alpha, toxic2.alpha) or
not isEqualFr(toxic1.beta, toxic2.beta) or
not isEqualFr(toxic1.gamma, toxic2.gamma) or
not isEqualFr(toxic1.delta, toxic2.delta) or
not isEqualFr(toxic1.tau, toxic2.tau)
test "R1CS to coefficients conversion":
let coeffs = r1csToCoeffs( testR1CS )
check coeffs.len > 0
var hasA = false
var hasB = false
for coeff in coeffs:
if coeff.matrix == MatrixA:
hasA = true
if coeff.matrix == MatrixB:
hasB = true
check hasA or hasB
test "R1CS to sparse matrices":
let matrices = r1csToSparseMatrices( testR1CS )
check matrices.A.len == testWitnessCfg.nWires
check matrices.B.len == testWitnessCfg.nWires
check matrices.C.len == testWitnessCfg.nWires
test "fake setup with different flavours produces different H points":
let zkey1 = createFakeCircuitSetup( testR1CS, flavour=JensGroth )
let zkey2 = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
check zkey1.pPoints.pointsH1.len == zkey2.pPoints.pointsH1.len
test "fake setup domain size":
let zkey = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
let domainSize = zkey.header.domainSize
check (domainSize and (domainSize - 1)) == 0
check domainSize >= testR1CS.nConstr + zkey.header.npubs + 1
test "fake setup consistency":
let zkey1 = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
let zkey2 = createFakeCircuitSetup( testR1CS, flavour=Snarkjs )
check zkey1.header.nvars == zkey2.header.nvars
check zkey1.header.npubs == zkey2.header.npubs
check zkey1.header.domainSize == zkey2.header.domainSize
check zkey1.pPoints.pointsA1.len == zkey2.pPoints.pointsA1.len