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 }