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}