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