|
|
package main
import ( "bytes" "fmt" "math/big"
"github.com/urfave/cli"
"github.com/arnaucube/go-snark/circuit" "github.com/arnaucube/go-snark/fields" "github.com/arnaucube/go-snark/proof" )
func test(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 }
// R1CS to QAP
alphas, betas, gammas, zx := proof.R1CSToQAP( cir.R1CS.A, cir.R1CS.B, cir.R1CS.C, )
// px == ax * bx - cx
ax, bx, cx, px := proof.Utils.PF.CombinePolynomials(w, alphas, betas, gammas)
// hx == px / zx
hx := proof.Utils.PF.DivisorPolynomial(px, zx) if !fields.BigArraysEqual(px, proof.Utils.PF.Mul(hx, zx)) { return fmt.Errorf("px != hx * zx") }
// ax * bx - cx == px
abc := proof.Utils.PF.Sub(proof.Utils.PF.Mul(ax, bx), cx) if !fields.BigArraysEqual(abc, px) { return fmt.Errorf("ax * bx - cx != px") }
// hx * zx == ax * bx - cx
hz := proof.Utils.PF.Mul(hx, zx) if !fields.BigArraysEqual(hz, abc) { return fmt.Errorf("hx * zx != ax * bx - cx") }
// dx == px / zx + rx
dx, rx := proof.Utils.PF.Div(px, zx) if !fields.BigArraysEqual(dx, hx) { return fmt.Errorf("dx != hx") } for _, r := range rx { if !bytes.Equal(r.Bytes(), big.NewInt(int64(0)).Bytes()) { return fmt.Errorf("rx != 0") } }
return nil }
|