github.com/palcoin-project/palcd@v1.0.0/wire/protocol.go (about)

     1  // Copyright (c) 2013-2016 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  	"strconv"
    10  	"strings"
    11  )
    12  
    13  // XXX pedro: we will probably need to bump this.
    14  const (
    15  	// ProtocolVersion is the latest protocol version this package supports.
    16  	ProtocolVersion uint32 = 70013
    17  
    18  	// MultipleAddressVersion is the protocol version which added multiple
    19  	// addresses per message (pver >= MultipleAddressVersion).
    20  	MultipleAddressVersion uint32 = 209
    21  
    22  	// NetAddressTimeVersion is the protocol version which added the
    23  	// timestamp field (pver >= NetAddressTimeVersion).
    24  	NetAddressTimeVersion uint32 = 31402
    25  
    26  	// BIP0031Version is the protocol version AFTER which a pong message
    27  	// and nonce field in ping were added (pver > BIP0031Version).
    28  	BIP0031Version uint32 = 60000
    29  
    30  	// BIP0035Version is the protocol version which added the mempool
    31  	// message (pver >= BIP0035Version).
    32  	BIP0035Version uint32 = 60002
    33  
    34  	// BIP0037Version is the protocol version which added new connection
    35  	// bloom filtering related messages and extended the version message
    36  	// with a relay flag (pver >= BIP0037Version).
    37  	BIP0037Version uint32 = 70001
    38  
    39  	// RejectVersion is the protocol version which added a new reject
    40  	// message.
    41  	RejectVersion uint32 = 70002
    42  
    43  	// BIP0111Version is the protocol version which added the SFNodeBloom
    44  	// service flag.
    45  	BIP0111Version uint32 = 70011
    46  
    47  	// SendHeadersVersion is the protocol version which added a new
    48  	// sendheaders message.
    49  	SendHeadersVersion uint32 = 70012
    50  
    51  	// FeeFilterVersion is the protocol version which added a new
    52  	// feefilter message.
    53  	FeeFilterVersion uint32 = 70013
    54  )
    55  
    56  // ServiceFlag identifies services supported by a bitcoin peer.
    57  type ServiceFlag uint64
    58  
    59  const (
    60  	// SFNodeNetwork is a flag used to indicate a peer is a full node.
    61  	SFNodeNetwork ServiceFlag = 1 << iota
    62  
    63  	// SFNodeGetUTXO is a flag used to indicate a peer supports the
    64  	// getutxos and utxos commands (BIP0064).
    65  	SFNodeGetUTXO
    66  
    67  	// SFNodeBloom is a flag used to indicate a peer supports bloom
    68  	// filtering.
    69  	SFNodeBloom
    70  
    71  	// SFNodeWitness is a flag used to indicate a peer supports blocks
    72  	// and transactions including witness data (BIP0144).
    73  	SFNodeWitness
    74  
    75  	// SFNodeXthin is a flag used to indicate a peer supports xthin blocks.
    76  	SFNodeXthin
    77  
    78  	// SFNodeBit5 is a flag used to indicate a peer supports a service
    79  	// defined by bit 5.
    80  	SFNodeBit5
    81  
    82  	// SFNodeCF is a flag used to indicate a peer supports committed
    83  	// filters (CFs).
    84  	SFNodeCF
    85  
    86  	// SFNode2X is a flag used to indicate a peer is running the Segwit2X
    87  	// software.
    88  	SFNode2X
    89  )
    90  
    91  // Map of service flags back to their constant names for pretty printing.
    92  var sfStrings = map[ServiceFlag]string{
    93  	SFNodeNetwork: "SFNodeNetwork",
    94  	SFNodeGetUTXO: "SFNodeGetUTXO",
    95  	SFNodeBloom:   "SFNodeBloom",
    96  	SFNodeWitness: "SFNodeWitness",
    97  	SFNodeXthin:   "SFNodeXthin",
    98  	SFNodeBit5:    "SFNodeBit5",
    99  	SFNodeCF:      "SFNodeCF",
   100  	SFNode2X:      "SFNode2X",
   101  }
   102  
   103  // orderedSFStrings is an ordered list of service flags from highest to
   104  // lowest.
   105  var orderedSFStrings = []ServiceFlag{
   106  	SFNodeNetwork,
   107  	SFNodeGetUTXO,
   108  	SFNodeBloom,
   109  	SFNodeWitness,
   110  	SFNodeXthin,
   111  	SFNodeBit5,
   112  	SFNodeCF,
   113  	SFNode2X,
   114  }
   115  
   116  // String returns the ServiceFlag in human-readable form.
   117  func (f ServiceFlag) String() string {
   118  	// No flags are set.
   119  	if f == 0 {
   120  		return "0x0"
   121  	}
   122  
   123  	// Add individual bit flags.
   124  	s := ""
   125  	for _, flag := range orderedSFStrings {
   126  		if f&flag == flag {
   127  			s += sfStrings[flag] + "|"
   128  			f -= flag
   129  		}
   130  	}
   131  
   132  	// Add any remaining flags which aren't accounted for as hex.
   133  	s = strings.TrimRight(s, "|")
   134  	if f != 0 {
   135  		s += "|0x" + strconv.FormatUint(uint64(f), 16)
   136  	}
   137  	s = strings.TrimLeft(s, "|")
   138  	return s
   139  }
   140  
   141  // BitcoinNet represents which bitcoin network a message belongs to.
   142  type BitcoinNet uint32
   143  
   144  // Constants used to indicate the message bitcoin network.  They can also be
   145  // used to seek to the next message when a stream's state is unknown, but
   146  // this package does not provide that functionality since it's generally a
   147  // better idea to simply disconnect clients that are misbehaving over TCP.
   148  const (
   149  	// MainNet represents the main bitcoin network.
   150  	MainNet BitcoinNet = 0xd9b4bef9
   151  
   152  	// TestNet represents the regression test network.
   153  	TestNet BitcoinNet = 0xdab5bffa
   154  
   155  	// TestNet3 represents the test network (version 3).
   156  	TestNet3 BitcoinNet = 0x0709110b
   157  
   158  	// SimNet represents the simulation test network.
   159  	SimNet BitcoinNet = 0x12141c16
   160  )
   161  
   162  // bnStrings is a map of bitcoin networks back to their constant names for
   163  // pretty printing.
   164  var bnStrings = map[BitcoinNet]string{
   165  	MainNet:  "MainNet",
   166  	TestNet:  "TestNet",
   167  	TestNet3: "TestNet3",
   168  	SimNet:   "SimNet",
   169  }
   170  
   171  // String returns the BitcoinNet in human-readable form.
   172  func (n BitcoinNet) String() string {
   173  	if s, ok := bnStrings[n]; ok {
   174  		return s
   175  	}
   176  
   177  	return fmt.Sprintf("Unknown BitcoinNet (%d)", uint32(n))
   178  }