github.com/MetalBlockchain/metalgo@v1.11.9/vms/platformvm/warp/message.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package warp 5 6 import "fmt" 7 8 // Message defines the standard format for a Warp message. 9 type Message struct { 10 UnsignedMessage `serialize:"true"` 11 Signature Signature `serialize:"true"` 12 13 bytes []byte 14 } 15 16 // NewMessage creates a new *Message and initializes it. 17 func NewMessage( 18 unsignedMsg *UnsignedMessage, 19 signature Signature, 20 ) (*Message, error) { 21 msg := &Message{ 22 UnsignedMessage: *unsignedMsg, 23 Signature: signature, 24 } 25 return msg, msg.Initialize() 26 } 27 28 // ParseMessage converts a slice of bytes into an initialized *Message. 29 func ParseMessage(b []byte) (*Message, error) { 30 msg := &Message{ 31 bytes: b, 32 } 33 _, err := Codec.Unmarshal(b, msg) 34 if err != nil { 35 return nil, err 36 } 37 return msg, msg.UnsignedMessage.Initialize() 38 } 39 40 // Initialize recalculates the result of Bytes(). It does not call Initialize() 41 // on the UnsignedMessage. 42 func (m *Message) Initialize() error { 43 bytes, err := Codec.Marshal(CodecVersion, m) 44 m.bytes = bytes 45 return err 46 } 47 48 // Bytes returns the binary representation of this message. It assumes that the 49 // message is initialized from either New, Parse, or an explicit call to 50 // Initialize. 51 func (m *Message) Bytes() []byte { 52 return m.bytes 53 } 54 55 func (m *Message) String() string { 56 return fmt.Sprintf("WarpMessage(%s, %s)", &m.UnsignedMessage, m.Signature) 57 }