Skip to content

Commit 14fa7e6

Browse files
yelhousniclaude
andauthored
feat: add grumpkin curve support (#1729)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1c6aa6e commit 14fa7e6

File tree

10 files changed

+1305
-5
lines changed

10 files changed

+1305
-5
lines changed

backend/witness/vector.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
fr_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fr"
1111
fr_bn254 "github.com/consensys/gnark-crypto/ecc/bn254/fr"
1212
fr_bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761/fr"
13+
fr_grumpkin "github.com/consensys/gnark-crypto/ecc/grumpkin/fr"
1314
"github.com/consensys/gnark-crypto/field/babybear"
1415
"github.com/consensys/gnark-crypto/field/koalabear"
1516
"github.com/consensys/gnark/internal/smallfields/tinyfield"
@@ -28,6 +29,9 @@ func newVector(field *big.Int, size int) (any, error) {
2829
case ecc.BW6_761:
2930
return make(fr_bw6761.Vector, size), nil
3031
default:
32+
if field.Cmp(ecc.GRUMPKIN.ScalarField()) == 0 {
33+
return make(fr_grumpkin.Vector, size), nil
34+
}
3135
if field.Cmp(tinyfield.Modulus()) == 0 {
3236
return make(tinyfield.Vector, size), nil
3337
}
@@ -59,6 +63,10 @@ func newFrom(from any, n int) (any, error) {
5963
a := make(fr_bw6761.Vector, n)
6064
copy(a, wt)
6165
return a, nil
66+
case fr_grumpkin.Vector:
67+
a := make(fr_grumpkin.Vector, n)
68+
copy(a, wt)
69+
return a, nil
6270
case tinyfield.Vector:
6371
a := make(tinyfield.Vector, n)
6472
copy(a, wt)
@@ -86,6 +94,8 @@ func leafType(v any) reflect.Type {
8694
return reflect.TypeOf(fr_bls12381.Element{})
8795
case fr_bw6761.Vector:
8896
return reflect.TypeOf(fr_bw6761.Element{})
97+
case fr_grumpkin.Vector:
98+
return reflect.TypeOf(fr_grumpkin.Element{})
8999
case tinyfield.Vector:
90100
return reflect.TypeOf(tinyfield.Element{})
91101
case babybear.Vector:
@@ -123,6 +133,12 @@ func set(v any, index int, value any) error {
123133
}
124134
_, err := pv[index].SetInterface(value)
125135
return err
136+
case fr_grumpkin.Vector:
137+
if index >= len(pv) {
138+
return errors.New("out of bounds")
139+
}
140+
_, err := pv[index].SetInterface(value)
141+
return err
126142
case tinyfield.Vector:
127143
if index >= len(pv) {
128144
return errors.New("out of bounds")
@@ -177,6 +193,13 @@ func iterate(v any) chan any {
177193
}
178194
close(chValues)
179195
}()
196+
case fr_grumpkin.Vector:
197+
go func() {
198+
for i := 0; i < len(pv); i++ {
199+
chValues <- &(pv)[i]
200+
}
201+
close(chValues)
202+
}()
180203
case tinyfield.Vector:
181204
go func() {
182205
for i := 0; i < len(pv); i++ {
@@ -214,6 +237,8 @@ func resize(v any, n int) any {
214237
return make(fr_bls12381.Vector, n)
215238
case fr_bw6761.Vector:
216239
return make(fr_bw6761.Vector, n)
240+
case fr_grumpkin.Vector:
241+
return make(fr_grumpkin.Vector, n)
217242
case tinyfield.Vector:
218243
return make(tinyfield.Vector, n)
219244
case babybear.Vector:

backend/witness/witness.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
fr_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fr"
5252
fr_bn254 "github.com/consensys/gnark-crypto/ecc/bn254/fr"
5353
fr_bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761/fr"
54+
fr_grumpkin "github.com/consensys/gnark-crypto/ecc/grumpkin/fr"
5455
"github.com/consensys/gnark-crypto/field/babybear"
5556
"github.com/consensys/gnark-crypto/field/koalabear"
5657
"github.com/consensys/gnark/debug"
@@ -180,6 +181,8 @@ func (w *witness) WriteTo(wr io.Writer) (n int64, err error) {
180181
m, err = t.WriteTo(wr)
181182
case fr_bw6761.Vector:
182183
m, err = t.WriteTo(wr)
184+
case fr_grumpkin.Vector:
185+
m, err = t.WriteTo(wr)
183186
case tinyfield.Vector:
184187
m, err = t.WriteTo(wr)
185188
case babybear.Vector:
@@ -220,6 +223,9 @@ func (w *witness) ReadFrom(r io.Reader) (n int64, err error) {
220223
case fr_bw6761.Vector:
221224
m, err = t.ReadFrom(r)
222225
w.vector = t
226+
case fr_grumpkin.Vector:
227+
m, err = t.ReadFrom(r)
228+
w.vector = t
223229
case tinyfield.Vector:
224230
m, err = t.ReadFrom(r)
225231
w.vector = t

constraint/field.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"math/big"
77

88
"github.com/consensys/gnark"
9+
"github.com/consensys/gnark-crypto/ecc"
910
"github.com/consensys/gnark/internal/smallfields"
1011
)
1112

@@ -78,6 +79,9 @@ func FitsElement[E Element](modulus *big.Int) bool {
7879
return true
7980
}
8081
}
82+
if modulus.Cmp(ecc.GRUMPKIN.ScalarField()) == 0 {
83+
return true
84+
}
8185
return false
8286
default:
8387
panic("unsupported type")

constraint/grumpkin/coeff.go

Lines changed: 220 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)