# # Groth16 prover # # WARNING! # the points H in `.zkey` are *NOT* what normal people would think they are # See # {.push raises:[].} import system import taskpools import constantine/math/arithmetic import constantine/named/properties_fields import groth16/bn128 import groth16/math/domain import groth16/math/poly import groth16/zkey_types #import groth16/misc import groth16/prover/types #------------------------------------------------------------------------------- proc randomMask*(): Mask = # masking coeffs let r = randFr() let s = randFr() let mask = Mask(r: r, s: s) return mask #------------------------------------------------------------------------------- # computes the vectors A*z, B*z, C*z where z is the witness func buildABC*( zkey: ZKey, witness: seq[Fr[BN254_Snarks]] ): ABC = let hdr: GrothHeader = zkey.header let domSize = hdr.domainSize var valuesAz = newSeq[Fr[BN254_Snarks]](domSize) var valuesBz = newSeq[Fr[BN254_Snarks]](domSize) for entry in zkey.coeffs: case entry.matrix of MatrixA: valuesAz[entry.row] += entry.coeff * witness[entry.col] of MatrixB: valuesBz[entry.row] += entry.coeff * witness[entry.col] else: raise newException(AssertionDefect, "fatal error") var valuesCz = newSeq[Fr[BN254_Snarks]](domSize) for i in 0..= 1) var ys = newSeq[Fr[BN254_Snarks]](n) ys[0] = xs[0] if n >= 1: ys[1] = eta * xs[1] var spow = eta for i in 2.. # proc computeSnarkjsScalarCoeffs*( abc: ABC, pool: TaskPool ): seq[Fr[BN254_Snarks]] = let n = abc.valuesAz.len assert( abc.valuesBz.len == n ) assert( abc.valuesCz.len == n ) let D = createDomain(n) let eta = createDomain(2*n).domainGen var outputA1, outputB1, outputC1: Isolated[seq[Fr[BN254_Snarks]]] var taskA1 = pool.spawn shiftEvalDomainTask( abc.valuesAz, D, eta, addr outputA1 ) var taskB1 = pool.spawn shiftEvalDomainTask( abc.valuesBz, D, eta, addr outputB1 ) var taskC1 = pool.spawn shiftEvalDomainTask( abc.valuesCz, D, eta, addr outputC1 ) discard sync taskA1 discard sync taskB1 discard sync taskC1 let A1 = outputA1.extract() let B1 = outputB1.extract() let C1 = outputC1.extract() var ys : seq[Fr[BN254_Snarks]] = newSeq[Fr[BN254_Snarks]]( n ) for j in 0..