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