diff --git a/pkg/core/transaction/attribute.go b/pkg/core/transaction/attribute.go index ca4a0ed28..4c4c1d8c3 100644 --- a/pkg/core/transaction/attribute.go +++ b/pkg/core/transaction/attribute.go @@ -3,6 +3,7 @@ package transaction import ( "encoding/hex" "encoding/json" + "errors" "fmt" "github.com/nspcc-dev/neo-go/pkg/io" @@ -10,8 +11,14 @@ import ( // Attribute represents a Transaction attribute. type Attribute struct { - Usage AttrUsage `json:"usage"` - Data []byte `json:"data"` + Usage AttrUsage + Data []byte +} + +// attrJSON is used for JSON I/O of Attribute. +type attrJSON struct { + Usage string `json:"usage"` + Data string `json:"data"` } // DecodeBinary implements Serializable interface. @@ -72,8 +79,106 @@ func (attr *Attribute) EncodeBinary(bw *io.BinWriter) { // MarshalJSON implements the json Marshaller interface. func (attr *Attribute) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]string{ - "usage": attr.Usage.String(), - "data": hex.EncodeToString(attr.Data), + return json.Marshal(attrJSON{ + Usage: attr.Usage.String(), + Data: hex.EncodeToString(attr.Data), }) } + +// UnmarshalJSON implements the json.Unmarshaller interface. +func (attr *Attribute) UnmarshalJSON(data []byte) error { + aj := new(attrJSON) + err := json.Unmarshal(data, aj) + if err != nil { + return err + } + binData, err := hex.DecodeString(aj.Data) + if err != nil { + return err + } + switch aj.Usage { + case "ContractHash": + attr.Usage = ContractHash + case "ECDH02": + attr.Usage = ECDH02 + case "ECDH03": + attr.Usage = ECDH03 + case "Script": + attr.Usage = Script + case "Vote": + attr.Usage = Vote + case "CertURL": + attr.Usage = CertURL + case "DescriptionURL": + attr.Usage = DescriptionURL + case "Description": + attr.Usage = Description + case "Hash1": + attr.Usage = Hash1 + case "Hash2": + attr.Usage = Hash2 + case "Hash3": + attr.Usage = Hash3 + case "Hash4": + attr.Usage = Hash4 + case "Hash5": + attr.Usage = Hash5 + case "Hash6": + attr.Usage = Hash6 + case "Hash7": + attr.Usage = Hash7 + case "Hash8": + attr.Usage = Hash8 + case "Hash9": + attr.Usage = Hash9 + case "Hash10": + attr.Usage = Hash10 + case "Hash11": + attr.Usage = Hash11 + case "Hash12": + attr.Usage = Hash12 + case "Hash13": + attr.Usage = Hash13 + case "Hash14": + attr.Usage = Hash14 + case "Hash15": + attr.Usage = Hash15 + case "Remark": + attr.Usage = Remark + case "Remark1": + attr.Usage = Remark1 + case "Remark2": + attr.Usage = Remark2 + case "Remark3": + attr.Usage = Remark3 + case "Remark4": + attr.Usage = Remark4 + case "Remark5": + attr.Usage = Remark5 + case "Remark6": + attr.Usage = Remark6 + case "Remark7": + attr.Usage = Remark7 + case "Remark8": + attr.Usage = Remark8 + case "Remark9": + attr.Usage = Remark9 + case "Remark10": + attr.Usage = Remark10 + case "Remark11": + attr.Usage = Remark11 + case "Remark12": + attr.Usage = Remark12 + case "Remark13": + attr.Usage = Remark13 + case "Remark14": + attr.Usage = Remark14 + case "Remark15": + attr.Usage = Remark15 + default: + return errors.New("wrong Usage") + + } + attr.Data = binData + return nil +}