OSDN Git Service

Hulk did something
[bytom/vapor.git] / p2p / node_info.go
1 package p2p
2
3 import (
4         "fmt"
5         "net"
6         "strconv"
7
8         "github.com/tendermint/go-crypto"
9
10         cfg "github.com/vapor/config"
11         "github.com/vapor/consensus"
12         "github.com/vapor/version"
13 )
14
15 const maxNodeInfoSize = 10240 // 10Kb
16
17 //NodeInfo peer node info
18 type NodeInfo struct {
19         PubKey     crypto.PubKeyEd25519 `json:"pub_key"`
20         Moniker    string               `json:"moniker"`
21         Network    string               `json:"network"`
22         RemoteAddr string               `json:"remote_addr"`
23         ListenAddr string               `json:"listen_addr"`
24         Version    string               `json:"version"` // major.minor.revision
25         // other application specific data
26         //field 0: node service flags. field 1: node alias.
27         Other []string `json:"other"`
28 }
29
30 func NewNodeInfo(config *cfg.Config, pubkey crypto.PubKeyEd25519, listenAddr string) *NodeInfo {
31         other := []string{strconv.FormatUint(uint64(consensus.DefaultServices), 10)}
32         if config.NodeAlias != "" {
33                 other = append(other, config.NodeAlias)
34         }
35         return &NodeInfo{
36                 PubKey:     pubkey,
37                 Moniker:    config.Moniker,
38                 Network:    config.ChainID,
39                 ListenAddr: listenAddr,
40                 Version:    version.Version,
41                 Other:      other,
42         }
43 }
44
45 // CompatibleWith checks if two NodeInfo are compatible with eachother.
46 // CONTRACT: two nodes are compatible if the major version matches and network match
47 func (info *NodeInfo) CompatibleWith(other *NodeInfo) error {
48         compatible, err := version.CompatibleWith(other.Version)
49         if err != nil {
50                 return err
51         }
52         if !compatible {
53                 return fmt.Errorf("Peer is on a different major version. Peer version: %v, node version: %v", other.Version, info.Version)
54         }
55
56         if info.Network != other.Network {
57                 return fmt.Errorf("Peer is on a different network. Peer network: %v, node network: %v", other.Network, info.Network)
58         }
59         return nil
60 }
61
62 func (info *NodeInfo) getPubkey() crypto.PubKeyEd25519 {
63         return info.PubKey
64 }
65
66 //ListenHost peer listener ip address
67 func (info *NodeInfo) listenHost() string {
68         host, _, _ := net.SplitHostPort(info.ListenAddr)
69         return host
70 }
71
72 //RemoteAddrHost peer external ip address
73 func (info *NodeInfo) remoteAddrHost() string {
74         host, _, _ := net.SplitHostPort(info.RemoteAddr)
75         return host
76 }
77
78 //GetNetwork get node info network field
79 func (info *NodeInfo) GetNetwork() string {
80         return info.Network
81 }
82
83 //String representation
84 func (info NodeInfo) String() string {
85         return fmt.Sprintf("NodeInfo{pk: %v, moniker: %v, network: %v [listen %v], version: %v (%v)}", info.PubKey, info.Moniker, info.Network, info.ListenAddr, info.Version, info.Other)
86 }