package main import ( "encoding/json" "flag" "fmt" "io/ioutil" "os" "time" "github.com/iden3/go-circom-prover-verifier/parsers" "github.com/iden3/go-circom-prover-verifier/prover" "github.com/iden3/go-circom-prover-verifier/verifier" ) const version = "v0.0.1" func main() { fmt.Println("go-circom-prover-verifier") fmt.Println(" ", version) prove := flag.Bool("prove", false, "prover mode") verify := flag.Bool("verify", false, "verifier mode") convert := flag.Bool("convert", false, "convert mode, to convert between proving_key.json to proving_key.go.bin") provingKeyPath := flag.String("pk", "proving_key.json", "provingKey path") witnessPath := flag.String("witness", "witness.json", "witness path") proofPath := flag.String("proof", "proof.json", "proof path") verificationKeyPath := flag.String("vk", "verification_key.json", "verificationKey path") publicPath := flag.String("public", "public.json", "public signals path") provingKeyBinPath := flag.String("pkbin", "proving_key.go.bin", "provingKey Bin path") flag.Parse() if *prove { err := cmdProve(*provingKeyPath, *witnessPath, *proofPath, *publicPath) if err != nil { fmt.Println("Error:", err) } os.Exit(0) } else if *verify { err := cmdVerify(*proofPath, *verificationKeyPath, *publicPath) if err != nil { fmt.Println("Error:", err) } os.Exit(0) } else if *convert { err := cmdConvert(*provingKeyPath, *provingKeyBinPath) if err != nil { fmt.Println("Error:", err) } os.Exit(0) } flag.PrintDefaults() } func cmdProve(provingKeyPath, witnessPath, proofPath, publicPath string) error { fmt.Println("zkSNARK Groth16 prover") fmt.Println("Reading proving key file:", provingKeyPath) provingKeyJson, err := ioutil.ReadFile(provingKeyPath) if err != nil { return err } pk, err := parsers.ParsePk(provingKeyJson) if err != nil { return err } fmt.Println("Reading witness file:", witnessPath) witnessJson, err := ioutil.ReadFile(witnessPath) if err != nil { return err } w, err := parsers.ParseWitness(witnessJson) if err != nil { return err } fmt.Println("Generating the proof") beforeT := time.Now() proof, pubSignals, err := prover.GenerateProof(pk, w) if err != nil { return err } fmt.Println("proof generation time elapsed:", time.Since(beforeT)) proofStr, err := parsers.ProofToJson(proof) if err != nil { return err } // write output err = ioutil.WriteFile(proofPath, proofStr, 0644) if err != nil { return err } publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals)) if err != nil { return err } err = ioutil.WriteFile(publicPath, publicStr, 0644) if err != nil { return err } fmt.Println("Proof stored at:", proofPath) fmt.Println("PublicSignals stored at:", publicPath) return nil } func cmdVerify(proofPath, verificationKeyPath, publicPath string) error { fmt.Println("zkSNARK Groth16 verifier") proofJson, err := ioutil.ReadFile(proofPath) if err != nil { return err } vkJson, err := ioutil.ReadFile(verificationKeyPath) if err != nil { return err } publicJson, err := ioutil.ReadFile(publicPath) if err != nil { return err } public, err := parsers.ParsePublicSignals(publicJson) if err != nil { return err } proof, err := parsers.ParseProof(proofJson) if err != nil { return err } vk, err := parsers.ParseVk(vkJson) if err != nil { return err } v := verifier.Verify(vk, proof, public) fmt.Println("verification:", v) return nil } func cmdConvert(provingKeyPath, provingKeyBinPath string) error { fmt.Println("Convertion tool") provingKeyJson, err := ioutil.ReadFile(provingKeyPath) if err != nil { return err } pk, err := parsers.ParsePk(provingKeyJson) if err != nil { return err } fmt.Printf("Converting proving key json (%s)\nto go proving key binary (%s)\n", provingKeyPath, provingKeyBinPath) pkGBin, err := parsers.PkToGoBin(pk) if err != nil { return err } if err = ioutil.WriteFile(provingKeyBinPath, pkGBin, 0644); err != nil { return err } return nil }