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