package main
|
|
|
|
import (
|
|
"github.com/arnaucube/go-snark/circuit"
|
|
"github.com/arnaucube/go-snark/proof"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
func generate(context *cli.Context) error {
|
|
// load circuit
|
|
cir := &circuit.Circuit{}
|
|
if err := loadFromFile(compiledFileName, cir); err != nil {
|
|
return err
|
|
}
|
|
|
|
// load inputs
|
|
var inputs circuit.Inputs
|
|
if err := loadFromFile(privateFileName, &inputs.Private); err != nil {
|
|
return err
|
|
}
|
|
if err := loadFromFile(publicFileName, &inputs.Public); err != nil {
|
|
return err
|
|
}
|
|
|
|
// calculate witness
|
|
w, err := cir.CalculateWitness(inputs.Private, inputs.Public)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// load setup
|
|
setup, err := newSetup()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := loadFromFile(setupFileName, setup); err != nil {
|
|
return err
|
|
}
|
|
|
|
// R1CS to QAP
|
|
alphas, betas, gammas, _ := proof.R1CSToQAP(
|
|
cir.R1CS.A,
|
|
cir.R1CS.B,
|
|
cir.R1CS.C)
|
|
|
|
_, _, _, px := proof.Utils.PF.CombinePolynomials(w, alphas, betas, gammas)
|
|
|
|
// generate proof
|
|
proof, err := setup.Generate(cir, w, px)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// save proof
|
|
return saveToFile(proofFileName, proof)
|
|
}
|