mirror of
https://github.com/logos-storage/nim-groth16.git
synced 2026-04-23 20:53:06 +00:00
147 lines
4.7 KiB
Nim
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
|