github.com/consensys/gnark@v0.11.0/internal/generator/backend/template/zkpschemes/groth16/mpcsetup/setup.go.tmpl (about) 1 import ( 2 groth16 "github.com/consensys/gnark/backend/groth16/{{toLower .Curve}}" 3 4 {{- template "import_curve" . }} 5 {{- template "import_fft" . }} 6 ) 7 8 func ExtractKeys(srs1 *Phase1, srs2 *Phase2, evals *Phase2Evaluations, nConstraints int) (pk groth16.ProvingKey, vk groth16.VerifyingKey) { 9 _, _, _, g2 := curve.Generators() 10 11 // Initialize PK 12 pk.Domain = *fft.NewDomain(uint64(nConstraints)) 13 pk.G1.Alpha.Set(&srs1.Parameters.G1.AlphaTau[0]) 14 pk.G1.Beta.Set(&srs1.Parameters.G1.BetaTau[0]) 15 pk.G1.Delta.Set(&srs2.Parameters.G1.Delta) 16 pk.G1.Z = srs2.Parameters.G1.Z 17 bitReverse(pk.G1.Z) 18 19 pk.G1.K = srs2.Parameters.G1.L 20 pk.G2.Beta.Set(&srs1.Parameters.G2.Beta) 21 pk.G2.Delta.Set(&srs2.Parameters.G2.Delta) 22 23 // Filter out infinity points 24 nWires := len(evals.G1.A) 25 pk.InfinityA = make([]bool, nWires) 26 A := make([]curve.G1Affine, nWires) 27 j := 0 28 for i, e := range evals.G1.A { 29 if e.IsInfinity() { 30 pk.InfinityA[i] = true 31 continue 32 } 33 A[j] = evals.G1.A[i] 34 j++ 35 } 36 pk.G1.A = A[:j] 37 pk.NbInfinityA = uint64(nWires - j) 38 39 pk.InfinityB = make([]bool, nWires) 40 B := make([]curve.G1Affine, nWires) 41 j = 0 42 for i, e := range evals.G1.B { 43 if e.IsInfinity() { 44 pk.InfinityB[i] = true 45 continue 46 } 47 B[j] = evals.G1.B[i] 48 j++ 49 } 50 pk.G1.B = B[:j] 51 pk.NbInfinityB = uint64(nWires - j) 52 53 B2 := make([]curve.G2Affine, nWires) 54 j = 0 55 for i, e := range evals.G2.B { 56 if e.IsInfinity() { 57 // pk.InfinityB[i] = true should be the same as in B 58 continue 59 } 60 B2[j] = evals.G2.B[i] 61 j++ 62 } 63 pk.G2.B = B2[:j] 64 65 // Initialize VK 66 vk.G1.Alpha.Set(&srs1.Parameters.G1.AlphaTau[0]) 67 vk.G1.Beta.Set(&srs1.Parameters.G1.BetaTau[0]) 68 vk.G1.Delta.Set(&srs2.Parameters.G1.Delta) 69 vk.G2.Beta.Set(&srs1.Parameters.G2.Beta) 70 vk.G2.Delta.Set(&srs2.Parameters.G2.Delta) 71 vk.G2.Gamma.Set(&g2) 72 vk.G1.K = evals.G1.VKK 73 74 // sets e, -[δ]2, -[γ]2 75 if err := vk.Precompute(); err != nil { 76 panic(err) 77 } 78 79 return pk, vk 80 }