snarkjs/src/prover.js
src/prover.jsRaw
1const bigInt = require("big-integer");
2
3const ZnField = require("./znfield.js");
4const G1Curve = require("./g1curve");
5const G2Curve = require("./g2curve");
6const PolField = require("./polfield.js");
7
8const F = new ZnField(bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617"));
9const G1 = new G1Curve();
10const G2 = new G2Curve();
11const PolF = new PolField(F);
12
13
14module.exports = function genProof(vk_proof, witness) {
15
16 const proof = {};
17
18 proof.pi_a = G1.zero();
19 proof.pi_ap = G1.zero();
20 proof.pi_b = G2.zero();
21 proof.pi_bp = G2.zero();
22 proof.pi_c = G1.zero();
23 proof.pi_cp = G1.zero();
24 proof.pi_kp = G1.zero();
25 proof.pi_h = G1.zero();
26
27
28 for (let s= vk_proof.nPublic; s< vk_proof.nSignals; s++) {
29
30 // pi_a = pi_a + A[s] * witness[s];
31 proof.pi_a = G1.add( proof.pi_a, G1.mulEscalar( vk_proof.A[s], witness[s]));
32
33 // pi_ap = pi_ap + Ap[s] * witness[s];
34 proof.pi_ap = G1.add( proof.pi_ap, G1.mulEscalar( vk_proof.Ap[s], witness[s]));
35 }
36
37 for (let s= 0; s< vk_proof.nSignals; s++) {
38 // pi_a = pi_a + A[s] * witness[s];
39 proof.pi_b = G2.add( proof.pi_b, G1.mulEscalar( vk_proof.B[s], witness[s]));
40
41 // pi_ap = pi_ap + Ap[s] * witness[s];
42 proof.pi_bp = G1.add( proof.pi_bp, G1.mulEscalar( vk_proof.Bp[s], witness[s]));
43
44 // pi_a = pi_a + A[s] * witness[s];
45 proof.pi_c = G1.add( proof.pi_c, G1.mulEscalar( vk_proof.C[s], witness[s]));
46
47 // pi_ap = pi_ap + Ap[s] * witness[s];
48 proof.pi_cp = G1.add( proof.pi_cp, G1.mulEscalar( vk_proof.Cp[s], witness[s]));
49
50 // pi_ap = pi_ap + Ap[s] * witness[s];
51 proof.pi_kp = G1.add( proof.pi_kp, G1.mulEscalar( vk_proof.Kp[s], witness[s]));
52 }
53
54 let polA = [];
55 let polB = [];
56 let polC = [];
57
58 for (let s= 0; s< vk_proof.nSignals; s++) {
59 polA = PolF.add(
60 polA,
61 PolF.mul(
62 vk_proof.polsA[s],
63 [witness[s]] ));
64
65 polB = PolF.add(
66 polB,
67 PolF.mul(
68 vk_proof.polsB[s],
69 [witness[s]] ));
70
71 polC = PolF.add(
72 polC,
73 PolF.mul(
74 vk_proof.polsC[s],
75 [witness[s]] ));
76 }
77
78 let polFull = PolF.sub(PolF.mul( polA, polB), polC);
79
80 const h = PolF.div(polFull, vk_proof.polZ );
81
82 for (let i = 0; i < h.length; i++) {
83 proof.pi_h = G1.add( proof.pi_h, G1.mulEscalar( vk_proof.hExps[i], h[i]));
84 }
85
86};