From 887665793a64f3db2c0a3ec8074c406dc072dba5 Mon Sep 17 00:00:00 2001 From: Arya Tabaie <15056835+Tabaie@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:47:36 -0600 Subject: [PATCH 1/4] perf: parallelize subgroup check --- ecc/bls12-377/kzg/mpcsetup.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/ecc/bls12-377/kzg/mpcsetup.go b/ecc/bls12-377/kzg/mpcsetup.go index 1d9da00586..46d3f6f219 100644 --- a/ecc/bls12-377/kzg/mpcsetup.go +++ b/ecc/bls12-377/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bls12-377" "github.com/consensys/gnark-crypto/ecc/bls12-377/fr" "github.com/consensys/gnark-crypto/ecc/bls12-377/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ From 48efc4edf454bf45b7d5fc6cfc1bac67d7848e74 Mon Sep 17 00:00:00 2001 From: Arya Tabaie <15056835+Tabaie@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:51:14 -0600 Subject: [PATCH 2/4] build: generify changes --- ecc/bls12-381/kzg/mpcsetup.go | 25 ++++++++++++++++--- ecc/bls24-315/kzg/mpcsetup.go | 25 ++++++++++++++++--- ecc/bls24-317/kzg/mpcsetup.go | 25 ++++++++++++++++--- ecc/bn254/kzg/mpcsetup.go | 25 ++++++++++++++++--- ecc/bw6-633/kzg/mpcsetup.go | 25 ++++++++++++++++--- ecc/bw6-761/kzg/mpcsetup.go | 25 ++++++++++++++++--- .../generator/kzg/template/mpcsetup.go.tmpl | 25 ++++++++++++++++--- 7 files changed, 147 insertions(+), 28 deletions(-) diff --git a/ecc/bls12-381/kzg/mpcsetup.go b/ecc/bls12-381/kzg/mpcsetup.go index d7fd7e8ec3..d9a454bc2b 100644 --- a/ecc/bls12-381/kzg/mpcsetup.go +++ b/ecc/bls12-381/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bls12-381" "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" "github.com/consensys/gnark-crypto/ecc/bls12-381/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bls24-315/kzg/mpcsetup.go b/ecc/bls24-315/kzg/mpcsetup.go index 2afb830462..66db498c7e 100644 --- a/ecc/bls24-315/kzg/mpcsetup.go +++ b/ecc/bls24-315/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bls24-315" "github.com/consensys/gnark-crypto/ecc/bls24-315/fr" "github.com/consensys/gnark-crypto/ecc/bls24-315/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bls24-317/kzg/mpcsetup.go b/ecc/bls24-317/kzg/mpcsetup.go index 37c3e50dc7..18d0994857 100644 --- a/ecc/bls24-317/kzg/mpcsetup.go +++ b/ecc/bls24-317/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bls24-317" "github.com/consensys/gnark-crypto/ecc/bls24-317/fr" "github.com/consensys/gnark-crypto/ecc/bls24-317/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bn254/kzg/mpcsetup.go b/ecc/bn254/kzg/mpcsetup.go index 39d6e10f9c..99acfd182e 100644 --- a/ecc/bn254/kzg/mpcsetup.go +++ b/ecc/bn254/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bn254" "github.com/consensys/gnark-crypto/ecc/bn254/fr" "github.com/consensys/gnark-crypto/ecc/bn254/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bw6-633/kzg/mpcsetup.go b/ecc/bw6-633/kzg/mpcsetup.go index d2bf845925..1c1d64a506 100644 --- a/ecc/bw6-633/kzg/mpcsetup.go +++ b/ecc/bw6-633/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bw6-633" "github.com/consensys/gnark-crypto/ecc/bw6-633/fr" "github.com/consensys/gnark-crypto/ecc/bw6-633/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bw6-761/kzg/mpcsetup.go b/ecc/bw6-761/kzg/mpcsetup.go index 77f2e1599d..2c9331c323 100644 --- a/ecc/bw6-761/kzg/mpcsetup.go +++ b/ecc/bw6-761/kzg/mpcsetup.go @@ -10,11 +10,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/bw6-761" "github.com/consensys/gnark-crypto/ecc/bw6-761/fr" "github.com/consensys/gnark-crypto/ecc/bw6-761/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -120,12 +123,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/internal/generator/kzg/template/mpcsetup.go.tmpl b/internal/generator/kzg/template/mpcsetup.go.tmpl index 973d23652c..75bb95fe6f 100644 --- a/internal/generator/kzg/template/mpcsetup.go.tmpl +++ b/internal/generator/kzg/template/mpcsetup.go.tmpl @@ -3,11 +3,14 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" curve "github.com/consensys/gnark-crypto/ecc/{{.Name}}" "github.com/consensys/gnark-crypto/ecc/{{.Name}}/fr" "github.com/consensys/gnark-crypto/ecc/{{.Name}}/mpcsetup" + "github.com/consensys/gnark-crypto/utils" "io" "math/big" + "runtime" ) type MpcSetup struct { @@ -113,12 +116,26 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { } if !next.srs.Vk.G2[1].IsInSubGroup() { - return errors.New("𝔾₂ representation not in subgroup") + return errors.New("[x]₂ representation not in subgroup") } - for i := 1; i < len(next.srs.Pk.G1); i++ { - if !next.srs.Pk.G1[i].IsInSubGroup() { - return errors.New("𝔾₁ representation not in subgroup") + + // TODO @Tabaie replace with batch subgroup check + n := len(next.srs.Pk.G1) - 1 + fail := -1 + wp := utils.NewWorkerPool() + defer wp.Stop() + + wp.Submit(n, func(start, end int) { + for i := start; i < end; i++ { + if !next.srs.Pk.G1[i+1].IsInSubGroup() { + fail = i + 1 + break + } } + }, n/runtime.NumCPU()+1).Wait() + + if fail != -1 { + return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ From a7ee2ec2a9f65b58693c1440717bb3f685781e43 Mon Sep 17 00:00:00 2001 From: Arya Tabaie <15056835+Tabaie@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:16:52 -0600 Subject: [PATCH 3/4] fix: error channel --- ecc/bls12-377/kzg/mpcsetup.go | 14 ++++++++------ ecc/bls12-381/kzg/mpcsetup.go | 14 ++++++++------ ecc/bls24-315/kzg/mpcsetup.go | 14 ++++++++------ ecc/bls24-317/kzg/mpcsetup.go | 14 ++++++++------ ecc/bn254/kzg/mpcsetup.go | 14 ++++++++------ ecc/bw6-633/kzg/mpcsetup.go | 14 ++++++++------ ecc/bw6-761/kzg/mpcsetup.go | 14 ++++++++------ internal/generator/kzg/template/mpcsetup.go.tmpl | 14 ++++++++------ utils/parallel.go | 4 ++++ 9 files changed, 68 insertions(+), 48 deletions(-) diff --git a/ecc/bls12-377/kzg/mpcsetup.go b/ecc/bls12-377/kzg/mpcsetup.go index 46d3f6f219..84d156a737 100644 --- a/ecc/bls12-377/kzg/mpcsetup.go +++ b/ecc/bls12-377/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bls12-381/kzg/mpcsetup.go b/ecc/bls12-381/kzg/mpcsetup.go index d9a454bc2b..5934f73cb7 100644 --- a/ecc/bls12-381/kzg/mpcsetup.go +++ b/ecc/bls12-381/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bls24-315/kzg/mpcsetup.go b/ecc/bls24-315/kzg/mpcsetup.go index 66db498c7e..41a720c175 100644 --- a/ecc/bls24-315/kzg/mpcsetup.go +++ b/ecc/bls24-315/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bls24-317/kzg/mpcsetup.go b/ecc/bls24-317/kzg/mpcsetup.go index 18d0994857..b3f6e2a00a 100644 --- a/ecc/bls24-317/kzg/mpcsetup.go +++ b/ecc/bls24-317/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bn254/kzg/mpcsetup.go b/ecc/bn254/kzg/mpcsetup.go index 99acfd182e..bbb55b0dae 100644 --- a/ecc/bn254/kzg/mpcsetup.go +++ b/ecc/bn254/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bw6-633/kzg/mpcsetup.go b/ecc/bw6-633/kzg/mpcsetup.go index 1c1d64a506..505ee8cf85 100644 --- a/ecc/bw6-633/kzg/mpcsetup.go +++ b/ecc/bw6-633/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/ecc/bw6-761/kzg/mpcsetup.go b/ecc/bw6-761/kzg/mpcsetup.go index 2c9331c323..aacdd0c113 100644 --- a/ecc/bw6-761/kzg/mpcsetup.go +++ b/ecc/bw6-761/kzg/mpcsetup.go @@ -128,21 +128,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/internal/generator/kzg/template/mpcsetup.go.tmpl b/internal/generator/kzg/template/mpcsetup.go.tmpl index 75bb95fe6f..8e9e4e187d 100644 --- a/internal/generator/kzg/template/mpcsetup.go.tmpl +++ b/internal/generator/kzg/template/mpcsetup.go.tmpl @@ -121,21 +121,23 @@ func (s *MpcSetup) Verify(next *MpcSetup) error { // TODO @Tabaie replace with batch subgroup check n := len(next.srs.Pk.G1) - 1 - fail := -1 wp := utils.NewWorkerPool() defer wp.Stop() + fail := make(chan error, wp.NbWorkers()) wp.Submit(n, func(start, end int) { for i := start; i < end; i++ { if !next.srs.Pk.G1[i+1].IsInSubGroup() { - fail = i + 1 + fail <- fmt.Errorf("[x^%d]₁ representation not in subgroup", i+1) break } } - }, n/runtime.NumCPU()+1).Wait() - - if fail != -1 { - return fmt.Errorf("[x^%d]₁ representation not in subgroup", fail) + }, n/wp.NbWorkers()+1).Wait() + close(fail) + for err := range fail { + if err != nil { + return err + } } if err := next.proof.Verify(append([]byte("KZG Setup"), challenge...), 0, mpcsetup.ValueUpdate{ diff --git a/utils/parallel.go b/utils/parallel.go index 0421fab507..1a67bc95b1 100644 --- a/utils/parallel.go +++ b/utils/parallel.go @@ -35,6 +35,10 @@ func NewWorkerPool() *WorkerPool { return p } +func (wp *WorkerPool) NbWorkers() int { + return wp.nbWorkers +} + // Stop (but does not wait) the pool. It frees the worker. func (wp *WorkerPool) Stop() { close(wp.chJobs) From fd00f4da8df4c392f5d3853fed281fbea910cece Mon Sep 17 00:00:00 2001 From: Arya Tabaie <15056835+Tabaie@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:18:45 -0600 Subject: [PATCH 4/4] fix: remove unused import --- ecc/bls12-377/kzg/mpcsetup.go | 1 - ecc/bls12-381/kzg/mpcsetup.go | 1 - ecc/bls24-315/kzg/mpcsetup.go | 1 - ecc/bls24-317/kzg/mpcsetup.go | 1 - ecc/bn254/kzg/mpcsetup.go | 1 - ecc/bw6-633/kzg/mpcsetup.go | 1 - ecc/bw6-761/kzg/mpcsetup.go | 1 - internal/generator/kzg/template/mpcsetup.go.tmpl | 1 - 8 files changed, 8 deletions(-) diff --git a/ecc/bls12-377/kzg/mpcsetup.go b/ecc/bls12-377/kzg/mpcsetup.go index 84d156a737..c8243506f6 100644 --- a/ecc/bls12-377/kzg/mpcsetup.go +++ b/ecc/bls12-377/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/ecc/bls12-381/kzg/mpcsetup.go b/ecc/bls12-381/kzg/mpcsetup.go index 5934f73cb7..f448261352 100644 --- a/ecc/bls12-381/kzg/mpcsetup.go +++ b/ecc/bls12-381/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/ecc/bls24-315/kzg/mpcsetup.go b/ecc/bls24-315/kzg/mpcsetup.go index 41a720c175..7d41f3d74f 100644 --- a/ecc/bls24-315/kzg/mpcsetup.go +++ b/ecc/bls24-315/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/ecc/bls24-317/kzg/mpcsetup.go b/ecc/bls24-317/kzg/mpcsetup.go index b3f6e2a00a..a460fe934e 100644 --- a/ecc/bls24-317/kzg/mpcsetup.go +++ b/ecc/bls24-317/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/ecc/bn254/kzg/mpcsetup.go b/ecc/bn254/kzg/mpcsetup.go index bbb55b0dae..c5bc0a9542 100644 --- a/ecc/bn254/kzg/mpcsetup.go +++ b/ecc/bn254/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/ecc/bw6-633/kzg/mpcsetup.go b/ecc/bw6-633/kzg/mpcsetup.go index 505ee8cf85..2fdc655579 100644 --- a/ecc/bw6-633/kzg/mpcsetup.go +++ b/ecc/bw6-633/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/ecc/bw6-761/kzg/mpcsetup.go b/ecc/bw6-761/kzg/mpcsetup.go index aacdd0c113..f85644f4cc 100644 --- a/ecc/bw6-761/kzg/mpcsetup.go +++ b/ecc/bw6-761/kzg/mpcsetup.go @@ -17,7 +17,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct { diff --git a/internal/generator/kzg/template/mpcsetup.go.tmpl b/internal/generator/kzg/template/mpcsetup.go.tmpl index 8e9e4e187d..913cccca66 100644 --- a/internal/generator/kzg/template/mpcsetup.go.tmpl +++ b/internal/generator/kzg/template/mpcsetup.go.tmpl @@ -10,7 +10,6 @@ import ( "github.com/consensys/gnark-crypto/utils" "io" "math/big" - "runtime" ) type MpcSetup struct {