@@ -62,12 +62,23 @@ func processHeader(r1csPath string, phase1File, phase2File *os.File) (*phase1.He
6262 return nil , nil , fmt .Errorf ("phase 1 parameters can support up to %d, but the circuit #Constraints are %d" , N , header2 .Constraints )
6363 }
6464 // Initialize Domain, #Wires, #Witness, #Public, #PrivateCommitted
65+
66+ // Calculate number of private commitments
67+ commitments , ok := r1cs .CommitmentInfo .(constraint.Groth16Commitments )
68+ if ! ok {
69+ return nil , nil , errors .New ("commitment info is not of type Groth16Commitments" )
70+ }
71+ privateCommittedNum := 0
72+ for _ , commitment := range commitments {
73+ privateCommittedNum += len (commitment .PrivateCommitted )
74+ }
75+
6576 header2 .Wires = r1cs .NbInternalVariables + r1cs .GetNbPublicVariables () + r1cs .GetNbSecretVariables ()
66- header2 .PrivateCommitted = r1cs . CommitmentInfo . NbPrivateCommitted
77+ header2 .PrivateCommitted = privateCommittedNum
6778 header2 .Public = r1cs .GetNbPublicVariables ()
6879 header2 .Witness = r1cs .GetNbSecretVariables () + r1cs .NbInternalVariables - header2 .PrivateCommitted
6980
70- if r1cs . CommitmentInfo . Is () { // the commitment itself is defined by a hint so the prover considers it private
81+ if Is (commitments ) { // the commitment itself is defined by a hint so the prover considers it private
7182 header2 .Public ++ // but the verifier will need to inject the value itself so on the groth16
7283 header2 .Witness -- // level it must be considered public
7384 }
@@ -176,7 +187,7 @@ func processEvaluations(header1 *phase1.Header, header2 *Header, r1csPath string
176187
177188 // Accumlate {[A]₁}
178189 buff := make ([]bn254.G1Affine , header2 .Wires )
179- for i , c := range r1cs .Constraints {
190+ for i , c := range r1cs .GetR1Cs () {
180191 for _ , t := range c .L {
181192 accumulateG1 (& r1cs , & buff [t .WireID ()], t , & tauG1 [i ])
182193 }
@@ -189,7 +200,7 @@ func processEvaluations(header1 *phase1.Header, header2 *Header, r1csPath string
189200 // Reset buff
190201 buff = make ([]bn254.G1Affine , header2 .Wires )
191202 // Accumlate {[B]₁}
192- for i , c := range r1cs .Constraints {
203+ for i , c := range r1cs .GetR1Cs () {
193204 for _ , t := range c .R {
194205 accumulateG1 (& r1cs , & buff [t .WireID ()], t , & tauG1 [i ])
195206 }
@@ -213,7 +224,7 @@ func processEvaluations(header1 *phase1.Header, header2 *Header, r1csPath string
213224 return err
214225 }
215226 // Accumlate {[B]₂}
216- for i , c := range r1cs .Constraints {
227+ for i , c := range r1cs .GetR1Cs () {
217228 for _ , t := range c .R {
218229 accumulateG2 (& r1cs , & buff2 [t .WireID ()], t , & tauG2 [i ])
219230 }
@@ -307,7 +318,7 @@ func processPVCKK(header1 *phase1.Header, header2 *Header, r1csPath string, phas
307318 return err
308319 }
309320
310- for i , c := range r1cs .Constraints {
321+ for i , c := range r1cs .GetR1Cs () {
311322 // Output(Tau)
312323 for _ , t := range c .O {
313324 accumulateG1 (& r1cs , & L [t .WireID ()], t , & buffSRS [i ])
@@ -318,7 +329,7 @@ func processPVCKK(header1 *phase1.Header, header2 *Header, r1csPath string, phas
318329 if err := dec .Decode (& buffSRS ); err != nil {
319330 return err
320331 }
321- for i , c := range r1cs .Constraints {
332+ for i , c := range r1cs .GetR1Cs () {
322333 // Right(AlphaTauG1)
323334 for _ , t := range c .R {
324335 accumulateG1 (& r1cs , & L [t .WireID ()], t , & buffSRS [i ])
@@ -329,14 +340,19 @@ func processPVCKK(header1 *phase1.Header, header2 *Header, r1csPath string, phas
329340 if err := dec .Decode (& buffSRS ); err != nil {
330341 return err
331342 }
332- for i , c := range r1cs .Constraints {
343+ for i , c := range r1cs .GetR1Cs () {
333344 // Left(BetaTauG1)
334345 for _ , t := range c .L {
335346 accumulateG1 (& r1cs , & L [t .WireID ()], t , & buffSRS [i ])
336347 }
337348 }
338349
339- pkk , vkk , ckk := filterL (L , header2 , & r1cs .CommitmentInfo )
350+ commitments , ok := r1cs .CommitmentInfo .(constraint.Groth16Commitments )
351+ if ! ok {
352+ return errors .New ("commitment info is not of type Groth16Commitments" )
353+ }
354+
355+ pkk , vkk , ckk := filterL (L , header2 , commitments )
340356 // Write PKK
341357 for i := 0 ; i < len (pkk ); i ++ {
342358 if err := enc .Encode (& pkk [i ]); err != nil {
@@ -534,23 +550,42 @@ func aggregate(inputDecoder, originDecoder *bn254.Decoder, size int) (*bn254.G1A
534550 return & inG , & orG , nil
535551}
536552
537- func filterL (L []bn254.G1Affine , header2 * Header , cmtInfo * constraint.Commitment ) ([]bn254.G1Affine , []bn254.G1Affine , []bn254.G1Affine ) {
553+ func filterL (L []bn254.G1Affine , header2 * Header , cmtInfo constraint.Groth16Commitments ) ([]bn254.G1Affine , []bn254.G1Affine , []bn254.G1Affine ) {
538554 pkk := make ([]bn254.G1Affine , header2 .Witness )
539555 vkk := make ([]bn254.G1Affine , header2 .Public )
540556 ckk := make ([]bn254.G1Affine , header2 .PrivateCommitted )
541557 vI , cI := 0 , 0
558+
559+ commitmentIndexes := make (map [int ]struct {})
560+ for _ , c := range cmtInfo {
561+ commitmentIndexes [c .CommitmentIndex ] = struct {}{}
562+ }
563+
564+ numPrivateCommitted := 0
565+ for _ , commitment := range cmtInfo {
566+ numPrivateCommitted += len (commitment .PrivateCommitted )
567+ }
568+
542569 for i := range L {
543- isCommittedPrivate := cI < cmtInfo . NbPrivateCommitted && i == cmtInfo . PrivateCommitted () [i ]
544- isCommitment := cmtInfo . Is () && i == cmtInfo . CommitmentIndex
570+ _ , isCommitment := commitmentIndexes [i ]
571+ isCommittedPrivate := cI < numPrivateCommitted
545572 isPublic := i < header2 .Public
573+
546574 if isCommittedPrivate {
547- ckk [cI ].Set (& L [i ])
548- cI ++
575+ if cI < len (ckk ) {
576+ ckk [cI ].Set (& L [i ])
577+ cI ++
578+ }
549579 } else if isCommitment || isPublic {
550- vkk [vI ].Set (& L [i ])
551- vI ++
580+ if vI < len (vkk ) {
581+ vkk [vI ].Set (& L [i ])
582+ vI ++
583+ }
552584 } else {
553- pkk [i - cI - vI ].Set (& L [i ])
585+ pIndex := i - cI - vI
586+ if pIndex >= 0 && pIndex < len (pkk ) {
587+ pkk [pIndex ].Set (& L [i ])
588+ }
554589 }
555590 }
556591
@@ -594,3 +629,14 @@ func readPhase1(phase1File *os.File, power byte) (*bn254.G1Affine, *bn254.G1Affi
594629 return & alpha , & beta1 , & beta2 , nil
595630
596631}
632+
633+ func Is (commitments constraint.Groth16Commitments ) bool {
634+ var isCommitted bool
635+ for _ , commitment := range commitments {
636+ if len (commitment .PublicAndCommitmentCommitted ) > 0 || len (commitment .PrivateCommitted ) > 0 {
637+ isCommitted = true
638+ break
639+ }
640+ }
641+ return isCommitted
642+ }
0 commit comments