github.com/btcsuite/btcd@v0.24.0/wire/msgpong.go (about)

     1  // Copyright (c) 2013-2015 The btcsuite developers
     2  // Use of this source code is governed by an ISC
     3  // license that can be found in the LICENSE file.
     4  
     5  package wire
     6  
     7  import (
     8  	"fmt"
     9  	"io"
    10  )
    11  
    12  // MsgPong implements the Message interface and represents a bitcoin pong
    13  // message which is used primarily to confirm that a connection is still valid
    14  // in response to a bitcoin ping message (MsgPing).
    15  //
    16  // This message was not added until protocol versions AFTER BIP0031Version.
    17  type MsgPong struct {
    18  	// Unique value associated with message that is used to identify
    19  	// specific ping message.
    20  	Nonce uint64
    21  }
    22  
    23  // BtcDecode decodes r using the bitcoin protocol encoding into the receiver.
    24  // This is part of the Message interface implementation.
    25  func (msg *MsgPong) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {
    26  	// NOTE: <= is not a mistake here.  The BIP0031 was defined as AFTER
    27  	// the version unlike most others.
    28  	if pver <= BIP0031Version {
    29  		str := fmt.Sprintf("pong message invalid for protocol "+
    30  			"version %d", pver)
    31  		return messageError("MsgPong.BtcDecode", str)
    32  	}
    33  
    34  	nonce, err := binarySerializer.Uint64(r, littleEndian)
    35  	if err != nil {
    36  		return err
    37  	}
    38  	msg.Nonce = nonce
    39  
    40  	return nil
    41  }
    42  
    43  // BtcEncode encodes the receiver to w using the bitcoin protocol encoding.
    44  // This is part of the Message interface implementation.
    45  func (msg *MsgPong) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {
    46  	// NOTE: <= is not a mistake here.  The BIP0031 was defined as AFTER
    47  	// the version unlike most others.
    48  	if pver <= BIP0031Version {
    49  		str := fmt.Sprintf("pong message invalid for protocol "+
    50  			"version %d", pver)
    51  		return messageError("MsgPong.BtcEncode", str)
    52  	}
    53  
    54  	return binarySerializer.PutUint64(w, littleEndian, msg.Nonce)
    55  }
    56  
    57  // Command returns the protocol command string for the message.  This is part
    58  // of the Message interface implementation.
    59  func (msg *MsgPong) Command() string {
    60  	return CmdPong
    61  }
    62  
    63  // MaxPayloadLength returns the maximum length the payload can be for the
    64  // receiver.  This is part of the Message interface implementation.
    65  func (msg *MsgPong) MaxPayloadLength(pver uint32) uint32 {
    66  	plen := uint32(0)
    67  	// The pong message did not exist for BIP0031Version and earlier.
    68  	// NOTE: > is not a mistake here.  The BIP0031 was defined as AFTER
    69  	// the version unlike most others.
    70  	if pver > BIP0031Version {
    71  		// Nonce 8 bytes.
    72  		plen += 8
    73  	}
    74  
    75  	return plen
    76  }
    77  
    78  // NewMsgPong returns a new bitcoin pong message that conforms to the Message
    79  // interface.  See MsgPong for details.
    80  func NewMsgPong(nonce uint64) *MsgPong {
    81  	return &MsgPong{
    82  		Nonce: nonce,
    83  	}
    84  }