From 0d4e2581bd0f901918cf95fdd1dbcff6d626e5bd Mon Sep 17 00:00:00 2001 From: Eduard S Date: Fri, 15 May 2020 11:43:47 +0200 Subject: [PATCH] Add JSON Marshal/Unmarshal to Proof --- parsers/parsers_test.go | 15 +++++++++++++ types/types.go | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/parsers/parsers_test.go b/parsers/parsers_test.go index 82b6dea..68e7522 100644 --- a/parsers/parsers_test.go +++ b/parsers/parsers_test.go @@ -1,10 +1,12 @@ package parsers import ( + "encoding/json" "io/ioutil" "os" "testing" + "github.com/iden3/go-circom-prover-verifier/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -194,5 +196,18 @@ func TestProofSmartContractFormat(t *testing.T) { pSC2 := ProofStringToSmartContractFormat(pS) assert.Equal(t, pSC, pSC2) +} + +func TestProofJSON(t *testing.T) { + proofJson, err := ioutil.ReadFile("../testdata/circuit1k/proof.json") + require.Nil(t, err) + proof, err := ParseProof(proofJson) + require.Nil(t, err) + proof1JSON, err := json.Marshal(proof) + require.Nil(t, err) + var proof1 types.Proof + err = json.Unmarshal(proof1JSON, &proof1) + require.Nil(t, err) + require.Equal(t, *proof, proof1) } diff --git a/types/types.go b/types/types.go index 8277579..0f688c9 100644 --- a/types/types.go +++ b/types/types.go @@ -1,6 +1,8 @@ package types import ( + "encoding/hex" + "encoding/json" "math/big" bn256 "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare" @@ -16,6 +18,52 @@ type Proof struct { C *bn256.G1 } +type proofAux struct { + A string `json:"pi_a"` + B string `json:"pi_b"` + C string `json:"pi_c"` +} + +func (p Proof) MarshalJSON() ([]byte, error) { + var pa proofAux + pa.A = hex.EncodeToString(p.A.Marshal()) + pa.B = hex.EncodeToString(p.B.Marshal()) + pa.C = hex.EncodeToString(p.C.Marshal()) + return json.Marshal(pa) +} + +func (p *Proof) UnmarshalJSON(data []byte) error { + var pa proofAux + if err := json.Unmarshal(data, &pa); err != nil { + return err + } + aBytes, err := hex.DecodeString(pa.A) + if err != nil { + return err + } + p.A = new(bn256.G1) + if _, err := p.A.Unmarshal(aBytes); err != nil { + return err + } + bBytes, err := hex.DecodeString(pa.B) + if err != nil { + return err + } + p.B = new(bn256.G2) + if _, err := p.B.Unmarshal(bBytes); err != nil { + return err + } + cBytes, err := hex.DecodeString(pa.C) + if err != nil { + return err + } + p.C = new(bn256.G1) + if _, err := p.C.Unmarshal(cBytes); err != nil { + return err + } + return nil +} + // Pk holds the data structure of the ProvingKey type Pk struct { A []*bn256.G1