package verifier_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/consensys/gnark-crypto/ecc"
|
|
"github.com/consensys/gnark/backend"
|
|
"github.com/consensys/gnark/frontend"
|
|
"github.com/consensys/gnark/std/math/emulated"
|
|
"github.com/consensys/gnark/test"
|
|
gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
|
|
"github.com/succinctlabs/gnark-plonky2-verifier/types"
|
|
"github.com/succinctlabs/gnark-plonky2-verifier/verifier"
|
|
)
|
|
|
|
type TestVerifierCircuit struct {
|
|
Proof types.Proof
|
|
PublicInputs []gl.Variable `gnark:",public"`
|
|
|
|
verifierChip *verifier.VerifierChip `gnark:"-"`
|
|
plonky2CircuitName string `gnark:"-"`
|
|
}
|
|
|
|
func (c *TestVerifierCircuit) Define(api frontend.API) error {
|
|
circuitDirname := "./data/" + c.plonky2CircuitName + "/"
|
|
commonCircuitData := verifier.DeserializeCommonCircuitData(circuitDirname + "common_circuit_data.json")
|
|
verifierOnlyCircuitData := verifier.DeserializeVerifierOnlyCircuitData(circuitDirname + "verifier_only_circuit_data.json")
|
|
|
|
c.verifierChip = verifier.NewVerifierChip(api, commonCircuitData)
|
|
|
|
c.verifierChip.Verify(c.Proof, c.PublicInputs, verifierOnlyCircuitData, commonCircuitData)
|
|
|
|
return nil
|
|
}
|
|
|
|
func TestStepVerifier(t *testing.T) {
|
|
assert := test.NewAssert(t)
|
|
|
|
testCase := func() {
|
|
plonky2Circuit := "step"
|
|
proofWithPis := verifier.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
|
|
circuit := TestVerifierCircuit{
|
|
plonky2CircuitName: plonky2Circuit,
|
|
Proof: proofWithPis.Proof,
|
|
PublicInputs: proofWithPis.PublicInputs,
|
|
}
|
|
|
|
proofWithPis2 := verifier.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
|
|
witness := TestVerifierCircuit{
|
|
plonky2CircuitName: plonky2Circuit,
|
|
Proof: proofWithPis2.Proof,
|
|
PublicInputs: proofWithPis2.PublicInputs,
|
|
}
|
|
|
|
err := test.IsSolved(&circuit, &witness, ecc.BN254.ScalarField())
|
|
assert.NoError(err)
|
|
}
|
|
testCase()
|
|
}
|
|
|
|
func TestStepVerifier2(t *testing.T) {
|
|
assert := test.NewAssert(t)
|
|
|
|
plonky2Circuit := "step"
|
|
proofWithPis := verifier.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
|
|
circuit := TestVerifierCircuit{
|
|
plonky2CircuitName: plonky2Circuit,
|
|
Proof: proofWithPis.Proof,
|
|
PublicInputs: proofWithPis.PublicInputs,
|
|
}
|
|
|
|
proofWithPis2 := verifier.DeserializeProofWithPublicInputs("./data/" + plonky2Circuit + "/proof_with_public_inputs.json")
|
|
witness := TestVerifierCircuit{
|
|
plonky2CircuitName: plonky2Circuit,
|
|
Proof: proofWithPis2.Proof,
|
|
PublicInputs: proofWithPis2.PublicInputs,
|
|
}
|
|
|
|
assert.ProverSucceeded(
|
|
&circuit,
|
|
&witness,
|
|
test.WithBackends(backend.GROTH16),
|
|
test.WithCurves(ecc.BN254),
|
|
test.NoFuzzing(),
|
|
test.NoSerialization(),
|
|
)
|
|
}
|
|
|
|
type testCircuit struct {
|
|
Arr [2]emulated.Element[emulated.Secp256k1Fp]
|
|
Expected emulated.Element[emulated.Secp256k1Fp]
|
|
}
|
|
|
|
func (circuit *testCircuit) Define(api frontend.API) error {
|
|
field, _ := emulated.NewField[emulated.Secp256k1Fp](api)
|
|
|
|
mulRes := field.Mul(&circuit.Arr[0], &circuit.Arr[1])
|
|
field.AssertIsEqual(mulRes, &circuit.Expected)
|
|
|
|
return nil
|
|
}
|
|
|
|
func TestMain(t *testing.T) {
|
|
assert := test.NewAssert(t)
|
|
|
|
var circuit testCircuit
|
|
|
|
assert.ProverSucceeded(
|
|
&circuit,
|
|
&testCircuit{
|
|
Arr: [2]emulated.Element[emulated.Secp256k1Fp]{
|
|
emulated.ValueOf[emulated.Secp256k1Fp](42),
|
|
emulated.ValueOf[emulated.Secp256k1Fp](24),
|
|
},
|
|
Expected: emulated.ValueOf[emulated.Secp256k1Fp](1008),
|
|
},
|
|
test.WithBackends(backend.GROTH16),
|
|
test.WithCurves(ecc.BN254),
|
|
test.NoFuzzing(),
|
|
test.NoSerialization(),
|
|
)
|
|
}
|