arnaucube
arnaucube/go-circom-prover-verifierPublic Self-hosted repository
go-circom-prover-verifier/cli/cli.go
cli/cli.goRaw
  1package main
  2
  3import (
  4	"encoding/json"
  5	"flag"
  6	"fmt"
  7	"io/ioutil"
  8	"time"
  9
 10	"github.com/iden3/go-circom-prover-verifier/parsers"
 11	"github.com/iden3/go-circom-prover-verifier/prover"
 12	"github.com/iden3/go-circom-prover-verifier/verifier"
 13)
 14
 15const version = "v0.0.1"
 16
 17func main() {
 18	fmt.Println("go-circom-prover-verifier")
 19	fmt.Println("		", version)
 20
 21	prove := flag.Bool("prove", false, "prover mode")
 22	verify := flag.Bool("verify", false, "verifier mode")
 23
 24	provingKeyPath := flag.String("provingkey", "proving_key.json", "provingKey path")
 25	witnessPath := flag.String("witness", "witness.json", "witness path")
 26	proofPath := flag.String("proof", "proof.json", "proof path")
 27	verificationKeyPath := flag.String("verificationkey", "verification_key.json", "verificationKey path")
 28	publicPath := flag.String("public", "public.json", "public signals path")
 29
 30	flag.Parse()
 31
 32	if *prove {
 33		err := cmdProve(*provingKeyPath, *witnessPath, *proofPath, *publicPath)
 34		if err != nil {
 35			fmt.Println("Error:", err)
 36		}
 37		return
 38	} else if *verify {
 39		err := cmdVerify(*proofPath, *verificationKeyPath, *publicPath)
 40		if err != nil {
 41			fmt.Println("Error:", err)
 42		}
 43		return
 44	}
 45	fmt.Println("use -help for the list of commands")
 46}
 47
 48func cmdProve(provingKeyPath, witnessPath, proofPath, publicPath string) error {
 49	fmt.Println("zkSNARK Groth16 prover")
 50
 51	fmt.Println("Reading proving key file:", provingKeyPath)
 52	provingKeyJson, err := ioutil.ReadFile(provingKeyPath)
 53	if err != nil {
 54		return err
 55	}
 56	pk, err := parsers.ParsePk(provingKeyJson)
 57	if err != nil {
 58		return err
 59	}
 60
 61	fmt.Println("Reading witness file:", witnessPath)
 62	witnessJson, err := ioutil.ReadFile(witnessPath)
 63	if err != nil {
 64		return err
 65	}
 66	w, err := parsers.ParseWitness(witnessJson)
 67	if err != nil {
 68		return err
 69	}
 70
 71	fmt.Println("Generating the proof")
 72	beforeT := time.Now()
 73	proof, pubSignals, err := prover.GenerateProof(pk, w)
 74	if err != nil {
 75		return err
 76	}
 77	fmt.Println("proof generation time elapsed:", time.Since(beforeT))
 78
 79	proofStr, err := parsers.ProofToJson(proof)
 80	if err != nil {
 81		return err
 82	}
 83
 84	// write output
 85	err = ioutil.WriteFile(proofPath, proofStr, 0644)
 86	if err != nil {
 87		return err
 88	}
 89	publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
 90	if err != nil {
 91		return err
 92	}
 93	err = ioutil.WriteFile(publicPath, publicStr, 0644)
 94	if err != nil {
 95		return err
 96	}
 97	fmt.Println("Proof stored at:", proofPath)
 98	fmt.Println("PublicSignals stored at:", publicPath)
 99	return nil
100}
101
102func cmdVerify(proofPath, verificationKeyPath, publicPath string) error {
103	fmt.Println("zkSNARK Groth16 verifier")
104
105	proofJson, err := ioutil.ReadFile(proofPath)
106	if err != nil {
107		return err
108	}
109	vkJson, err := ioutil.ReadFile(verificationKeyPath)
110	if err != nil {
111		return err
112	}
113	publicJson, err := ioutil.ReadFile(publicPath)
114	if err != nil {
115		return err
116	}
117
118	public, err := parsers.ParsePublicSignals(publicJson)
119	if err != nil {
120		return err
121	}
122	proof, err := parsers.ParseProof(proofJson)
123	if err != nil {
124		return err
125	}
126	vk, err := parsers.ParseVk(vkJson)
127	if err != nil {
128		return err
129	}
130
131	v := verifier.Verify(vk, proof, public)
132	fmt.Println("verification:", v)
133	return nil
134}