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  }