// Copyright 2020 ConsenSys AG // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "fmt" "os" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/frontend/cs/r1cs" "github.com/consensys/gnark/backend/groth16" _ "gnark-ed25519/edwards_curve" _ "gnark-ed25519/sha512" ) // Circuit defines a simple circuit // x**3 + x + 5 == y type Circuit struct { // struct tags on a variable is optional // default uses variable name and secret visibility. X frontend.Variable `gnark:"x"` Y frontend.Variable `gnark:",public"` } // Define declares the circuit constraints // x**3 + x + 5 == y func (circuit *Circuit) Define(api frontend.API) error { x3 := api.Mul(circuit.X, circuit.X, circuit.X) api.AssertIsEqual(circuit.Y, api.Add(x3, circuit.X, 5)) return nil } func main() { err := mainImpl() if err != nil { fmt.Println(err) os.Exit(1) } } func mainImpl() error { var myCircuit Circuit r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &myCircuit) if err != nil { return err } assignment := &Circuit{ X: "2", Y: "15", } witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField()) publicWitness, _ := witness.Public() pk, vk, err := groth16.Setup(r1cs) proof, err := groth16.Prove(r1cs, pk, witness) err = groth16.Verify(proof, vk, publicWitness) if err != nil { return err } fmt.Println(proof) return nil }