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}