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  }