github.com/consensys/gnark@v0.11.0/internal/generator/backend/template/zkpschemes/groth16/tests/groth16.marshal.go.tmpl (about)

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