Skip to content

Commit

Permalink
Merge pull request #733 from Consensys/refactor/gkr-notfrontend-api
Browse files Browse the repository at this point in the history
refactor: gkrAPI is no longer a frontend.API
  • Loading branch information
Tabaie authored Jun 28, 2023
2 parents 4bc9e04 + 92cdb5d commit c842b87
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 110 deletions.
105 changes: 12 additions & 93 deletions std/gkr/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ package gkr

import (
"github.com/consensys/gnark/constraint"
"github.com/consensys/gnark/constraint/solver"
"github.com/consensys/gnark/frontend"
"github.com/consensys/gnark/std/utils/algo_utils"
"math/big"
)

func frontendVarToInt(a frontend.Variable) int {
return int(a.(constraint.GkrVariable))
func frontendVarToInt(a constraint.GkrVariable) int {
return int(a)
}

func (api *API) newNonInputVariable(gate string, in []frontend.Variable) constraint.GkrVariable {
func (api *API) newNonInputVariable(gate string, in []constraint.GkrVariable) constraint.GkrVariable {
api.toStore.Circuit = append(api.toStore.Circuit, constraint.GkrWire{
Gate: gate,
Inputs: algo_utils.Map(in, frontendVarToInt),
Expand All @@ -21,8 +18,8 @@ func (api *API) newNonInputVariable(gate string, in []frontend.Variable) constra
return constraint.GkrVariable(len(api.toStore.Circuit) - 1)
}

func (api *API) newVar2PlusIn(gate string, in1, in2 frontend.Variable, in ...frontend.Variable) constraint.GkrVariable {
inCombined := make([]frontend.Variable, 2+len(in))
func (api *API) newVar2PlusIn(gate string, in1, in2 constraint.GkrVariable, in ...constraint.GkrVariable) constraint.GkrVariable {
inCombined := make([]constraint.GkrVariable, 2+len(in))
inCombined[0] = in1
inCombined[1] = in2
for i := range in {
Expand All @@ -31,101 +28,23 @@ func (api *API) newVar2PlusIn(gate string, in1, in2 frontend.Variable, in ...fro
return api.newNonInputVariable(gate, inCombined)
}

func (api *API) Add(i1, i2 frontend.Variable, in ...frontend.Variable) frontend.Variable {
func (api *API) Add(i1, i2 constraint.GkrVariable, in ...constraint.GkrVariable) constraint.GkrVariable {
return api.newVar2PlusIn("add", i1, i2, in...)
}

func (api *API) Neg(i1 frontend.Variable) frontend.Variable {
return api.newNonInputVariable("neg", []frontend.Variable{i1})
func (api *API) Neg(i1 constraint.GkrVariable) constraint.GkrVariable {
return api.newNonInputVariable("neg", []constraint.GkrVariable{i1})
}

func (api *API) Sub(i1, i2 frontend.Variable, in ...frontend.Variable) frontend.Variable {
func (api *API) Sub(i1, i2 constraint.GkrVariable, in ...constraint.GkrVariable) constraint.GkrVariable {
return api.newVar2PlusIn("sub", i1, i2, in...)
}

func (api *API) Mul(i1, i2 frontend.Variable, in ...frontend.Variable) frontend.Variable {
func (api *API) Mul(i1, i2 constraint.GkrVariable, in ...constraint.GkrVariable) constraint.GkrVariable {
return api.newVar2PlusIn("mul", i1, i2, in...)
}

func (api *API) DivUnchecked(i1, i2 frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) Div(i1, i2 frontend.Variable) frontend.Variable {
panic("not implemented")
}

// TODO: This will require some sophistication. The resulting variable will be considered input by the prover but not by the solver
func (api *API) Inverse(i1 frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) ToBinary(i1 frontend.Variable, n ...int) []frontend.Variable {
panic("not implemented")
}

func (api *API) FromBinary(b ...frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) Xor(a, b frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) Or(a, b frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) And(a, b frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) Select(b frontend.Variable, i1, i2 frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) Lookup2(b0, b1 frontend.Variable, i0, i1, i2, i3 frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) IsZero(i1 frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) Cmp(i1, i2 frontend.Variable) frontend.Variable {
panic("not implemented")
}

func (api *API) AssertIsEqual(i1, i2 frontend.Variable) {
panic("not implemented")
}

func (api *API) AssertIsDifferent(i1, i2 frontend.Variable) {
panic("not implemented")
}

func (api *API) AssertIsBoolean(i1 frontend.Variable) {
panic("not implemented")
}

func (api *API) AssertIsLessOrEqual(v frontend.Variable, bound frontend.Variable) {
panic("not implemented")
}

// TODO: This can be important.
func (api *API) Println(a ...frontend.Variable) {
panic("not implemented")
}

// This is definitely out of scope. TODO: A CircuitBuilder API that doesn't have to implement this and can be passed on to gadgets
func (api *API) Compiler() frontend.Compiler {
panic("not implemented")
}

func (api *API) NewHint(f solver.Hint, nbOutputs int, inputs ...frontend.Variable) ([]frontend.Variable, error) {
panic("not implemented")
}

func (api *API) ConstantValue(v frontend.Variable) (*big.Int, bool) {
// TODO @Tabaie This can be useful
func (api *API) Println(a ...constraint.GkrVariable) {
panic("not implemented")
}
16 changes: 8 additions & 8 deletions std/gkr/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ type doubleNoDependencyCircuit struct {

func (c *doubleNoDependencyCircuit) Define(api frontend.API) error {
gkr := NewApi()
var x frontend.Variable
var x constraint.GkrVariable
var err error
if x, err = gkr.Import(c.X); err != nil {
return err
Expand Down Expand Up @@ -85,7 +85,7 @@ type sqNoDependencyCircuit struct {

func (c *sqNoDependencyCircuit) Define(api frontend.API) error {
gkr := NewApi()
var x frontend.Variable
var x constraint.GkrVariable
var err error
if x, err = gkr.Import(c.X); err != nil {
return err
Expand Down Expand Up @@ -130,7 +130,7 @@ type mulNoDependencyCircuit struct {

func (c *mulNoDependencyCircuit) Define(api frontend.API) error {
gkr := NewApi()
var x, y frontend.Variable
var x, y constraint.GkrVariable
var err error
if x, err = gkr.Import(c.X); err != nil {
return err
Expand Down Expand Up @@ -194,7 +194,7 @@ type mulWithDependencyCircuit struct {

func (c *mulWithDependencyCircuit) Define(api frontend.API) error {
gkr := NewApi()
var x, y frontend.Variable
var x, y constraint.GkrVariable
var err error

X := make([]frontend.Variable, len(c.Y))
Expand Down Expand Up @@ -252,7 +252,7 @@ func TestApiMul(t *testing.T) {
require.NoError(t, err)
y, err = api.Import([]frontend.Variable{nil, nil})
require.NoError(t, err)
z = api.Mul(x, y).(constraint.GkrVariable)
z = api.Mul(x, y)
test_vector_utils.AssertSliceEqual(t, api.toStore.Circuit[z].Inputs, []int{int(x), int(y)}) // TODO: Find out why assert.Equal gives false positives ( []*Wire{x,x} as second argument passes when it shouldn't )
}

Expand Down Expand Up @@ -334,7 +334,7 @@ func (c *benchMiMCMerkleTreeCircuit) Define(api frontend.API) error {
X[len(X)-1] = 0
Y[len(X)-1] = 0

var x, y frontend.Variable
var x, y constraint.GkrVariable
var err error

gkr := NewApi()
Expand All @@ -348,10 +348,10 @@ func (c *benchMiMCMerkleTreeCircuit) Define(api frontend.API) error {
// cheat{
gkr.toStore.Circuit = append(gkr.toStore.Circuit, constraint.GkrWire{
Gate: "mimc",
Inputs: []int{int(x.(constraint.GkrVariable)), int(y.(constraint.GkrVariable))},
Inputs: []int{int(x), int(y)},
})
gkr.assignments = append(gkr.assignments, nil)
z := frontend.Variable(constraint.GkrVariable(2))
z := constraint.GkrVariable(2)
// }

offset := 1 << (c.depth - 1)
Expand Down
16 changes: 7 additions & 9 deletions std/gkr/compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,13 @@ func log2(x uint) int {
}

// Series like in an electric circuit, binds an input of an instance to an output of another
func (api *API) Series(input, output frontend.Variable, inputInstance, outputInstance int) *API {
i := input.(constraint.GkrVariable)
o := output.(constraint.GkrVariable)
if api.assignments[i][inputInstance] != nil {
func (api *API) Series(input, output constraint.GkrVariable, inputInstance, outputInstance int) *API {
if api.assignments[input][inputInstance] != nil {
panic("dependency attempting to override explicit value assignment")
}
api.toStore.Circuit[i].Dependencies =
append(api.toStore.Circuit[i].Dependencies, constraint.InputDependency{
OutputWire: int(o),
api.toStore.Circuit[input].Dependencies =
append(api.toStore.Circuit[input].Dependencies, constraint.InputDependency{
OutputWire: int(output),
OutputInstance: outputInstance,
InputInstance: inputInstance,
})
Expand Down Expand Up @@ -203,11 +201,11 @@ func (s Solution) Verify(hashName string, initialChallenges ...frontend.Variable
return s.parentApi.Compiler().SetGkrInfo(s.toStore)
}

func SolveHintPlaceholder(*big.Int, []*big.Int, []*big.Int) error {
func SolveHintPlaceholder(*big.Int, []*big.Int, []*big.Int) error { // TODO @Tabaie Add implementation for testing
return fmt.Errorf("placeholder - not meant to be called")
}

func ProveHintPlaceholder(*big.Int, []*big.Int, []*big.Int) error {
func ProveHintPlaceholder(*big.Int, []*big.Int, []*big.Int) error { // TODO @Tabaie Add implementation for testing
return fmt.Errorf("placeholder - not meant to be called")
}

Expand Down

0 comments on commit c842b87

Please sign in to comment.