package verifier import ( "fmt" "math/big" bn256 "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare" "github.com/iden3/go-circom-prover-verifier/types" ) // Vk is the Verification Key data structure type Vk struct { Alpha *bn256.G1 Beta *bn256.G2 Gamma *bn256.G2 Delta *bn256.G2 IC []*bn256.G1 } // Verify verifies the Groth16 zkSNARK proof func Verify(vk *types.Vk, proof *types.Proof, inputs []*big.Int) bool { if len(inputs)+1 != len(vk.IC) { fmt.Println("len(inputs)+1 != len(vk.IC)") return false } vkX := new(bn256.G1).ScalarBaseMult(big.NewInt(0)) for i := 0; i < len(inputs); i++ { // check input inside field if inputs[i].Cmp(types.R) != -1 { return false } vkX = new(bn256.G1).Add(vkX, new(bn256.G1).ScalarMult(vk.IC[i+1], inputs[i])) } vkX = new(bn256.G1).Add(vkX, vk.IC[0]) g1 := []*bn256.G1{proof.A, new(bn256.G1).Neg(vk.Alpha), vkX.Neg(vkX), new(bn256.G1).Neg(proof.C)} g2 := []*bn256.G2{proof.B, vk.Beta, vk.Gamma, vk.Delta} return bn256.PairingCheck(g1, g2) }