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