package transaction import ( "encoding/binary" "errors" "io" "github.com/CityOfZion/neo-go/pkg/util" ) // Attribute represents a Transaction attribute. type Attribute struct { Usage AttrUsage Data []byte } // DecodeBinary implements the Payloader interface. func (attr *Attribute) DecodeBinary(r io.Reader) error { if err := binary.Read(r, binary.LittleEndian, &attr.Usage); err != nil { return err } if attr.Usage == ContractHash || attr.Usage == Vote || (attr.Usage >= Hash1 && attr.Usage <= Hash15) { attr.Data = make([]byte, 32) return binary.Read(r, binary.LittleEndian, attr.Data) } if attr.Usage == ECDH02 || attr.Usage == ECDH03 { attr.Data = make([]byte, 33) attr.Data[0] = byte(attr.Usage) return binary.Read(r, binary.LittleEndian, attr.Data[1:]) } if attr.Usage == Script { attr.Data = make([]byte, 20) return binary.Read(r, binary.LittleEndian, attr.Data) } if attr.Usage == DescriptionUrl { attr.Data = make([]byte, 1) return binary.Read(r, binary.LittleEndian, attr.Data) } if attr.Usage == Description || attr.Usage >= Remark { lenData := util.ReadVarUint(r) attr.Data = make([]byte, lenData) return binary.Read(r, binary.LittleEndian, attr.Data) } return errors.New("format error in decoding transaction attribute") } // EncodeBinary implements the Payload interface. func (attr *Attribute) EncodeBinary(w io.Writer) error { if err := binary.Write(w, binary.LittleEndian, &attr.Usage); err != nil { return err } if attr.Usage == ContractHash || attr.Usage == Vote || (attr.Usage >= Hash1 && attr.Usage <= Hash15) { return binary.Write(w, binary.LittleEndian, attr.Data) } if attr.Usage == ECDH02 || attr.Usage == ECDH03 { attr.Data[0] = byte(attr.Usage) return binary.Write(w, binary.LittleEndian, attr.Data[1:33]) } if attr.Usage == Script { return binary.Write(w, binary.LittleEndian, attr.Data) } if attr.Usage == DescriptionUrl { if err := util.WriteVarUint(w, uint64(len(attr.Data))); err != nil { return err } return binary.Write(w, binary.LittleEndian, attr.Data) } if attr.Usage == Description || attr.Usage >= Remark { if err := util.WriteVarUint(w, uint64(len(attr.Data))); err != nil { return err } return binary.Write(w, binary.LittleEndian, attr.Data) } return errors.New("format error in encoding transaction attribute") }