X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=blobdiff_plain;f=p2p%2Fnode_info.go;h=d0c52a9de7dba7636fb23ac4ed45ab3bb9318127;hp=81dcac464f70da5ff3546cab3ed5908e1955a6b0;hb=31f8f7cf1ffbec5365ab6ebf217537809cf714e5;hpb=db158dcf09436b003defd333f1a665e7e051d820 diff --git a/p2p/node_info.go b/p2p/node_info.go index 81dcac46..d0c52a9d 100644 --- a/p2p/node_info.go +++ b/p2p/node_info.go @@ -3,84 +3,95 @@ package p2p import ( "fmt" "net" - "strconv" - - "github.com/tendermint/go-crypto" cfg "github.com/vapor/config" "github.com/vapor/consensus" + "github.com/vapor/errors" + "github.com/vapor/p2p/signlib" "github.com/vapor/version" ) const maxNodeInfoSize = 10240 // 10Kb +var ( + errDiffMajorVersion = errors.New("Peer is on a different major version.") + errDiffNetwork = errors.New("Peer is on a different network name.") + errDiffNetworkID = errors.New("Peer has different network ID.") +) + //NodeInfo peer node info type NodeInfo struct { - PubKey crypto.PubKeyEd25519 `json:"pub_key"` - Moniker string `json:"moniker"` - Network string `json:"network"` - RemoteAddr string `json:"remote_addr"` - ListenAddr string `json:"listen_addr"` - Version string `json:"version"` // major.minor.revision + PubKey string `json:"pub_key"` + Moniker string `json:"moniker"` + Network string `json:"network"` + //NetworkID used to isolate subnets with same network name + NetworkID uint64 `json:"network_id"` + RemoteAddr string `json:"remote_addr"` + ListenAddr string `json:"listen_addr"` + Version string `json:"version"` // major.minor.revision + ServiceFlag consensus.ServiceFlag `json:"service_flag"` // other application specific data - //field 0: node service flags. field 1: node alias. Other []string `json:"other"` } -func NewNodeInfo(config *cfg.Config, pubkey crypto.PubKeyEd25519, listenAddr string) *NodeInfo { - other := []string{strconv.FormatUint(uint64(consensus.DefaultServices), 10)} - if config.NodeAlias != "" { - other = append(other, config.NodeAlias) - } +func NewNodeInfo(config *cfg.Config, pubkey signlib.PubKey, listenAddr string, netID uint64) *NodeInfo { return &NodeInfo{ - PubKey: pubkey, - Moniker: config.Moniker, - Network: config.ChainID, - ListenAddr: listenAddr, - Version: version.Version, - Other: other, + PubKey: pubkey.String(), + Moniker: config.Moniker, + Network: config.ChainID, + NetworkID: netID, + ListenAddr: listenAddr, + Version: version.Version, + ServiceFlag: consensus.DefaultServices, } } +type VersionCompatibleWith func(remoteVerStr string) (bool, error) + // CompatibleWith checks if two NodeInfo are compatible with eachother. // CONTRACT: two nodes are compatible if the major version matches and network match -func (info *NodeInfo) CompatibleWith(other *NodeInfo) error { - compatible, err := version.CompatibleWith(other.Version) +func (info *NodeInfo) compatibleWith(other *NodeInfo, versionCompatibleWith VersionCompatibleWith) error { + if info.Network != other.Network { + return errors.Wrapf(errDiffNetwork, "Peer network: %v, node network: %v", other.Network, info.Network) + } + + if info.NetworkID != other.NetworkID { + return errors.Wrapf(errDiffNetworkID, "Peer network id: %v, node network id: %v", other.NetworkID, info.NetworkID) + } + + compatible, err := versionCompatibleWith(other.Version) if err != nil { return err } + if !compatible { - return fmt.Errorf("Peer is on a different major version. Peer version: %v, node version: %v", other.Version, info.Version) + return errors.Wrapf(errDiffMajorVersion, "Peer version: %v, node version: %v", other.Version, info.Version) } - if info.Network != other.Network { - return fmt.Errorf("Peer is on a different network. Peer network: %v, node network: %v", other.Network, info.Network) - } return nil } -func (info *NodeInfo) getPubkey() crypto.PubKeyEd25519 { - return info.PubKey +func (info NodeInfo) DoFilter(ip string, pubKey string) error { + if info.PubKey == pubKey { + return ErrConnectSelf + } + + return nil } -//ListenHost peer listener ip address -func (info *NodeInfo) listenHost() string { +//listenHost peer listener ip address +func (info NodeInfo) listenHost() string { host, _, _ := net.SplitHostPort(info.ListenAddr) return host } -//RemoteAddrHost peer external ip address -func (info *NodeInfo) remoteAddrHost() string { +//remoteAddrHost peer external ip address +func (info NodeInfo) RemoteAddrHost() string { host, _, _ := net.SplitHostPort(info.RemoteAddr) return host } -//GetNetwork get node info network field -func (info *NodeInfo) GetNetwork() string { - return info.Network -} - //String representation func (info NodeInfo) String() string { - 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) + return fmt.Sprintf("NodeInfo{pk: %v, moniker: %v, network: %v [listen %v],networkID: %x, service: %v,version: %v (%v)}", info.PubKey, info.Moniker, info.Network, info.ListenAddr, info.NetworkID, info.ServiceFlag, info.Version, info.Other) }