arnaucube
arnaucube/go-snarkPublic Self-hosted repository
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}