diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..94fa037 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +testdata/*/*.json +testdata/*/*.wasm +testdata/*/*.cpp +testdata/*/*.sym +testdata/*/*.r1cs +!testdata/*/input.json + diff --git a/README.md b/README.md index fc501f3..247e5e2 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,12 @@ w, _ := circomprover.ParseWitness(witnessJson) // generate the proof proof, pubSignals, err := circomprover.GenerateProof(pk, w) assert.Nil(t, err) -fmt.Println(pubSignals) -fmt.Println(proof) + +proofStr, err := circomprover.ProofToString(proof) +assert.Nil(t, err) +publicStr, err := json.Marshal(circomprover.ArrayBigIntToString(pubSignals) +assert.Nil(t, err) + +fmt.Println(proofStr) +fmt.Println(publicStr) ``` diff --git a/compile-circuits.sh b/compile-circuits.sh new file mode 100755 index 0000000..dbc903a --- /dev/null +++ b/compile-circuits.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +echo "testdata/small/circuit.circom" +cd testdata/small +echo "compiling circuit" +circom circuit.circom -r1cs --wasm --sym +echo "generating setup" +snarkjs setup +echo "calculating witness" +snarkjs calculatewitness --wasm circuit.wasm --input input.json --witness witness.json + +echo "\ntestdata/big/circuit.circom" +cd ../big +echo "compiling circuit" +circom circuit.circom -r1cs --wasm --sym +echo "generating setup" +snarkjs setup +echo "calculating witness" +snarkjs calculatewitness --wasm circuit.wasm --input input.json --witness witness.json diff --git a/parsers.go b/parsers.go index f82a4bc..bf7b312 100644 --- a/parsers.go +++ b/parsers.go @@ -166,6 +166,15 @@ func polsStringToBigInt(s []map[string]string) ([]map[int]*big.Int, error) { return o, nil } +// ArrayBigIntToString converts an []*big.Int into []string, used to output the Public Signals +func ArrayBigIntToString(bi []*big.Int) []string { + var s []string + for i := 0; i < len(bi); i++ { + s = append(s, bi[i].String()) + } + return s +} + func arrayStringToBigInt(s []string) ([]*big.Int, error) { var o []*big.Int for i := 0; i < len(s); i++ { @@ -350,7 +359,8 @@ func stringToG2(h [][]string) (*bn256.G2, error) { return p, err } -func proofToString(p *Proof) ([]byte, error) { +// ProofToJson outputs the Proof i Json format +func ProofToJson(p *Proof) ([]byte, error) { var ps ProofString a := p.A.Marshal() diff --git a/prover_test.go b/prover_test.go index b10aa95..2bd4c64 100644 --- a/prover_test.go +++ b/prover_test.go @@ -1,6 +1,7 @@ package gocircomprover import ( + "encoding/json" "fmt" "io/ioutil" "math/big" @@ -10,8 +11,8 @@ import ( "github.com/stretchr/testify/require" ) -func TestGenerateProf(t *testing.T) { - provingKeyJson, err := ioutil.ReadFile("testdata/provingkey.json") +func TestSmallCircuitGenerateProf(t *testing.T) { + provingKeyJson, err := ioutil.ReadFile("testdata/small/proving_key.json") require.Nil(t, err) pk, err := ParseProvingKey(provingKeyJson) require.Nil(t, err) @@ -20,16 +21,60 @@ func TestGenerateProf(t *testing.T) { fmt.Println("polsB", pk.PolsB) fmt.Println("polsC", pk.PolsC) - witnessJson, err := ioutil.ReadFile("testdata/witness.json") + witnessJson, err := ioutil.ReadFile("testdata/small/witness.json") require.Nil(t, err) w, err := ParseWitness(witnessJson) require.Nil(t, err) - fmt.Println("w", w) assert.Equal(t, Witness{big.NewInt(1), big.NewInt(33), big.NewInt(3), big.NewInt(11)}, w) proof, pubSignals, err := GenerateProof(pk, w) assert.Nil(t, err) fmt.Println("proof", proof) fmt.Println("pubSignals", pubSignals) + + proofStr, err := ProofToJson(proof) + assert.Nil(t, err) + fmt.Println("prover\n", string(proofStr)) + + err = ioutil.WriteFile("testdata/small/proof.json", proofStr, 0644) + assert.Nil(t, err) + publicStr, err := json.Marshal(ArrayBigIntToString(pubSignals)) + assert.Nil(t, err) + err = ioutil.WriteFile("testdata/small/public.json", publicStr, 0644) + assert.Nil(t, err) + + // to verify the proof: + // snarkjs verify --vk testdata/small/verification_key.json -p testdata/small/proof.json --pub testdata/small/public.json +} + +func TestBigCircuitGenerateProf(t *testing.T) { + provingKeyJson, err := ioutil.ReadFile("testdata/big/proving_key.json") + require.Nil(t, err) + pk, err := ParseProvingKey(provingKeyJson) + require.Nil(t, err) + + witnessJson, err := ioutil.ReadFile("testdata/big/witness.json") + require.Nil(t, err) + w, err := ParseWitness(witnessJson) + require.Nil(t, err) + + proof, pubSignals, err := GenerateProof(pk, w) + assert.Nil(t, err) + fmt.Println("proof", proof) + fmt.Println("pubSignals", pubSignals) + + proofStr, err := ProofToJson(proof) + assert.Nil(t, err) + fmt.Println("prover\n", string(proofStr)) + + err = ioutil.WriteFile("testdata/big/proof.json", proofStr, 0644) + assert.Nil(t, err) + publicStr, err := json.Marshal(ArrayBigIntToString(pubSignals)) + assert.Nil(t, err) + err = ioutil.WriteFile("testdata/big/public.json", publicStr, 0644) + assert.Nil(t, err) + + // to verify the proof: + // snarkjs verify --vk testdata/big/verification_key.json -p testdata/big/proof.json --pub testdata/big/public.json } diff --git a/testdata/big/circuit.circom b/testdata/big/circuit.circom new file mode 100644 index 0000000..365dacf --- /dev/null +++ b/testdata/big/circuit.circom @@ -0,0 +1,14 @@ +template A(n) { + signal input in; + signal output out; + + signal intermediate[n]; + + intermediate[0] <== in; + for (var i=1; i