github.com/consensys/gnark@v0.11.0/internal/regression_tests/issue1045/issue_1045_test.go (about) 1 package issue1045 2 3 import ( 4 "math/big" 5 "os" 6 "testing" 7 8 "github.com/consensys/gnark-crypto/ecc" 9 fr_bn254 "github.com/consensys/gnark-crypto/ecc/bn254/fr" 10 "github.com/consensys/gnark/backend/groth16" 11 "github.com/consensys/gnark/backend/plonk" 12 "github.com/consensys/gnark/backend/witness" 13 "github.com/consensys/gnark/constraint/solver" 14 "github.com/consensys/gnark/frontend" 15 "github.com/consensys/gnark/frontend/cs/r1cs" 16 "github.com/consensys/gnark/frontend/cs/scs" 17 "github.com/consensys/gnark/test" 18 ) 19 20 const ( 21 explicitHintName = "github.com/consensys/gnark/internal/regression_tests/issue1045.ExplicitHint" 22 anonymousHintName = "github.com/consensys/gnark/internal/regression_tests/issue1045.glob..func1" 23 ) 24 25 func ExplicitHint(mod *big.Int, inputs []*big.Int, outputs []*big.Int) error { 26 outputs[0].Set(inputs[0]) 27 return nil 28 } 29 30 var AnonymousHint = func(mod *big.Int, inputs []*big.Int, outputs []*big.Int) error { 31 outputs[0].Set(inputs[0]) 32 return nil 33 } 34 35 func TestGetHintname(t *testing.T) { 36 if resolvedExplicitHintName := solver.GetHintName(ExplicitHint); resolvedExplicitHintName != explicitHintName { 37 t.Errorf("expected %s, got %s", explicitHintName, resolvedExplicitHintName) 38 } 39 if resolvedAnonymousHintName := solver.GetHintName(AnonymousHint); resolvedAnonymousHintName != anonymousHintName { 40 t.Errorf("expected %s, got %s", anonymousHintName, resolvedAnonymousHintName) 41 } 42 } 43 44 type Circuit struct { 45 In1, In2 frontend.Variable `gnark:",public"` 46 } 47 48 func (c *Circuit) Define(api frontend.API) error { 49 res1, err := api.Compiler().NewHint(ExplicitHint, 1, c.In1) 50 if err != nil { 51 return err 52 } 53 res2, err := api.Compiler().NewHint(AnonymousHint, 1, c.In2) 54 if err != nil { 55 return err 56 } 57 api.AssertIsEqual(res1[0], c.In1) 58 api.AssertIsEqual(res2[0], c.In2) 59 return nil 60 } 61 62 func TestCircuitCompile(t *testing.T) { 63 t.Skip("test used only to generate testdata") 64 assert := test.NewAssert(t) 65 for _, bb := range []struct { 66 builder frontend.NewBuilder 67 tag string 68 }{{scs.NewBuilder, "scs"}, {r1cs.NewBuilder, "r1cs"}} { 69 ccs, err := frontend.Compile(ecc.BN254.ScalarField(), bb.builder, &Circuit{}) 70 assert.NoError(err) 71 f, err := os.Create("testdata/issue1045." + bb.tag) 72 assert.NoError(err) 73 defer f.Close() 74 _, err = ccs.WriteTo(f) 75 assert.NoError(err) 76 } 77 } 78 79 func TestCircuitProveDeserializedGroth16(t *testing.T) { 80 assert := test.NewAssert(t) 81 ccs := groth16.NewCS(ecc.BN254) 82 f, err := os.Open("testdata/issue1045.r1cs") 83 assert.NoError(err) 84 _, err = ccs.ReadFrom(f) 85 assert.NoError(err) 86 87 wit, err := witness.New(ecc.BN254.ScalarField()) 88 assert.NoError(err) 89 filler := make(chan any) 90 go func() { 91 filler <- fr_bn254.NewElement(123) 92 filler <- fr_bn254.NewElement(333) 93 close(filler) 94 }() 95 err = wit.Fill(2, 0, filler) 96 assert.NoError(err) 97 err = ccs.IsSolved(wit, solver.WithHints(ExplicitHint, AnonymousHint)) 98 assert.NoError(err) 99 } 100 101 func TestCircuitProveDeserializedPlonk(t *testing.T) { 102 assert := test.NewAssert(t) 103 ccs := plonk.NewCS(ecc.BN254) 104 f, err := os.Open("testdata/issue1045.scs") 105 assert.NoError(err) 106 _, err = ccs.ReadFrom(f) 107 assert.NoError(err) 108 109 wit, err := witness.New(ecc.BN254.ScalarField()) 110 assert.NoError(err) 111 filler := make(chan any) 112 go func() { 113 filler <- fr_bn254.NewElement(123) 114 filler <- fr_bn254.NewElement(333) 115 close(filler) 116 }() 117 err = wit.Fill(2, 0, filler) 118 assert.NoError(err) 119 err = ccs.IsSolved(wit, solver.WithHints(ExplicitHint, AnonymousHint)) 120 assert.NoError(err) 121 }