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  }