mirror of
https://github.com/arnaucube/go-circom-prover-verifier.git
synced 2026-02-06 19:06:43 +01:00
refactor in sub packages
This commit is contained in:
39
verifier/verifier.go
Normal file
39
verifier/verifier.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package verifier
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/crypto/bn256"
|
||||
"github.com/iden3/go-circom-prover-verifier/prover"
|
||||
"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
|
||||
}
|
||||
|
||||
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[0].Cmp(prover.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, vk.Alpha.Neg(vk.Alpha), vkX.Neg(vkX), proof.C.Neg(proof.C)}
|
||||
g2 := []*bn256.G2{proof.B, vk.Beta, vk.Gamma, vk.Delta}
|
||||
return bn256.PairingCheck(g1, g2)
|
||||
}
|
||||
50
verifier/verifier_test.go
Normal file
50
verifier/verifier_test.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package verifier
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/iden3/go-circom-prover-verifier/parsers"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestVerify1(t *testing.T) {
|
||||
proofJson, err := ioutil.ReadFile("../testdata/big/proof.json")
|
||||
require.Nil(t, err)
|
||||
vkJson, err := ioutil.ReadFile("../testdata/big/verification_key.json")
|
||||
require.Nil(t, err)
|
||||
publicJson, err := ioutil.ReadFile("../testdata/big/public.json")
|
||||
require.Nil(t, err)
|
||||
|
||||
public, err := parsers.ParsePublicSignals(publicJson)
|
||||
require.Nil(t, err)
|
||||
proof, err := parsers.ParseProof(proofJson)
|
||||
require.Nil(t, err)
|
||||
vk, err := parsers.ParseVk(vkJson)
|
||||
require.Nil(t, err)
|
||||
|
||||
v := Verify(vk, proof, public)
|
||||
assert.True(t, v)
|
||||
}
|
||||
|
||||
func BenchmarkVerify(b *testing.B) {
|
||||
proofJson, err := ioutil.ReadFile("../testdata/big/proof.json")
|
||||
require.Nil(b, err)
|
||||
vkJson, err := ioutil.ReadFile("../testdata/big/verification_key.json")
|
||||
require.Nil(b, err)
|
||||
publicJson, err := ioutil.ReadFile("../testdata/big/public.json")
|
||||
require.Nil(b, err)
|
||||
|
||||
public, err := parsers.ParsePublicSignals(publicJson)
|
||||
require.Nil(b, err)
|
||||
proof, err := parsers.ParseProof(proofJson)
|
||||
require.Nil(b, err)
|
||||
vk, err := parsers.ParseVk(vkJson)
|
||||
require.Nil(b, err)
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
Verify(vk, proof, public)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user