|
|
- package types
-
- import (
- "fmt"
- acm "github.com/tendermint/tendermint/account"
- "strings"
- )
-
- type NodeInfo struct {
- PubKey acm.PubKeyEd25519 `json:"pub_key"`
- Moniker string `json:"moniker"`
- ChainID string `json:"chain_id"`
- Host string `json:"host"`
- P2PPort uint16 `json:"p2p_port"`
- RPCPort uint16 `json:"rpc_port"`
-
- Version Versions `json:"versions"`
- }
-
- type Versions struct {
- Revision string `json:"revision"`
- Tendermint string `json:"tendermint"`
- P2P string `json:"p2p"`
- RPC string `json:"rpc"`
- Wire string `json:"wire"`
- }
-
- // CONTRACT: two nodes with the same Tendermint major and minor version and with the same ChainID are compatible
- func (ni *NodeInfo) CompatibleWith(no *NodeInfo) error {
- iM, im, _, ie := splitVersion(ni.Version.Tendermint)
- oM, om, _, oe := splitVersion(no.Version.Tendermint)
-
- // if our own version number is not formatted right, we messed up
- if ie != nil {
- return ie
- }
-
- // version number must be formatted correctly ("x.x.x")
- if oe != nil {
- return oe
- }
-
- // major version must match
- if iM != oM {
- return fmt.Errorf("Peer is on a different major version. Got %v, expected %v", oM, iM)
- }
-
- // minor version must match
- if im != om {
- return fmt.Errorf("Peer is on a different minor version. Got %v, expected %v", om, im)
- }
-
- // nodes must be on the same chain_id
- if ni.ChainID != no.ChainID {
- return fmt.Errorf("Peer is on a different chain_id. Got %v, expected %v", no.ChainID, ni.ChainID)
- }
-
- return nil
- }
-
- func splitVersion(version string) (string, string, string, error) {
- spl := strings.Split(version, ".")
- if len(spl) != 3 {
- return "", "", "", fmt.Errorf("Invalid version format %v", version)
- }
- return spl[0], spl[1], spl[2], nil
- }
|