go-circom-prover-verifier/verifier/verifier.go
verifier/verifier.goRaw
1package verifier
2
3import (
4 "fmt"
5 "math/big"
6
7 bn256 "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare"
8 "github.com/iden3/go-circom-prover-verifier/types"
9)
10
11// Vk is the Verification Key data structure
12type Vk struct {
13 Alpha *bn256.G1
14 Beta *bn256.G2
15 Gamma *bn256.G2
16 Delta *bn256.G2
17 IC []*bn256.G1
18}
19
20func Verify(vk *types.Vk, proof *types.Proof, inputs []*big.Int) bool {
21 if len(inputs)+1 != len(vk.IC) {
22 fmt.Println("len(inputs)+1 != len(vk.IC)")
23 return false
24 }
25 vkX := new(bn256.G1).ScalarBaseMult(big.NewInt(0))
26 for i := 0; i < len(inputs); i++ {
27 // check input inside field
28 if inputs[0].Cmp(types.R) != -1 {
29 return false
30 }
31 vkX = new(bn256.G1).Add(vkX, new(bn256.G1).ScalarMult(vk.IC[i+1], inputs[i]))
32 }
33 vkX = new(bn256.G1).Add(vkX, vk.IC[0])
34
35 g1 := []*bn256.G1{proof.A, vk.Alpha.Neg(vk.Alpha), vkX.Neg(vkX), proof.C.Neg(proof.C)}
36 g2 := []*bn256.G2{proof.B, vk.Beta, vk.Gamma, vk.Delta}
37 return bn256.PairingCheck(g1, g2)
38}