package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/urfave/cli"
|
|
|
|
"github.com/arnaucube/go-snark/proof"
|
|
)
|
|
|
|
const (
|
|
compiledFileName = "compiled.json"
|
|
setupFileName = "setup.json"
|
|
privateFileName = "private.json"
|
|
publicFileName = "public.json"
|
|
proofFileName = "proof.json"
|
|
)
|
|
|
|
const (
|
|
proofSystemPinocchio = iota
|
|
proofSystemGroth16
|
|
)
|
|
|
|
var proofSystem int
|
|
|
|
var commands = []cli.Command{
|
|
{
|
|
Name: "compile",
|
|
Aliases: []string{},
|
|
Usage: "compile a circuit",
|
|
Action: compile,
|
|
},
|
|
{
|
|
Name: "test",
|
|
Aliases: []string{},
|
|
Usage: "test a circuit",
|
|
Action: test,
|
|
},
|
|
{
|
|
Name: "setup",
|
|
Aliases: []string{},
|
|
Usage: "generate trusted setup for a circuit",
|
|
Action: setup,
|
|
},
|
|
{
|
|
Name: "generate",
|
|
Aliases: []string{},
|
|
Usage: "generate the snark proofs",
|
|
Action: generate,
|
|
},
|
|
{
|
|
Name: "verify",
|
|
Aliases: []string{},
|
|
Usage: "verify the snark proofs",
|
|
Action: verify,
|
|
},
|
|
}
|
|
|
|
func initProofSystem() error {
|
|
switch p := os.Getenv("PROOF_SYSTEM"); p {
|
|
case "", "PINOCCHIO":
|
|
proofSystem = proofSystemPinocchio
|
|
case "GROTH16":
|
|
proofSystem = proofSystemGroth16
|
|
default:
|
|
return fmt.Errorf("proof system not supported: %v", p)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func newSetup() (proof.Setup, error) {
|
|
var s proof.Setup
|
|
switch proofSystem {
|
|
case proofSystemPinocchio:
|
|
s = &proof.PinocchioSetup{}
|
|
case proofSystemGroth16:
|
|
s = &proof.Groth16Setup{}
|
|
default:
|
|
return nil, fmt.Errorf("proof system not supported: %v", proofSystem)
|
|
}
|
|
return s, nil
|
|
}
|
|
|
|
func newProof() (proof.Proof, error) {
|
|
var p proof.Proof
|
|
switch proofSystem {
|
|
case proofSystemPinocchio:
|
|
p = &proof.PinocchioProof{}
|
|
case proofSystemGroth16:
|
|
p = &proof.Groth16Proof{}
|
|
default:
|
|
return nil, fmt.Errorf("proof system not supported: %v", proofSystem)
|
|
}
|
|
return p, nil
|
|
}
|
|
|
|
func main() {
|
|
if err := initProofSystem(); err != nil {
|
|
panic(err)
|
|
}
|
|
app := cli.NewApp()
|
|
app.Name = "go-snark"
|
|
app.Version = "0.0.3-alpha"
|
|
app.Flags = []cli.Flag{
|
|
cli.StringFlag{Name: "config"},
|
|
}
|
|
app.Commands = commands
|
|
if err := app.Run(os.Args); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|