Merge pull request #15 from iden3/feature/proofjson Add JSON Marshal/Unmarshal to Proof
arnau 17317030+arnaucube@users.noreply.github.com
Fri, 15 May 2020 12:00:33 +0200
2 files changed,
63 insertions(+),
0 deletions(-)
M
parsers/parsers_test.go
→
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 @@ assert.Equal(t, pS.Protocol, pSC.Protocol)
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) }
M
types/types.go
→
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"@@ -14,6 +16,52 @@ type Proof struct {
A *bn256.G1 B *bn256.G2 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