mirror of
https://github.com/arnaucube/go-circom-prover-verifier.git
synced 2026-02-06 19:06:43 +01:00
Add ProvingKey binary parser
The time on the parsing doesn't improve, as the data from the binary file needs to be converted to `affine` representation, and then parsed into the `bn256.G1` & `bn256.G2` formats (Montgomery). But the size of the ProvingKey files in binary is much smaller, so will be better handled by the smarthpones. - Parse time benchmarks: ``` BenchmarkParsePk/Parse_Pk_bin_circuit1k-4 2 563729994 ns/op BenchmarkParsePk/Parse_Pk_json_circuit1k-4 635641 1941 ns/op BenchmarkParsePk/Parse_Pk_bin_circuit5k-4 1 2637941658 ns/op BenchmarkParsePk/Parse_Pk_json_circuit5k-4 1 2986560185 ns/op BenchmarkParsePk/Parse_Pk_bin_circuit10k-4 1 5337639150 ns/op BenchmarkParsePk/Parse_Pk_json_circuit10k-4 1 6149568824 ns/op BenchmarkParsePk/Parse_Pk_bin_circuit20k-4 1 10533654623 ns/op BenchmarkParsePk/Parse_Pk_json_circuit20k-4 1 11657326851 ns/op ``` - Size of ProvingKey file for a circuit of 50k constraints: ``` circuit 20k constraints: 10097812 bytes of proving_key.bin 29760049 bytes of proving_key.json circuit 50k constraints: 24194964 bytes of proving_key.bin 71484081 bytes of proving_key.json ```
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -16,25 +17,38 @@ import (
|
||||
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
|
||||
// testCircuitGenerateProof(t, "circuit10k") // 10000 constraints
|
||||
// testCircuitGenerateProof(t, "circuit20k") // 20000 constraints
|
||||
}
|
||||
|
||||
func testCircuitGenerateProof(t *testing.T, circuit string) {
|
||||
provingKeyJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
|
||||
// using json provingKey file
|
||||
// provingKeyJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
|
||||
// require.Nil(t, err)
|
||||
// pk, err := parsers.ParsePk(provingKeyJson)
|
||||
// require.Nil(t, err)
|
||||
// witnessJson, err := ioutil.ReadFile("../testdata/" + circuit + "/witness.json")
|
||||
// require.Nil(t, err)
|
||||
// w, err := parsers.ParseWitness(witnessJson)
|
||||
// require.Nil(t, err)
|
||||
|
||||
// using bin provingKey file
|
||||
pkBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.bin")
|
||||
require.Nil(t, err)
|
||||
pk, err := parsers.ParsePk(provingKeyJson)
|
||||
defer pkBinFile.Close()
|
||||
pk, err := parsers.ParsePkBin(pkBinFile)
|
||||
require.Nil(t, err)
|
||||
|
||||
witnessJson, err := ioutil.ReadFile("../testdata/" + circuit + "/witness.json")
|
||||
witnessBinFile, err := os.Open("../testdata/" + circuit + "/witness.bin")
|
||||
require.Nil(t, err)
|
||||
w, err := parsers.ParseWitness(witnessJson)
|
||||
defer witnessBinFile.Close()
|
||||
w, err := parsers.ParseWitnessBin(witnessBinFile)
|
||||
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))
|
||||
fmt.Println("proof generation time for "+circuit+" elapsed:", time.Since(beforeT))
|
||||
|
||||
proofStr, err := parsers.ProofToJson(proof)
|
||||
assert.Nil(t, err)
|
||||
|
||||
Reference in New Issue
Block a user