mirror of
https://github.com/arnaucube/go-circom-prover-verifier.git
synced 2026-02-07 19:36:42 +01:00
91 lines
3.0 KiB
Markdown
91 lines
3.0 KiB
Markdown
# go-circom-prover-verifier [](https://godoc.org/github.com/iden3/go-circom-prover-verifier) [](https://goreportcard.com/report/github.com/iden3/go-circom-prover-verifier) [](https://github.com/iden3/go-circom-prover-verifier/actions?query=workflow%3ATest)
|
|
|
|
Go implementation of the [Groth16 protocol](https://eprint.iacr.org/2016/260.pdf) zkSNARK prover & verifier compatible with [circom](https://github.com/iden3/circom).
|
|
|
|
|
|
Using [bn256](https://github.com/ethereum/go-ethereum/tree/master/crypto/bn256/cloudflare) (used by [go-ethereum](https://github.com/ethereum/go-ethereum)) for the Pairing curve operations.
|
|
|
|
### Example
|
|
|
|
- Generate Proof
|
|
```go
|
|
import (
|
|
"github.com/iden3/go-circom-prover-verifier/parsers"
|
|
"github.com/iden3/go-circom-prover-verifier/prover"
|
|
"github.com/iden3/go-circom-prover-verifier/verifier"
|
|
)
|
|
|
|
[...]
|
|
|
|
// read ProvingKey & Witness files
|
|
provingKeyJson, _ := ioutil.ReadFile("../testdata/small/proving_key.json")
|
|
witnessJson, _ := ioutil.ReadFile("../testdata/small/witness.json")
|
|
|
|
// parse Proving Key
|
|
pk, _ := parsers.ParsePk(provingKeyJson)
|
|
|
|
// parse Witness
|
|
w, _ := parsers.ParseWitness(witnessJson)
|
|
|
|
// generate the proof
|
|
proof, pubSignals, _ := prover.GenerateProof(pk, w)
|
|
|
|
// print proof & publicSignals
|
|
proofStr, _ := parsers.ProofToJson(proof)
|
|
publicStr, _ := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
|
|
fmt.Println(proofStr)
|
|
fmt.Println(publicStr)
|
|
```
|
|
|
|
- Verify Proof
|
|
```go
|
|
// read proof & verificationKey & publicSignals
|
|
proofJson, _ := ioutil.ReadFile("../testdata/big/proof.json")
|
|
vkJson, _ := ioutil.ReadFile("../testdata/big/verification_key.json")
|
|
publicJson, _ := ioutil.ReadFile("../testdata/big/public.json")
|
|
|
|
// parse proof & verificationKey & publicSignals
|
|
public, _ := parsers.ParsePublicSignals(publicJson)
|
|
proof, _ := parsers.ParseProof(proofJson)
|
|
vk, _ := parsers.ParseVk(vkJson)
|
|
|
|
// verify the proof with the given verificationKey & publicSignals
|
|
v := verifier.Verify(vk, proof, public)
|
|
fmt.Println(v)
|
|
```
|
|
|
|
## CLI
|
|
|
|
From the `cli` directory:
|
|
|
|
- Show options
|
|
```
|
|
> go run cli.go -help
|
|
go-circom-prover-verifier
|
|
v0.0.1
|
|
Usage of /tmp/go-build620318239/b001/exe/cli:
|
|
-proof string
|
|
proof path (default "proof.json")
|
|
-prove
|
|
prover mode
|
|
-provingkey string
|
|
provingKey path (default "proving_key.json")
|
|
-public string
|
|
public signals path (default "public.json")
|
|
-verificationkey string
|
|
verificationKey path (default "verification_key.json")
|
|
-verify
|
|
verifier mode
|
|
-witness string
|
|
witness path (default "witness.json")
|
|
```
|
|
|
|
- Prove
|
|
```
|
|
> go run cli.go -prove -provingkey=../testdata/circuit5k/proving_key.json -witness=../testdata/circuit5k/witness.json
|
|
```
|
|
- Verify
|
|
```
|
|
> go run cli.go -verify -verificationkey=../testdata/circuit5k/verification_key.json
|
|
```
|