private void GetNodeStatus(BlockchainNode node)
        {
            BlockchainNodeConfig config = BlockchainConfig.GetNodeConfig(node.NodeConfig.NodeConfigFullName);
            int apiPort = config.GetApiPort();

            NodeStatus nodeStatus = BufferedRequestCaller.GetApiResult <NodeStatus>(RequestType.ApiNodeStatus, node.NodeEndpoint.FullNodeName, apiPort);

            if (nodeStatus == null)
            {
                node.NodeState.NodeOperationState.State = ProcessState.Stopped;
                return;
            }

            node.NodeState.NodeOperationState.State = ProcessState.Running;

            node.NodeState.NodeOperationState.AgentName       = nodeStatus.Agent;
            node.NodeState.NodeOperationState.Version         = nodeStatus.Version;
            node.NodeState.NodeOperationState.Network         = nodeStatus.Network;
            node.NodeState.NodeOperationState.ConsensusHeight = nodeStatus.ConsensusHeight;

            node.NodeState.NodeOperationState.Peers.Clear();
            foreach (Peer inboundPeer in nodeStatus.InboundPeers)
            {
                ConnectionPeer peer = new ConnectionPeer();
                peer.PeerType             = PeerType.Inbound;
                peer.RemoteSocketEndpoint = inboundPeer.RemoteSocketEndpoint;
                peer.TipHeight            = inboundPeer.TipHeight;
                peer.Version = inboundPeer.Version;
                node.NodeState.NodeOperationState.Peers.Add(peer);
            }
            foreach (Peer outboundPeer in nodeStatus.OutboundPeers)
            {
                ConnectionPeer peer = new ConnectionPeer();
                peer.PeerType             = PeerType.Inbound;
                peer.RemoteSocketEndpoint = outboundPeer.RemoteSocketEndpoint;
                peer.TipHeight            = outboundPeer.TipHeight;
                peer.Version = outboundPeer.Version;
                node.NodeState.NodeOperationState.Peers.Add(peer);
            }

            node.NodeState.NodeOperationState.DataDirectory = nodeStatus.DataDirectoryPath;
            node.NodeState.NodeOperationState.Uptime        = nodeStatus.RunningTime;

            int maxInboundTipHeight  = nodeStatus.InboundPeers.Any() ? nodeStatus.InboundPeers.Max(p => p.TipHeight) : 0;
            int maxOutboundTipHeight = nodeStatus.OutboundPeers.Any() ? nodeStatus.OutboundPeers.Max(p => p.TipHeight) : 0;

            node.NodeState.NodeOperationState.NetworkHeight = Math.Max(maxInboundTipHeight, maxOutboundTipHeight);
        }
        public void MergeDataRows(List <ConnectionPeer> peers)
        {
            //Remove old peers
            List <DataRow> rowsToDelete = new List <DataRow>();

            foreach (DataRow row in DataTable.Rows)
            {
                ConnectionPeer node = (ConnectionPeer)row["Address"];

                if (peers.All(p => p.RemoteSocketEndpoint != node.RemoteSocketEndpoint))
                {
                    rowsToDelete.Add(row);
                }
            }
            foreach (DataRow row in rowsToDelete)
            {
                DataTable.Rows.Remove(row);
            }

            //Add and update nodes
            foreach (ConnectionPeer connectionPeer in peers)
            {
                var matchingNodes = from DataRow r in DataTable.Rows
                                    let nodeInDataTable = (ConnectionPeer)r["Address"]
                                                          where nodeInDataTable.RemoteSocketEndpoint == connectionPeer.RemoteSocketEndpoint
                                                          select r;

                if (!matchingNodes.Any())
                {
                    object[] rowData = new object[2];

                    CreateColumnIfNotExist("Type", "Type", typeof(String), 16);
                    rowData[DataTable.Columns.IndexOf("Type")] = connectionPeer.PeerType;

                    CreateColumnIfNotExist("Address", "Address", typeof(ConnectionPeer), 130);
                    rowData[DataTable.Columns.IndexOf("Address")] = connectionPeer;
                    DataTable.Rows.Add(rowData);
                }
            }
        }