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