mirror of
https://github.com/arnaucube/go-circom-prover-verifier.git
synced 2026-02-07 03:16:46 +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:
@@ -196,3 +196,63 @@ func TestProofSmartContractFormat(t *testing.T) {
|
||||
assert.Equal(t, pSC, pSC2)
|
||||
|
||||
}
|
||||
|
||||
func testCircuitParsePkBin(t *testing.T, circuit string) {
|
||||
pkBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.bin")
|
||||
require.Nil(t, err)
|
||||
defer pkBinFile.Close()
|
||||
pk, err := ParsePkBin(pkBinFile)
|
||||
require.Nil(t, err)
|
||||
|
||||
pkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
|
||||
require.Nil(t, err)
|
||||
pkJ, err := ParsePk(pkJson)
|
||||
require.Nil(t, err)
|
||||
|
||||
assert.Equal(t, pkJ.NVars, pk.NVars)
|
||||
assert.Equal(t, pkJ.NPublic, pk.NPublic)
|
||||
assert.Equal(t, pkJ.DomainSize, pk.DomainSize)
|
||||
assert.Equal(t, pkJ.VkAlpha1, pk.VkAlpha1)
|
||||
assert.Equal(t, pkJ.VkBeta1, pk.VkBeta1)
|
||||
assert.Equal(t, pkJ.VkDelta1, pk.VkDelta1)
|
||||
assert.Equal(t, pkJ.VkDelta2, pk.VkDelta2)
|
||||
assert.Equal(t, pkJ.PolsA, pk.PolsA)
|
||||
assert.Equal(t, pkJ.PolsB, pk.PolsB)
|
||||
assert.Equal(t, pkJ.A, pk.A)
|
||||
assert.Equal(t, pkJ.B1, pk.B1)
|
||||
assert.Equal(t, pkJ.B2, pk.B2)
|
||||
assert.Equal(t, pkJ.C, pk.C)
|
||||
assert.Equal(t, pkJ.HExps[:pkJ.DomainSize], pk.HExps[:pk.DomainSize]) // circom behaviour
|
||||
}
|
||||
|
||||
func TestParsePkBin(t *testing.T) {
|
||||
testCircuitParsePkBin(t, "circuit1k")
|
||||
testCircuitParsePkBin(t, "circuit5k")
|
||||
}
|
||||
|
||||
func benchmarkParsePk(b *testing.B, circuit string) {
|
||||
pkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
|
||||
require.Nil(b, err)
|
||||
|
||||
pkBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.bin")
|
||||
require.Nil(b, err)
|
||||
defer pkBinFile.Close()
|
||||
|
||||
b.Run("Parse Pk bin "+circuit, func(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
ParsePk(pkJson)
|
||||
}
|
||||
})
|
||||
b.Run("Parse Pk json "+circuit, func(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
ParsePkBin(pkBinFile)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkParsePk(b *testing.B) {
|
||||
benchmarkParsePk(b, "circuit1k")
|
||||
benchmarkParsePk(b, "circuit5k")
|
||||
// benchmarkParsePk(b, "circuit10k")
|
||||
// benchmarkParsePk(b, "circuit20k")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user