Skip to content

Commit

Permalink
Merge branch 'master' into feat/gkr-api
Browse files Browse the repository at this point in the history
  • Loading branch information
gbotrel committed Feb 15, 2023
2 parents 6a20a0b + 2753ae6 commit 7397dff
Show file tree
Hide file tree
Showing 70 changed files with 1,805 additions and 2,856 deletions.
169 changes: 169 additions & 0 deletions backend/plonk/plonk_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
package plonk_test

import (
"bytes"
"math/big"
"testing"

"github.com/consensys/gnark"
"github.com/consensys/gnark-crypto/ecc"
"github.com/consensys/gnark-crypto/kzg"
"github.com/consensys/gnark/backend/plonk"
"github.com/consensys/gnark/constraint"
"github.com/consensys/gnark/frontend"
"github.com/consensys/gnark/frontend/cs/scs"
"github.com/consensys/gnark/test"
"github.com/stretchr/testify/require"
)

//--------------------//
// benches //
//--------------------//

func TestProver(t *testing.T) {

for _, curve := range getCurves() {
t.Run(curve.String(), func(t *testing.T) {
var b1, b2 bytes.Buffer
assert := require.New(t)

ccs, _solution, srs := referenceCircuit(curve)
fullWitness, err := frontend.NewWitness(_solution, curve.ScalarField())
assert.NoError(err)

publicWitness, err := fullWitness.Public()
assert.NoError(err)

pk, vk, err := plonk.Setup(ccs, srs)
assert.NoError(err)

// write the PK to ensure it is not mutated
_, err = pk.WriteTo(&b1)
assert.NoError(err)

proof, err := plonk.Prove(ccs, pk, fullWitness)
assert.NoError(err)

// check pk
_, err = pk.WriteTo(&b2)
assert.NoError(err)

assert.True(bytes.Equal(b1.Bytes(), b2.Bytes()), "plonk prover mutated the proving key")

err = plonk.Verify(proof, vk, publicWitness)
assert.NoError(err)

})

}
}

func BenchmarkSetup(b *testing.B) {
for _, curve := range getCurves() {
b.Run(curve.String(), func(b *testing.B) {
ccs, _, srs := referenceCircuit(curve)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _, _ = plonk.Setup(ccs, srs)
}
})
}
}

func BenchmarkProver(b *testing.B) {
for _, curve := range getCurves() {
b.Run(curve.String(), func(b *testing.B) {
ccs, _solution, srs := referenceCircuit(curve)
fullWitness, err := frontend.NewWitness(_solution, curve.ScalarField())
if err != nil {
b.Fatal(err)
}
pk, _, err := plonk.Setup(ccs, srs)
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = plonk.Prove(ccs, pk, fullWitness)
}
})
}
}

func BenchmarkVerifier(b *testing.B) {
for _, curve := range getCurves() {
b.Run(curve.String(), func(b *testing.B) {
ccs, _solution, srs := referenceCircuit(curve)
fullWitness, err := frontend.NewWitness(_solution, curve.ScalarField())
if err != nil {
b.Fatal(err)
}
publicWitness, err := fullWitness.Public()
if err != nil {
b.Fatal(err)
}

pk, vk, err := plonk.Setup(ccs, srs)
if err != nil {
b.Fatal(err)
}
proof, err := plonk.Prove(ccs, pk, fullWitness)
if err != nil {
panic(err)
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = plonk.Verify(proof, vk, publicWitness)
}
})
}
}

type refCircuit struct {
nbConstraints int
X frontend.Variable
Y frontend.Variable `gnark:",public"`
}

func (circuit *refCircuit) Define(api frontend.API) error {
for i := 0; i < circuit.nbConstraints; i++ {
circuit.X = api.Mul(circuit.X, circuit.X)
}
api.AssertIsEqual(circuit.X, circuit.Y)
return nil
}

func referenceCircuit(curve ecc.ID) (constraint.ConstraintSystem, frontend.Circuit, kzg.SRS) {
const nbConstraints = 40000
circuit := refCircuit{
nbConstraints: nbConstraints,
}
ccs, err := frontend.Compile(curve.ScalarField(), scs.NewBuilder, &circuit)
if err != nil {
panic(err)
}

var good refCircuit
good.X = 2

// compute expected Y
expectedY := new(big.Int).SetUint64(2)
exp := big.NewInt(1)
exp.Lsh(exp, nbConstraints)
expectedY.Exp(expectedY, exp, curve.ScalarField())

good.Y = expectedY
srs, err := test.NewKZGSRS(ccs)
if err != nil {
panic(err)
}
return ccs, &good, srs
}

func getCurves() []ecc.ID {
if testing.Short() {
return []ecc.ID{ecc.BN254}
}
return gnark.Curves()
}
22 changes: 21 additions & 1 deletion backend/witness/witness.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,27 @@ func (w *witness) WriteTo(wr io.Writer) (n int64, err error) {
n += 4

// write the vector
m, err := w.vector.(io.WriterTo).WriteTo(wr)
var m int64
switch t := w.vector.(type) {
case fr_bn254.Vector:
m, err = t.WriteTo(wr)
case fr_bls12377.Vector:
m, err = t.WriteTo(wr)
case fr_bls12381.Vector:
m, err = t.WriteTo(wr)
case fr_bw6761.Vector:
m, err = t.WriteTo(wr)
case fr_bls24317.Vector:
m, err = t.WriteTo(wr)
case fr_bls24315.Vector:
m, err = t.WriteTo(wr)
case fr_bw6633.Vector:
m, err = t.WriteTo(wr)
case tinyfield.Vector:
m, err = t.WriteTo(wr)
default:
panic("invalid input")
}
n += m
return n, err
}
Expand Down
84 changes: 84 additions & 0 deletions constant/constant.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/consensys/gnark-crypto/ecc"
)

var Version = semver.MustParse("0.8.0-alpha")
var Version = semver.MustParse("0.8.0")

// Curves return the curves supported by gnark
func Curves() []ecc.ID {
Expand Down
2 changes: 1 addition & 1 deletion examples/mimc/mimc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func TestPreimage(t *testing.T) {

assert.ProverSucceeded(&mimcCircuit, &Circuit{
PreImage: "16130099170765464552823636852555369511329944820189892919423002775646948828469",
Hash: "8674594860895598770446879254410848023850744751986836044725552747672873438975",
Hash: "12886436712380113721405259596386800092738845035233065858332878701083870690753",
}, test.WithCurves(ecc.BN254))

}
22 changes: 12 additions & 10 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,26 @@ require (
github.com/bits-and-blooms/bitset v1.5.0
github.com/blang/semver/v4 v4.0.0
github.com/consensys/bavard v0.1.13
github.com/consensys/gnark-crypto v0.9.1-0.20230210193008-6f591e7c0ebd
github.com/fxamacker/cbor/v2 v2.2.0
github.com/google/go-cmp v0.5.8
github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1
github.com/consensys/gnark-crypto v0.9.1
github.com/fxamacker/cbor/v2 v2.4.0
github.com/google/go-cmp v0.5.9
github.com/google/pprof v0.0.0-20230207041349-798e818bf904
github.com/leanovate/gopter v0.2.9
github.com/rs/zerolog v1.26.1
github.com/stretchr/testify v1.8.0
golang.org/x/exp v0.0.0-20220713135740-79cabaa25d75
github.com/rs/zerolog v1.29.0
github.com/stretchr/testify v1.8.1
golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/kr/pretty v0.3.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/crypto v0.6.0 // indirect
golang.org/x/sys v0.5.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
Expand Down
Loading

0 comments on commit 7397dff

Please sign in to comment.