snarkjs/src/verifier.js
src/verifier.jsRaw
1const G1Curve = require("./g1curve");
2const G2Curve = require("./g2curve");
3const GT = require("./gt");
4
5const G1 = new G1Curve();
6const G2 = new G2Curve();
7const Gt = new GT();
8
9const pairing = require("./pairing");
10
11module.exports = function isValid(vk_verifier, proof, publicSignals) {
12
13 let full_pi_a = proof.pi_a;
14 for (let s= 0; s< vk_verifier.nPublic; s++) {
15
16 full_pi_a = G1.add( full_pi_a, G1.mulEscalar( vk_verifier.A[s], publicSignals[s]));
17 }
18
19 if (! Gt.equal(
20 pairing( proof.pi_a , vk_verifier.vk_a ),
21 pairing( proof.pi_ap , G2.g )))
22 return false;
23
24 if (! Gt.equal(
25 pairing( vk_verifier.vk_b, proof.pi_b ),
26 pairing( proof.pi_ap , G2.g )))
27 return false;
28
29 if (! Gt.equal(
30 pairing( proof.pi_c , vk_verifier.vk_c ),
31 pairing( proof.pi_cp , G2.g )))
32 return false;
33
34 if (! Gt.equal(
35 pairing( full_pi_a , proof.pi_b ),
36 Gt.mul(
37 pairing( proof.pi_h , vk_verifier.vk_z ),
38 pairing( proof.pi_b , G2.g ),
39 ),
40 pairing( proof.pi_kp , vk_verifier.vk_g )))
41 return false;
42
43 if (! Gt.equal(
44 Gt.mul(
45 pairing( G1.add(full_pi_a, proof.pi_c) , vk_verifier.vk_gb_2 ),
46 pairing( vk_verifier.vk_gb_1 , proof.pi_b ),
47 ),
48 pairing( proof.pi_kp , vk_verifier.vk_g )))
49 return false;
50
51 return true;
52};