@ -4,65 +4,29 @@ import (
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"io/ioutil"
"io/ioutil"
"math/big"
"testing"
"testing"
"time"
"time"
"github.com/iden3/go-circom-prover-verifier/parsers"
"github.com/iden3/go-circom-prover-verifier/parsers"
"github.com/iden3/go-circom-prover-verifier/types"
"github.com/iden3/go-circom-prover-verifier/verifier"
"github.com/iden3/go-circom-prover-verifier/verifier"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
)
func TestSmallCircuitGenerateProof ( t * testing . T ) {
provingKeyJson , err := ioutil . ReadFile ( "../testdata/small/proving_key.json" )
require . Nil ( t , err )
pk , err := parsers . ParsePk ( provingKeyJson )
require . Nil ( t , err )
witnessJson , err := ioutil . ReadFile ( "../testdata/small/witness.json" )
require . Nil ( t , err )
w , err := parsers . ParseWitness ( witnessJson )
require . Nil ( t , err )
assert . Equal ( t , types . Witness { big . NewInt ( 1 ) , big . NewInt ( 33 ) , big . NewInt ( 3 ) , big . NewInt ( 11 ) } , w )
beforeT := time . Now ( )
proof , pubSignals , err := GenerateProof ( pk , w )
assert . Nil ( t , err )
fmt . Println ( "proof generation time elapsed:" , time . Since ( beforeT ) )
proofStr , err := parsers . ProofToJson ( proof )
assert . Nil ( t , err )
err = ioutil . WriteFile ( "../testdata/small/proof.json" , proofStr , 0644 )
assert . Nil ( t , err )
publicStr , err := json . Marshal ( parsers . ArrayBigIntToString ( pubSignals ) )
assert . Nil ( t , err )
err = ioutil . WriteFile ( "../testdata/small/public.json" , publicStr , 0644 )
assert . Nil ( t , err )
// verify the proof
vkJson , err := ioutil . ReadFile ( "../testdata/small/verification_key.json" )
require . Nil ( t , err )
vk , err := parsers . ParseVk ( vkJson )
require . Nil ( t , err )
v := verifier . Verify ( vk , proof , pubSignals )
assert . True ( t , v )
// to verify the proof with snarkjs:
// snarkjs verify --vk testdata/small/verification_key.json -p testdata/small/proof.json --pub testdata/small/public.json
func TestCircuitsGenerateProof ( t * testing . T ) {
testCircuitGenerateProof ( t , "circuit1k" ) // 1000 constraints
testCircuitGenerateProof ( t , "circuit5k" ) // 5000 constraints
// testCircuitGenerateProof(t, "circuit10k") // 10000 constraints
// testCircuitGenerateProof(t, "circuit20k") // 20000 constraints
}
}
func TestBig CircuitGenerateProof( t * testing . T ) {
provingKeyJson , err := ioutil . ReadFile ( "../testdata/big /proving_key.json" )
func testCircuitGenerateProof ( t * testing . T , circuit string ) {
provingKeyJson , err := ioutil . ReadFile ( "../testdata/" + circuit + "/proving_key.json" )
require . Nil ( t , err )
require . Nil ( t , err )
pk , err := parsers . ParsePk ( provingKeyJson )
pk , err := parsers . ParsePk ( provingKeyJson )
require . Nil ( t , err )
require . Nil ( t , err )
witnessJson , err := ioutil . ReadFile ( "../testdata/big /witness.json" )
witnessJson , err := ioutil . ReadFile ( "../testdata/" + circuit + "/witness.json" )
require . Nil ( t , err )
require . Nil ( t , err )
w , err := parsers . ParseWitness ( witnessJson )
w , err := parsers . ParseWitness ( witnessJson )
require . Nil ( t , err )
require . Nil ( t , err )
@ -75,15 +39,15 @@ func TestBigCircuitGenerateProof(t *testing.T) {
proofStr , err := parsers . ProofToJson ( proof )
proofStr , err := parsers . ProofToJson ( proof )
assert . Nil ( t , err )
assert . Nil ( t , err )
err = ioutil . WriteFile ( "../testdata/big /proof.json" , proofStr , 0644 )
err = ioutil . WriteFile ( "../testdata/" + circuit + " /proof.json" , proofStr , 0644 )
assert . Nil ( t , err )
assert . Nil ( t , err )
publicStr , err := json . Marshal ( parsers . ArrayBigIntToString ( pubSignals ) )
publicStr , err := json . Marshal ( parsers . ArrayBigIntToString ( pubSignals ) )
assert . Nil ( t , err )
assert . Nil ( t , err )
err = ioutil . WriteFile ( "../testdata/big /public.json" , publicStr , 0644 )
err = ioutil . WriteFile ( "../testdata/" + circuit + " /public.json" , publicStr , 0644 )
assert . Nil ( t , err )
assert . Nil ( t , err )
// verify the proof
// verify the proof
vkJson , err := ioutil . ReadFile ( "../testdata/big /verification_key.json" )
vkJson , err := ioutil . ReadFile ( "../testdata/" + circuit + " /verification_key.json" )
require . Nil ( t , err )
require . Nil ( t , err )
vk , err := parsers . ParseVk ( vkJson )
vk , err := parsers . ParseVk ( vkJson )
require . Nil ( t , err )
require . Nil ( t , err )
@ -92,62 +56,17 @@ func TestBigCircuitGenerateProof(t *testing.T) {
assert . True ( t , v )
assert . True ( t , v )
// to verify the proof with snarkjs:
// to verify the proof with snarkjs:
// snarkjs verify --vk testdata/big/verification_key.json -p testdata/big/proof.json --pub testdata/big/public.json
}
func TestIdStateCircuitGenerateProof ( t * testing . T ) {
// this test is to execute the proof generation for a bigger circuit
// (arround 22500 constraints)
//
// to see the time needed to execute this
// test Will need the ../testdata/idstate-circuit compiled &
// trustedsetup files (generated in
// https://github.com/iden3/go-zksnark-full-flow-example)
if false {
fmt . Println ( "\nTestIdStateCircuitGenerateProof activated" )
provingKeyJson , err := ioutil . ReadFile ( "../testdata/idstate-circuit/proving_key.json" )
require . Nil ( t , err )
pk , err := parsers . ParsePk ( provingKeyJson )
require . Nil ( t , err )
witnessJson , err := ioutil . ReadFile ( "../testdata/idstate-circuit/witness.json" )
require . Nil ( t , err )
w , err := parsers . ParseWitness ( witnessJson )
require . Nil ( t , err )
beforeT := time . Now ( )
proof , pubSignals , err := GenerateProof ( pk , w )
assert . Nil ( t , err )
fmt . Println ( "proof generation time elapsed:" , time . Since ( beforeT ) )
proofStr , err := parsers . ProofToJson ( proof )
assert . Nil ( t , err )
err = ioutil . WriteFile ( "../testdata/idstate-circuit/proof.json" , proofStr , 0644 )
assert . Nil ( t , err )
publicStr , err := json . Marshal ( parsers . ArrayBigIntToString ( pubSignals ) )
assert . Nil ( t , err )
err = ioutil . WriteFile ( "../testdata/idstate-circuit/public.json" , publicStr , 0644 )
assert . Nil ( t , err )
// verify the proof
vkJson , err := ioutil . ReadFile ( "../testdata/idstate-circuit/verification_key.json" )
require . Nil ( t , err )
vk , err := parsers . ParseVk ( vkJson )
require . Nil ( t , err )
v := verifier . Verify ( vk , proof , pubSignals )
assert . True ( t , v )
}
// snarkjs verify --vk testdata/circuitX/verification_key.json -p testdata/circuitX/proof.json --pub testdata/circuitX/public.json
}
}
func BenchmarkGenerateProof ( b * testing . B ) {
func BenchmarkGenerateProof ( b * testing . B ) {
provingKeyJson , err := ioutil . ReadFile ( "../testdata/big/proving_key.json" )
// benchmark with a circuit of 10000 constraints
provingKeyJson , err := ioutil . ReadFile ( "../testdata/circuit1/proving_key.json" )
require . Nil ( b , err )
require . Nil ( b , err )
pk , err := parsers . ParsePk ( provingKeyJson )
pk , err := parsers . ParsePk ( provingKeyJson )
require . Nil ( b , err )
require . Nil ( b , err )
witnessJson , err := ioutil . ReadFile ( "../testdata/big /witness.json" )
witnessJson , err := ioutil . ReadFile ( "../testdata/circuit1/witness.json" )
require . Nil ( b , err )
require . Nil ( b , err )
w , err := parsers . ParseWitness ( witnessJson )
w , err := parsers . ParseWitness ( witnessJson )
require . Nil ( b , err )
require . Nil ( b , err )