go-snark/externalVerif/circomVerifier.go
externalVerif/circomVerifier.goRaw
1package externalVerif
2
3import (
4 "encoding/json"
5 "fmt"
6 "io/ioutil"
7
8 "github.com/arnaucube/go-snark/groth16"
9 "github.com/arnaucube/go-snark/utils"
10)
11
12type CircomProof struct {
13 PiA [3]string `json:"pi_a"`
14 PiB [3][2]string `json:"pi_b"`
15 PiC [3]string `json:"pi_c"`
16}
17type CircomVk struct {
18 IC [][3]string `json:"IC"`
19 Alpha1 [3]string `json:"vk_alfa_1"`
20 Beta2 [3][2]string `json:"vk_beta_2"`
21 Gamma2 [3][2]string `json:"vk_gamma_2"`
22 Delta2 [3][2]string `json:"vk_delta_2"`
23 AlphaBeta12 [2][3][2]string `json:"vk_alpfabeta_12"` // not really used, for the moment in go-snarks calculed in verification time
24}
25
26func VerifyFromCircom(vkPath, proofPath, publicSignalsPath string) (bool, error) {
27 // open verification_key.json
28 vkFile, err := ioutil.ReadFile(vkPath)
29 if err != nil {
30 return false, err
31 }
32 var circomVk CircomVk
33 json.Unmarshal([]byte(string(vkFile)), &circomVk)
34 if err != nil {
35 return false, err
36 }
37
38 var strVk utils.GrothVkString
39 strVk.IC = circomVk.IC
40 strVk.G1.Alpha = circomVk.Alpha1
41 strVk.G2.Beta = circomVk.Beta2
42 strVk.G2.Gamma = circomVk.Gamma2
43 strVk.G2.Delta = circomVk.Delta2
44 vk, err := utils.GrothVkFromString(strVk)
45 if err != nil {
46 return false, err
47 }
48 fmt.Println("vk parsed:", vk)
49
50 // open proof.json
51 proofsFile, err := ioutil.ReadFile(proofPath)
52 if err != nil {
53 return false, err
54 }
55 var circomProof CircomProof
56 json.Unmarshal([]byte(string(proofsFile)), &circomProof)
57 if err != nil {
58 return false, err
59 }
60
61 strProof := utils.GrothProofString{
62 PiA: circomProof.PiA,
63 PiB: circomProof.PiB,
64 PiC: circomProof.PiC,
65 }
66 proof, err := utils.GrothProofFromString(strProof)
67 if err != nil {
68 return false, err
69 }
70 fmt.Println("proof parsed:", proof)
71
72 // open public.json
73 publicFile, err := ioutil.ReadFile(publicSignalsPath)
74 if err != nil {
75 return false, err
76 }
77 var publicStr []string
78 json.Unmarshal([]byte(string(publicFile)), &publicStr)
79 if err != nil {
80 return false, err
81 }
82 publicSignals, err := utils.ArrayStringToBigInt(publicStr)
83 if err != nil {
84 return false, err
85 }
86 fmt.Println("publicSignals parsed:", publicSignals)
87
88 verified := groth16.VerifyProof(vk, proof, publicSignals, true)
89 return verified, nil
90}