2014-01-09 06:44:08 +01:00
|
|
|
// Copyright (c) 2013-2014 Conformal Systems LLC.
|
2013-05-08 21:31:00 +02:00
|
|
|
// Use of this source code is governed by an ISC
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package btcwire
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
)
|
|
|
|
|
2013-05-09 20:26:23 +02:00
|
|
|
// MsgPing implements the Message interface and represents a bitcoin ping
|
2013-05-08 21:31:00 +02:00
|
|
|
// message.
|
|
|
|
//
|
|
|
|
// For versions BIP0031Version and earlier, it is used primarily to confirm
|
|
|
|
// that a connection is still valid. A transmission error is typically
|
|
|
|
// interpreted as a closed connection and that the peer should be removed.
|
|
|
|
// For versions AFTER BIP0031Version it contains an identifier which can be
|
|
|
|
// returned in the pong message to determine network timing.
|
|
|
|
//
|
|
|
|
// The payload for this message just consists of a nonce used for identifying
|
|
|
|
// it later.
|
|
|
|
type MsgPing struct {
|
|
|
|
// Unique value associated with message that is used to identify
|
|
|
|
// specific ping message.
|
|
|
|
Nonce uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.
|
|
|
|
// This is part of the Message interface implementation.
|
|
|
|
func (msg *MsgPing) BtcDecode(r io.Reader, pver uint32) error {
|
|
|
|
// There was no nonce for BIP0031Version and earlier.
|
|
|
|
// NOTE: > is not a mistake here. The BIP0031 was defined as AFTER
|
|
|
|
// the version unlike most others.
|
|
|
|
if pver > BIP0031Version {
|
|
|
|
err := readElement(r, &msg.Nonce)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.
|
|
|
|
// This is part of the Message interface implementation.
|
|
|
|
func (msg *MsgPing) BtcEncode(w io.Writer, pver uint32) error {
|
|
|
|
// There was no nonce for BIP0031Version and earlier.
|
|
|
|
// NOTE: > is not a mistake here. The BIP0031 was defined as AFTER
|
|
|
|
// the version unlike most others.
|
|
|
|
if pver > BIP0031Version {
|
|
|
|
err := writeElement(w, msg.Nonce)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Command returns the protocol command string for the message. This is part
|
|
|
|
// of the Message interface implementation.
|
|
|
|
func (msg *MsgPing) Command() string {
|
2014-07-14 17:38:29 +02:00
|
|
|
return CmdPing
|
2013-05-08 21:31:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// MaxPayloadLength returns the maximum length the payload can be for the
|
|
|
|
// receiver. This is part of the Message interface implementation.
|
|
|
|
func (msg *MsgPing) MaxPayloadLength(pver uint32) uint32 {
|
|
|
|
plen := uint32(0)
|
|
|
|
// There was no nonce for BIP0031Version and earlier.
|
|
|
|
// NOTE: > is not a mistake here. The BIP0031 was defined as AFTER
|
|
|
|
// the version unlike most others.
|
|
|
|
if pver > BIP0031Version {
|
|
|
|
// Nonce 8 bytes.
|
|
|
|
plen += 8
|
|
|
|
}
|
|
|
|
|
|
|
|
return plen
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewMsgPing returns a new bitcoin ping message that conforms to the Message
|
|
|
|
// interface. See MsgPing for details.
|
|
|
|
func NewMsgPing(nonce uint64) *MsgPing {
|
|
|
|
return &MsgPing{
|
|
|
|
Nonce: nonce,
|
|
|
|
}
|
|
|
|
}
|