OSDN Git Service

Add subnet having the same network ID isolation function (#57)
[bytom/vapor.git] / p2p / node_info.go
index 81dcac4..2e52e31 100644 (file)
@@ -16,18 +16,20 @@ const maxNodeInfoSize = 10240 // 10Kb
 
 //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  crypto.PubKeyEd25519 `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
        // 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 {
+func NewNodeInfo(config *cfg.Config, pubkey crypto.PubKeyEd25519, listenAddr string, netID uint64) *NodeInfo {
        other := []string{strconv.FormatUint(uint64(consensus.DefaultServices), 10)}
        if config.NodeAlias != "" {
                other = append(other, config.NodeAlias)
@@ -36,6 +38,7 @@ func NewNodeInfo(config *cfg.Config, pubkey crypto.PubKeyEd25519, listenAddr str
                PubKey:     pubkey,
                Moniker:    config.Moniker,
                Network:    config.ChainID,
+               NetworkID:  netID,
                ListenAddr: listenAddr,
                Version:    version.Version,
                Other:      other,
@@ -45,6 +48,14 @@ func NewNodeInfo(config *cfg.Config, pubkey crypto.PubKeyEd25519, listenAddr str
 // 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 {
+       if info.Network != other.Network {
+               return fmt.Errorf("Peer is on a different network. Peer network: %v, node network: %v", other.Network, info.Network)
+       }
+
+       if info.NetworkID != other.NetworkID {
+               return fmt.Errorf("Network id dismatch. Peer network id: %v, node network id: %v", other.NetworkID, info.NetworkID)
+       }
+
        compatible, err := version.CompatibleWith(other.Version)
        if err != nil {
                return err
@@ -53,9 +64,6 @@ func (info *NodeInfo) CompatibleWith(other *NodeInfo) error {
                return fmt.Errorf("Peer is on a different major version. 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
 }