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}