package externalVerif import ( "encoding/json" "fmt" "io/ioutil" "github.com/arnaucube/go-snark/groth16" "github.com/arnaucube/go-snark/utils" ) type CircomProof struct { PiA [3]string `json:"pi_a"` PiB [3][2]string `json:"pi_b"` PiC [3]string `json:"pi_c"` } type CircomVk struct { IC [][3]string `json:"IC"` Alpha1 [3]string `json:"vk_alfa_1"` Beta2 [3][2]string `json:"vk_beta_2"` Gamma2 [3][2]string `json:"vk_gamma_2"` Delta2 [3][2]string `json:"vk_delta_2"` AlphaBeta12 [2][3][2]string `json:"vk_alpfabeta_12"` // not really used, for the moment in go-snarks calculed in verification time } func VerifyFromCircom(vkPath, proofPath, publicSignalsPath string) (bool, error) { // open verification_key.json vkFile, err := ioutil.ReadFile(vkPath) if err != nil { return false, err } var circomVk CircomVk json.Unmarshal([]byte(string(vkFile)), &circomVk) if err != nil { return false, err } var strVk utils.GrothVkString strVk.IC = circomVk.IC strVk.G1.Alpha = circomVk.Alpha1 strVk.G2.Beta = circomVk.Beta2 strVk.G2.Gamma = circomVk.Gamma2 strVk.G2.Delta = circomVk.Delta2 vk, err := utils.GrothVkFromString(strVk) if err != nil { return false, err } fmt.Println("vk parsed:", vk) // open proof.json proofsFile, err := ioutil.ReadFile(proofPath) if err != nil { return false, err } var circomProof CircomProof json.Unmarshal([]byte(string(proofsFile)), &circomProof) if err != nil { return false, err } strProof := utils.GrothProofString{ PiA: circomProof.PiA, PiB: circomProof.PiB, PiC: circomProof.PiC, } proof, err := utils.GrothProofFromString(strProof) if err != nil { return false, err } fmt.Println("proof parsed:", proof) // open public.json publicFile, err := ioutil.ReadFile(publicSignalsPath) if err != nil { return false, err } var publicStr []string json.Unmarshal([]byte(string(publicFile)), &publicStr) if err != nil { return false, err } publicSignals, err := utils.ArrayStringToBigInt(publicStr) if err != nil { return false, err } fmt.Println("publicSignals parsed:", publicSignals) verified := groth16.VerifyProof(vk, proof, publicSignals, true) return verified, nil }