From 217cae2021d7e02e52bf43c3c704940940f612a1 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Fri, 13 Mar 2020 09:57:15 -0400 Subject: [PATCH] DRY code --- codec/std/tx.go | 23 +---------------------- types/codec.go | 27 +++++++++++++++++++++++++++ types/tx_msg.go | 5 ++--- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/codec/std/tx.go b/codec/std/tx.go index b37094523..a8aadf089 100644 --- a/codec/std/tx.go +++ b/codec/std/tx.go @@ -1,11 +1,6 @@ package std import ( - "bytes" - - jsonc "github.com/gibson042/canonicaljson-go" - "github.com/gogo/protobuf/jsonpb" - "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -165,21 +160,5 @@ func NewSignDoc(num, seq uint64, cid, memo string, fee auth.StdFee, msgs ...Mess // names adhere to their proto definition, default values are omitted, and follows // the JSON Canonical Form. func (sd *SignDoc) CanonicalSignBytes() ([]byte, error) { - jm := &jsonpb.Marshaler{EmitDefaults: false, OrigName: false} - buf := new(bytes.Buffer) - - // first, encode via canonical Protocol Buffer JSON - if err := jm.Marshal(buf, sd); err != nil { - return nil, err - } - - genericJSON := make(map[string]interface{}) - - // decode canonical proto encoding into a generic map - if err := jsonc.Unmarshal(buf.Bytes(), &genericJSON); err != nil { - return nil, err - } - - // finally, return the canonical JSON encoding via JSON Canonical Form - return jsonc.Marshal(genericJSON) + return sdk.CanonicalSignBytes(sd) } diff --git a/types/codec.go b/types/codec.go index fdd884bd5..6f7d03e5c 100644 --- a/types/codec.go +++ b/types/codec.go @@ -1,6 +1,11 @@ package types import ( + "bytes" + + jsonc "github.com/gibson042/canonicaljson-go" + "github.com/gogo/protobuf/jsonpb" + "github.com/cosmos/cosmos-sdk/codec" ) @@ -9,3 +14,25 @@ func RegisterCodec(cdc *codec.Codec) { cdc.RegisterInterface((*Msg)(nil), nil) cdc.RegisterInterface((*Tx)(nil), nil) } + +// CanonicalSignBytes returns a canonical JSON encoding of a message that can be +// signed over. +func CanonicalSignBytes(m codec.ProtoMarshaler) ([]byte, error) { + jm := &jsonpb.Marshaler{EmitDefaults: false, OrigName: false} + buf := new(bytes.Buffer) + + // first, encode via canonical Protocol Buffer JSON + if err := jm.Marshal(buf, m); err != nil { + return nil, err + } + + genericJSON := make(map[string]interface{}) + + // decode canonical proto encoding into a generic map + if err := jsonc.Unmarshal(buf.Bytes(), &genericJSON); err != nil { + return nil, err + } + + // finally, return the canonical JSON encoding via JSON Canonical Form + return jsonc.Marshal(genericJSON) +} diff --git a/types/tx_msg.go b/types/tx_msg.go index 20ead7db1..b81eb26f5 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -7,7 +7,7 @@ import ( ) type ( -// Msg defines the interface a transaction message must fulfill. + // Msg defines the interface a transaction message must fulfill. Msg interface { // Return the message type. @@ -45,7 +45,7 @@ type ( GetSignature() []byte } -// Tx defines the interface a transaction must fulfill. + // Tx defines the interface a transaction must fulfill. Tx interface { // Gets the all the transaction's messages. GetMsgs() []Msg @@ -56,7 +56,6 @@ type ( } ) - // TxDecoder unmarshals transaction bytes type TxDecoder func(txBytes []byte) (Tx, error)