From 41f7a3518ac9d3c94b5cdba8bb4735f0e8ab7305 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Sat, 27 Jul 2019 18:08:54 +0200 Subject: [PATCH] remove circuit parameter from proof Verification --- cli/main.go | 18 ++---------- groth16/groth16.go | 2 +- groth16/groth16_test.go | 4 +-- snark.go | 2 +- snark_test.go | 16 +++++------ wasm/go-snark-wasm-wrapper.go | 50 ++++++++++------------------------ wasm/go-snark.wasm | Bin 3871218 -> 3867208 bytes wasm/index.js | 1 - 8 files changed, 28 insertions(+), 65 deletions(-) diff --git a/cli/main.go b/cli/main.go index 6584bf7..3733e48 100644 --- a/cli/main.go +++ b/cli/main.go @@ -374,13 +374,6 @@ func VerifyProofs(context *cli.Context) error { json.Unmarshal([]byte(string(proofsFile)), &proof) panicErr(err) - // open compiledcircuit.json - compiledcircuitFile, err := ioutil.ReadFile("compiledcircuit.json") - panicErr(err) - var circuit circuitcompiler.Circuit - json.Unmarshal([]byte(string(compiledcircuitFile)), &circuit) - panicErr(err) - // open trustedsetup.json trustedsetupFile, err := ioutil.ReadFile("trustedsetup.json") panicErr(err) @@ -395,7 +388,7 @@ func VerifyProofs(context *cli.Context) error { err = json.Unmarshal([]byte(string(publicInputsFile)), &publicSignals) panicErr(err) - verified := snark.VerifyProof(circuit, trustedsetup, proof, publicSignals, true) + verified := snark.VerifyProof(trustedsetup, proof, publicSignals, true) if !verified { fmt.Println("ERROR: proofs not verified") } else { @@ -533,13 +526,6 @@ func Groth16VerifyProofs(context *cli.Context) error { json.Unmarshal([]byte(string(proofsFile)), &proof) panicErr(err) - // open compiledcircuit.json - compiledcircuitFile, err := ioutil.ReadFile("compiledcircuit.json") - panicErr(err) - var circuit circuitcompiler.Circuit - json.Unmarshal([]byte(string(compiledcircuitFile)), &circuit) - panicErr(err) - // open trustedsetup.json trustedsetupFile, err := ioutil.ReadFile("trustedsetup.json") panicErr(err) @@ -554,7 +540,7 @@ func Groth16VerifyProofs(context *cli.Context) error { err = json.Unmarshal([]byte(string(publicInputsFile)), &publicSignals) panicErr(err) - verified := groth16.VerifyProof(circuit, trustedsetup, proof, publicSignals, true) + verified := groth16.VerifyProof(trustedsetup, proof, publicSignals, true) if !verified { fmt.Println("ERROR: proofs not verified") } else { diff --git a/groth16/groth16.go b/groth16/groth16.go index 79592d2..e028997 100644 --- a/groth16/groth16.go +++ b/groth16/groth16.go @@ -275,7 +275,7 @@ func GenerateProofs(circuit circuitcompiler.Circuit, setup Setup, w []*big.Int, } // VerifyProof verifies over the BN128 the Pairings of the Proof -func VerifyProof(circuit circuitcompiler.Circuit, setup Setup, proof Proof, publicSignals []*big.Int, debug bool) bool { +func VerifyProof(setup Setup, proof Proof, publicSignals []*big.Int, debug bool) bool { icPubl := setup.Vk.IC[0] for i := 0; i < len(publicSignals); i++ { diff --git a/groth16/groth16_test.go b/groth16/groth16_test.go index fc91226..63c48b9 100644 --- a/groth16/groth16_test.go +++ b/groth16/groth16_test.go @@ -97,11 +97,11 @@ func TestGroth16MinimalFlow(t *testing.T) { b35Verif := big.NewInt(int64(35)) publicSignalsVerif := []*big.Int{b35Verif} before := time.Now() - assert.True(t, VerifyProof(*circuit, setup, proof, publicSignalsVerif, true)) + assert.True(t, VerifyProof(setup, proof, publicSignalsVerif, true)) fmt.Println("verify proof time elapsed:", time.Since(before)) // check that with another public input the verification returns false bOtherWrongPublic := big.NewInt(int64(34)) wrongPublicSignalsVerif := []*big.Int{bOtherWrongPublic} - assert.True(t, !VerifyProof(*circuit, setup, proof, wrongPublicSignalsVerif, false)) + assert.True(t, !VerifyProof(setup, proof, wrongPublicSignalsVerif, false)) } diff --git a/snark.go b/snark.go index 9bfe5cb..6e6e8c1 100644 --- a/snark.go +++ b/snark.go @@ -286,7 +286,7 @@ func GenerateProofs(circuit circuitcompiler.Circuit, setup Setup, w []*big.Int, } // VerifyProof verifies over the BN128 the Pairings of the Proof -func VerifyProof(circuit circuitcompiler.Circuit, setup Setup, proof Proof, publicSignals []*big.Int, debug bool) bool { +func VerifyProof(setup Setup, proof Proof, publicSignals []*big.Int, debug bool) bool { // e(piA, Va) == e(piA', g2) pairingPiaVa := Utils.Bn.Pairing(proof.PiA, setup.Vk.Vka) pairingPiapG2 := Utils.Bn.Pairing(proof.PiAp, Utils.Bn.G2.G) diff --git a/snark_test.go b/snark_test.go index 4cb4a85..0263185 100644 --- a/snark_test.go +++ b/snark_test.go @@ -98,13 +98,13 @@ func TestGroth16MinimalFlow(t *testing.T) { b35Verif := big.NewInt(int64(35)) publicSignalsVerif := []*big.Int{b35Verif} before := time.Now() - assert.True(t, groth16.VerifyProof(*circuit, setup, proof, publicSignalsVerif, true)) + assert.True(t, groth16.VerifyProof(setup, proof, publicSignalsVerif, true)) fmt.Println("verify proof time elapsed:", time.Since(before)) // check that with another public input the verification returns false bOtherWrongPublic := big.NewInt(int64(34)) wrongPublicSignalsVerif := []*big.Int{bOtherWrongPublic} - assert.True(t, !groth16.VerifyProof(*circuit, setup, proof, wrongPublicSignalsVerif, false)) + assert.True(t, !groth16.VerifyProof(setup, proof, wrongPublicSignalsVerif, false)) } func TestZkFromFlatCircuitCode(t *testing.T) { @@ -233,13 +233,13 @@ func TestZkFromFlatCircuitCode(t *testing.T) { b35Verif := big.NewInt(int64(35)) publicSignalsVerif := []*big.Int{b35Verif} before := time.Now() - assert.True(t, VerifyProof(*circuit, setup, proof, publicSignalsVerif, true)) + assert.True(t, VerifyProof(setup, proof, publicSignalsVerif, true)) fmt.Println("verify proof time elapsed:", time.Since(before)) // check that with another public input the verification returns false bOtherWrongPublic := big.NewInt(int64(34)) wrongPublicSignalsVerif := []*big.Int{bOtherWrongPublic} - assert.True(t, !VerifyProof(*circuit, setup, proof, wrongPublicSignalsVerif, false)) + assert.True(t, !VerifyProof(setup, proof, wrongPublicSignalsVerif, false)) } func TestZkMultiplication(t *testing.T) { @@ -341,13 +341,13 @@ func TestZkMultiplication(t *testing.T) { b12Verif := big.NewInt(int64(12)) publicSignalsVerif := []*big.Int{b12Verif} before := time.Now() - assert.True(t, VerifyProof(*circuit, setup, proof, publicSignalsVerif, true)) + assert.True(t, VerifyProof(setup, proof, publicSignalsVerif, true)) fmt.Println("verify proof time elapsed:", time.Since(before)) // check that with another public input the verification returns false bOtherWrongPublic := big.NewInt(int64(11)) wrongPublicSignalsVerif := []*big.Int{bOtherWrongPublic} - assert.True(t, !VerifyProof(*circuit, setup, proof, wrongPublicSignalsVerif, false)) + assert.True(t, !VerifyProof(setup, proof, wrongPublicSignalsVerif, false)) } func TestMinimalFlow(t *testing.T) { @@ -430,11 +430,11 @@ func TestMinimalFlow(t *testing.T) { b35Verif := big.NewInt(int64(35)) publicSignalsVerif := []*big.Int{b35Verif} before := time.Now() - assert.True(t, VerifyProof(*circuit, setup, proof, publicSignalsVerif, true)) + assert.True(t, VerifyProof(setup, proof, publicSignalsVerif, true)) fmt.Println("verify proof time elapsed:", time.Since(before)) // check that with another public input the verification returns false bOtherWrongPublic := big.NewInt(int64(34)) wrongPublicSignalsVerif := []*big.Int{bOtherWrongPublic} - assert.True(t, !VerifyProof(*circuit, setup, proof, wrongPublicSignalsVerif, false)) + assert.True(t, !VerifyProof(setup, proof, wrongPublicSignalsVerif, false)) } diff --git a/wasm/go-snark-wasm-wrapper.go b/wasm/go-snark-wasm-wrapper.go index b924abc..92b2f45 100644 --- a/wasm/go-snark-wasm-wrapper.go +++ b/wasm/go-snark-wasm-wrapper.go @@ -94,20 +94,9 @@ func generateProofs(this js.Value, i []js.Value) interface{} { } func verifyProofs(this js.Value, i []js.Value) interface{} { - var circuitStr utils.CircuitString - err := json.Unmarshal([]byte(i[0].String()), &circuitStr) - if err != nil { - println(i[0].String()) - println("error parsing circuit from stringified json") - } - circuit, err := utils.CircuitFromString(circuitStr) - if err != nil { - println("error " + err.Error()) - } - var setupStr utils.SetupString - println(i[1].String()) - err = json.Unmarshal([]byte(i[1].String()), &setupStr) + println(i[0].String()) + err := json.Unmarshal([]byte(i[0].String()), &setupStr) if err != nil { println("error parsing setup from stringified json") } @@ -117,9 +106,9 @@ func verifyProofs(this js.Value, i []js.Value) interface{} { } var proofStr utils.ProofString - err = json.Unmarshal([]byte(i[2].String()), &proofStr) + err = json.Unmarshal([]byte(i[1].String()), &proofStr) if err != nil { - println(i[0].String()) + println(i[1].String()) println("error parsing proof from stringified json") } proof, err := utils.ProofFromString(proofStr) @@ -128,13 +117,13 @@ func verifyProofs(this js.Value, i []js.Value) interface{} { } var publicInputs []*big.Int - err = json.Unmarshal([]byte(i[3].String()), &publicInputs) + err = json.Unmarshal([]byte(i[2].String()), &publicInputs) if err != nil { - println(i[0].String()) + println(i[2].String()) println("error parsing publicInputs from stringified json") } - verified := snark.VerifyProof(circuit, setup, proof, publicInputs, false) + verified := snark.VerifyProof(setup, proof, publicInputs, false) if err != nil { println("error verifiyng proof", err) } @@ -215,20 +204,9 @@ func grothGenerateProofs(this js.Value, i []js.Value) interface{} { } func grothVerifyProofs(this js.Value, i []js.Value) interface{} { - var circuitStr utils.CircuitString - err := json.Unmarshal([]byte(i[0].String()), &circuitStr) - if err != nil { - println(i[0].String()) - println("error parsing circuit from stringified json") - } - circuit, err := utils.CircuitFromString(circuitStr) - if err != nil { - println("error " + err.Error()) - } - var setupStr utils.GrothSetupString - println(i[1].String()) - err = json.Unmarshal([]byte(i[1].String()), &setupStr) + println(i[0].String()) + err := json.Unmarshal([]byte(i[0].String()), &setupStr) if err != nil { println("error parsing setup from stringified json") } @@ -238,9 +216,9 @@ func grothVerifyProofs(this js.Value, i []js.Value) interface{} { } var proofStr utils.GrothProofString - err = json.Unmarshal([]byte(i[2].String()), &proofStr) + err = json.Unmarshal([]byte(i[1].String()), &proofStr) if err != nil { - println(i[0].String()) + println(i[1].String()) println("error parsing proof from stringified json") } proof, err := utils.GrothProofFromString(proofStr) @@ -249,13 +227,13 @@ func grothVerifyProofs(this js.Value, i []js.Value) interface{} { } var publicInputs []*big.Int - err = json.Unmarshal([]byte(i[3].String()), &publicInputs) + err = json.Unmarshal([]byte(i[2].String()), &publicInputs) if err != nil { - println(i[0].String()) + println(i[2].String()) println("error parsing publicInputs from stringified json") } - verified := groth16.VerifyProof(circuit, setup, proof, publicInputs, false) + verified := groth16.VerifyProof(setup, proof, publicInputs, false) if err != nil { println("error verifiyng proof", err) } diff --git a/wasm/go-snark.wasm b/wasm/go-snark.wasm index 83d60bdcf933da8553e8694080603822a93f13cc..f2e4a19f76ec6a6a61f05f878ac567121a5d90c8 100755 GIT binary patch delta 35989 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 N>Q8s3`p3NA{5NYmM;QPB delta 37638 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 diff --git a/wasm/index.js b/wasm/index.js index f7ad94b..fbe2e90 100644 --- a/wasm/index.js +++ b/wasm/index.js @@ -21,7 +21,6 @@ function callGenerateProof() { function callVerifyProof() { const proof = document.getElementById("proofResult").value; let r = verifyProofs( - JSON.stringify(circuit), JSON.stringify(setup), proof, JSON.stringify([35])