github.com/consensys/gnark@v0.11.0/backend/groth16/bn254/marshal_test.go (about)

     1  // Copyright 2020 ConsenSys Software Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // Code generated by gnark DO NOT EDIT
    16  
    17  package groth16
    18  
    19  import (
    20  	curve "github.com/consensys/gnark-crypto/ecc/bn254"
    21  
    22  	"github.com/consensys/gnark-crypto/ecc/bn254/fr/fft"
    23  
    24  	"github.com/consensys/gnark-crypto/ecc/bn254/fr/pedersen"
    25  	"github.com/consensys/gnark/backend/groth16/internal/test_utils"
    26  	"github.com/consensys/gnark/io"
    27  	"github.com/stretchr/testify/assert"
    28  	"github.com/stretchr/testify/require"
    29  
    30  	"math/big"
    31  
    32  	"github.com/leanovate/gopter"
    33  	"github.com/leanovate/gopter/gen"
    34  	"github.com/leanovate/gopter/prop"
    35  
    36  	"testing"
    37  )
    38  
    39  func TestProofSerialization(t *testing.T) {
    40  	parameters := gopter.DefaultTestParameters()
    41  	parameters.MinSuccessfulTests = 10
    42  
    43  	properties := gopter.NewProperties(parameters)
    44  
    45  	properties.Property("Proof -> writer -> reader -> Proof should stay constant", prop.ForAll(
    46  		func(ar, krs curve.G1Affine, bs curve.G2Affine) bool {
    47  			var proof Proof
    48  
    49  			// create a random proof
    50  			proof.Ar = ar
    51  			proof.Krs = krs
    52  			proof.Bs = bs
    53  			proof.Commitments = make([]curve.G1Affine, 10)
    54  			for i := range proof.Commitments {
    55  				proof.Commitments[i] = ar
    56  			}
    57  			proof.CommitmentPok = ar
    58  
    59  			err := io.RoundTripCheck(&proof, func() any { return new(Proof) })
    60  			return err == nil
    61  		},
    62  		GenG1(),
    63  		GenG1(),
    64  		GenG2(),
    65  	))
    66  
    67  	properties.TestingRun(t, gopter.ConsoleReporter(false))
    68  }
    69  
    70  func TestVerifyingKeySerialization(t *testing.T) {
    71  
    72  	roundTrip := func(withCommitment bool) func(curve.G1Affine, curve.G2Affine) bool {
    73  		return func(p1 curve.G1Affine, p2 curve.G2Affine) bool {
    74  			var vk VerifyingKey
    75  
    76  			// create a random vk
    77  			nbWires := 6
    78  
    79  			vk.G1.Alpha = p1
    80  			vk.G1.Beta = p1
    81  			vk.G1.Delta = p1
    82  
    83  			vk.G2.Gamma = p2
    84  			vk.G2.Beta = p2
    85  			vk.G2.Delta = p2
    86  
    87  			var err error
    88  			vk.e, err = curve.Pair([]curve.G1Affine{vk.G1.Alpha}, []curve.G2Affine{vk.G2.Beta})
    89  			if err != nil {
    90  				t.Fatal(err)
    91  				return false
    92  			}
    93  			vk.G2.deltaNeg.Neg(&vk.G2.Delta)
    94  			vk.G2.gammaNeg.Neg(&vk.G2.Gamma)
    95  
    96  			vk.G1.K = make([]curve.G1Affine, nbWires)
    97  			for i := 0; i < nbWires; i++ {
    98  				vk.G1.K[i] = p1
    99  			}
   100  
   101  			vk.CommitmentKeys = []pedersen.VerifyingKey{}
   102  			if withCommitment {
   103  				vk.PublicAndCommitmentCommitted = test_utils.Random2DIntSlice(5, 10) // TODO: Use gopter randomization
   104  				bases := make([][]curve.G1Affine, len(vk.PublicAndCommitmentCommitted))
   105  				elem := p1
   106  				for i := 0; i < len(vk.PublicAndCommitmentCommitted); i++ {
   107  					bases[i] = make([]curve.G1Affine, len(vk.PublicAndCommitmentCommitted[i]))
   108  					for j := range bases[i] {
   109  						bases[i][j] = elem
   110  						elem.Add(&elem, &p1)
   111  						vk.CommitmentKeys = append(vk.CommitmentKeys, pedersen.VerifyingKey{G: p2, GSigma: p2})
   112  					}
   113  				}
   114  				assert.NoError(t, err)
   115  			}
   116  
   117  			err = io.RoundTripCheck(&vk, func() any { return new(VerifyingKey) })
   118  			return err == nil
   119  		}
   120  	}
   121  
   122  	parameters := gopter.DefaultTestParameters()
   123  	parameters.MinSuccessfulTests = 10
   124  
   125  	properties := gopter.NewProperties(parameters)
   126  
   127  	properties.Property("VerifyingKey -> writer -> reader -> VerifyingKey should stay constant", prop.ForAll(
   128  		roundTrip(false),
   129  		GenG1(),
   130  		GenG2(),
   131  	))
   132  
   133  	properties.Property("VerifyingKey (with commitments) -> writer -> reader -> VerifyingKey should stay constant", prop.ForAll(
   134  		roundTrip(true),
   135  		GenG1(),
   136  		GenG2(),
   137  	))
   138  
   139  	properties.TestingRun(t, gopter.ConsoleReporter(false))
   140  }
   141  
   142  func TestProvingKeySerialization(t *testing.T) {
   143  	parameters := gopter.DefaultTestParameters()
   144  	parameters.MinSuccessfulTests = 10
   145  
   146  	properties := gopter.NewProperties(parameters)
   147  
   148  	properties.Property("ProvingKey -> writer -> reader -> ProvingKey should stay constant", prop.ForAll(
   149  		func(p1 curve.G1Affine, p2 curve.G2Affine, nbCommitment int) bool {
   150  			var pk ProvingKey
   151  
   152  			// create a random pk
   153  			domain := fft.NewDomain(8)
   154  			pk.Domain = *domain
   155  
   156  			nbWires := 6
   157  			nbPrivateWires := 4
   158  
   159  			// allocate our slices
   160  			pk.G1.A = make([]curve.G1Affine, nbWires)
   161  			pk.G1.B = make([]curve.G1Affine, nbWires)
   162  			pk.G1.K = make([]curve.G1Affine, nbPrivateWires)
   163  			pk.G1.Z = make([]curve.G1Affine, pk.Domain.Cardinality)
   164  			pk.G2.B = make([]curve.G2Affine, nbWires)
   165  
   166  			pk.G1.Alpha = p1
   167  			pk.G2.Beta = p2
   168  			pk.G1.K[1] = p1
   169  			pk.G1.B[0] = p1
   170  			pk.G2.B[0] = p2
   171  
   172  			// infinity flags
   173  			pk.NbInfinityA = 1
   174  			pk.InfinityA = make([]bool, nbWires)
   175  			pk.InfinityB = make([]bool, nbWires)
   176  			pk.InfinityA[2] = true
   177  
   178  			pedersenBasis := make([]curve.G1Affine, nbCommitment)
   179  			pedersenBases := make([][]curve.G1Affine, nbCommitment)
   180  			pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitment)
   181  			for i := range pedersenBasis {
   182  				pedersenBasis[i] = p1
   183  				pedersenBases[i] = pedersenBasis[:i+1]
   184  			}
   185  			{
   186  				var err error
   187  				pk.CommitmentKeys, _, err = pedersen.Setup(pedersenBases)
   188  				require.NoError(t, err)
   189  			}
   190  
   191  			if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil {
   192  				t.Log(err)
   193  				return false
   194  			}
   195  
   196  			if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil {
   197  				t.Log(err)
   198  				return false
   199  			}
   200  			return true
   201  		},
   202  		GenG1(),
   203  		GenG2(),
   204  		gen.IntRange(0, 2),
   205  	))
   206  
   207  	properties.TestingRun(t, gopter.ConsoleReporter(false))
   208  }
   209  
   210  func GenG1() gopter.Gen {
   211  	_, _, g1GenAff, _ := curve.Generators()
   212  	return func(genParams *gopter.GenParameters) *gopter.GenResult {
   213  		var scalar big.Int
   214  		scalar.SetUint64(genParams.NextUint64())
   215  
   216  		var g1 curve.G1Affine
   217  		g1.ScalarMultiplication(&g1GenAff, &scalar)
   218  
   219  		genResult := gopter.NewGenResult(g1, gopter.NoShrinker)
   220  		return genResult
   221  	}
   222  }
   223  
   224  func GenG2() gopter.Gen {
   225  	_, _, _, g2GenAff := curve.Generators()
   226  	return func(genParams *gopter.GenParameters) *gopter.GenResult {
   227  		var scalar big.Int
   228  		scalar.SetUint64(genParams.NextUint64())
   229  
   230  		var g2 curve.G2Affine
   231  		g2.ScalarMultiplication(&g2GenAff, &scalar)
   232  
   233  		genResult := gopter.NewGenResult(g2, gopter.NoShrinker)
   234  		return genResult
   235  	}
   236  }