Exemplo n.º 1
0
        /// <summary>
        /// Retrieve all node information and store it in IDistributedCache object
        /// </summary>
        private async Task BuildCacheAsync()
        {
            this.logger.LogInformation($"Refresh the Dashboard Data");

            await nodeDataServiceMainchain.Update();

            await nodeDataServiceSidechain.Update();

            var stratisPeers               = new List <Peer>();
            var stratisFederationMembers   = new List <Peer>();
            var sidechainPeers             = new List <Peer>();
            var sidechainFederationMembers = new List <Peer>();

            try
            {
                if (this.is50K)
                {
                    this.ParsePeers(nodeDataServiceMainchain, stratisPeers, stratisFederationMembers);
                    this.ParsePeers(nodeDataServiceSidechain, sidechainPeers, sidechainFederationMembers);
                }
                else
                {
                    this.ParsePeers(nodeDataServiceMainchain, stratisPeers);
                    this.ParsePeers(nodeDataServiceSidechain, sidechainPeers);
                }
            }
            catch (Exception e)
            {
                this.logger.LogError(e, "Unable to parse feeds");
            }

            var dashboardModel = new DashboardModel();

            try
            {
                dashboardModel.Status                 = true;
                dashboardModel.IsCacheBuilt           = true;
                dashboardModel.MainchainWalletAddress = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).FedAddress : string.Empty;
                dashboardModel.SidechainWalletAddress = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).FedAddress : string.Empty;
                dashboardModel.MiningPublicKeys       = nodeDataServiceMainchain.FedInfoResponse?.Content?.federationMultisigPubKeys ?? new JArray();

                var stratisNode = new StratisNodeModel();

                stratisNode.History               = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).WalletHistory : new JArray();
                stratisNode.ConfirmedBalanceFed   = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).FedWalletBalance.confirmedBalance : -1;
                stratisNode.UnconfirmedBalanceFed = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).FedWalletBalance.unconfirmedBalance : -1;

                stratisNode.WebAPIUrl         = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/api").ToString();
                stratisNode.SwaggerUrl        = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/swagger").ToString();
                stratisNode.SyncingStatus     = nodeDataServiceMainchain.NodeStatus.SyncingProgress;
                stratisNode.Peers             = stratisPeers;
                stratisNode.FederationMembers = stratisFederationMembers;
                stratisNode.BlockHash         = nodeDataServiceMainchain.BestHash;
                stratisNode.BlockHeight       = (int)nodeDataServiceMainchain.NodeStatus.BlockStoreHeight;
                stratisNode.MempoolSize       = nodeDataServiceMainchain.RawMempool;

                stratisNode.CoinTicker     = "STRAT";
                stratisNode.LogRules       = nodeDataServiceMainchain.LogRules;
                stratisNode.Uptime         = nodeDataServiceMainchain.NodeStatus.Uptime;
                stratisNode.IsMining       = this.nodeDataServiceMainchain.NodeDashboardStats?.IsMining ?? false;
                stratisNode.AddressIndexer = this.nodeDataServiceMainchain.NodeDashboardStats?.AddressIndexerHeight ?? 0;
                stratisNode.HeaderHeight   = this.nodeDataServiceMainchain.NodeDashboardStats?.HeaderHeight ?? 0;
                stratisNode.AsyncLoops     = this.nodeDataServiceMainchain.NodeDashboardStats?.AsyncLoops ?? string.Empty;
                stratisNode.OrphanSize     = this.nodeDataServiceMainchain.NodeDashboardStats?.OrphanSize ?? string.Empty;

                dashboardModel.StratisNode = stratisNode;

                var sidechainNode = new SidechainNodeModel();

                sidechainNode.History               = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).WalletHistory : new JArray();
                sidechainNode.ConfirmedBalanceFed   = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).FedWalletBalance.confirmedBalance : -1;
                sidechainNode.UnconfirmedBalanceFed = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).FedWalletBalance.unconfirmedBalance : -1;

                sidechainNode.WebAPIUrl         = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/api").ToString();
                sidechainNode.SwaggerUrl        = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/swagger").ToString();
                sidechainNode.SyncingStatus     = nodeDataServiceSidechain.NodeStatus.SyncingProgress;
                sidechainNode.Peers             = sidechainPeers;
                sidechainNode.FederationMembers = sidechainFederationMembers;
                sidechainNode.BlockHash         = nodeDataServiceSidechain.BestHash;
                sidechainNode.BlockHeight       = (int)nodeDataServiceSidechain.NodeStatus.BlockStoreHeight;
                sidechainNode.MempoolSize       = nodeDataServiceSidechain.RawMempool;

                sidechainNode.CoinTicker        = "CRS";
                sidechainNode.LogRules          = nodeDataServiceSidechain.LogRules;
                sidechainNode.PoAPendingPolls   = nodeDataServiceSidechain.PendingPolls;
                sidechainNode.Uptime            = nodeDataServiceSidechain.NodeStatus.Uptime;
                sidechainNode.IsMining          = this.nodeDataServiceSidechain.NodeDashboardStats?.IsMining ?? false;
                sidechainNode.AddressIndexer    = this.nodeDataServiceSidechain.NodeDashboardStats?.AddressIndexerHeight ?? 0;
                sidechainNode.HeaderHeight      = this.nodeDataServiceSidechain.NodeDashboardStats?.HeaderHeight ?? 0;
                sidechainNode.AsyncLoops        = this.nodeDataServiceSidechain.NodeDashboardStats?.AsyncLoops ?? string.Empty;
                sidechainNode.OrphanSize        = this.nodeDataServiceSidechain.NodeDashboardStats?.OrphanSize ?? string.Empty;
                sidechainNode.FedMemberCount    = this.nodeDataServiceSidechain.FedMemberCount;
                sidechainNode.BlockProducerHits =
                    this.nodeDataServiceSidechain.NodeDashboardStats?.BlockProducerHits ?? string.Empty;
                sidechainNode.BlockProducerHitsValue = this.nodeDataServiceSidechain.NodeDashboardStats?.BlockProducerHitsValue ?? 0;
                sidechainNode.ConfirmedBalance       = this.nodeDataServiceSidechain.WalletBalance.confirmedBalance;
                sidechainNode.UnconfirmedBalance     = this.nodeDataServiceSidechain.WalletBalance.unconfirmedBalance;
                dashboardModel.SidechainNode         = sidechainNode;
            }
            catch (Exception e)
            {
                this.logger.LogError(e, "Unable to fetch feeds.");
                return;
            }

            if (!string.IsNullOrEmpty(this.distributedCache.GetString("DashboardData")))
            {
                if (JToken.DeepEquals(this.distributedCache.GetString("DashboardData"), JsonConvert.SerializeObject(dashboardModel)) == false)
                {
                    await this.updaterHub.Clients.All.SendAsync("CacheIsDifferent");
                }
            }
            this.distributedCache.SetString("DashboardData", JsonConvert.SerializeObject(dashboardModel));
        }
        /// <summary>
        /// Retrieve all node information and store it in IDistributedCache object
        /// </summary>
        private async Task BuildCacheAsync(bool mainChainUp, bool sideChainUp)
        {
            this.logger.LogInformation($"Refresh the Dashboard Data");

            // Clear the cached dashboard data.
            await this.distributedCache.RemoveAsync("DashboardData").ConfigureAwait(false);

            var dashboardModel = new DashboardModel
            {
                Status           = true,
                MiningPublicKeys = nodeDataServiceMainchain.FedInfoResponse?.Content?.federationMultisigPubKeys ?? new JArray()
            };

            var stratisPeers               = new List <Peer>();
            var stratisFederationMembers   = new List <Peer>();
            var sidechainPeers             = new List <Peer>();
            var sidechainFederationMembers = new List <Peer>();

            if (mainChainUp)
            {
                await nodeDataServiceMainchain.Update().ConfigureAwait(false);

                try
                {
                    if (this.multiSigNode)
                    {
                        this.ParsePeers(nodeDataServiceMainchain, stratisPeers, stratisFederationMembers);
                    }
                    else
                    {
                        this.ParsePeers(nodeDataServiceMainchain, stratisPeers);
                    }
                }
                catch (Exception e)
                {
                    this.logger.LogError(e, "Unable to parse peer data for the mainchain.");
                }

                try
                {
                    var mainchainNode = new StratisNodeModel
                    {
                        History               = this.multiSigNode ? ((MultiSigService)nodeDataServiceMainchain).WalletHistory : new JArray(),
                        ConfirmedBalanceFed   = this.multiSigNode ? ((MultiSigService)nodeDataServiceMainchain).FedWalletBalance.confirmedBalance : -1,
                        UnconfirmedBalanceFed = this.multiSigNode ? ((MultiSigService)nodeDataServiceMainchain).FedWalletBalance.unconfirmedBalance : -1,

                        WebAPIUrl         = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/api").ToString(),
                        SwaggerUrl        = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/swagger").ToString(),
                        SyncingStatus     = nodeDataServiceMainchain.NodeStatus.SyncingProgress,
                        Peers             = stratisPeers,
                        FederationMembers = stratisFederationMembers,
                        BlockHash         = nodeDataServiceMainchain.BestHash,
                        BlockHeight       = (int)nodeDataServiceMainchain.NodeStatus.BlockStoreHeight,
                        HeaderHeight      = (int)nodeDataServiceMainchain.NodeStatus.HeaderHeight,
                        MempoolSize       = nodeDataServiceMainchain.RawMempool,

                        LogRules       = nodeDataServiceMainchain.LogRules,
                        Uptime         = nodeDataServiceMainchain.NodeStatus.Uptime,
                        AddressIndexer = this.nodeDataServiceMainchain.AddressIndexerHeight,
                        OrphanSize     = this.nodeDataServiceMainchain.NodeDashboardStats?.OrphanSize ?? string.Empty,

                        AgentVersion = this.nodeDataServiceMainchain.NodeStatus.Version
                    };

                    dashboardModel.MainchainNode = mainchainNode;

                    this.successfullyBuilt = true;
                }
                catch (Exception ex)
                {
                    this.logger.LogError(ex, "Unable to refresh the mainchain feed.");
                }
            }

            if (sideChainUp)
            {
                await nodeDataServiceSidechain.Update().ConfigureAwait(false);

                try
                {
                    if (this.multiSigNode)
                    {
                        this.ParsePeers(nodeDataServiceSidechain, sidechainPeers, sidechainFederationMembers);
                    }
                    else
                    {
                        this.ParsePeers(nodeDataServiceSidechain, sidechainPeers);
                    }
                }
                catch (Exception e)
                {
                    this.logger.LogError(e, "Unable to parse peer data for the sidechain.");
                }

                try
                {
                    // Sidechain Node
                    var sidechainNode = new SidechainNodeModel
                    {
                        History               = this.multiSigNode ? ((MultiSigSideChainService)nodeDataServiceSidechain).WalletHistory : new JArray(),
                        ConfirmedBalanceFed   = this.multiSigNode ? ((MultiSigSideChainService)nodeDataServiceSidechain).FedWalletBalance.confirmedBalance : -1,
                        UnconfirmedBalanceFed = this.multiSigNode ? ((MultiSigSideChainService)nodeDataServiceSidechain).FedWalletBalance.unconfirmedBalance : -1,

                        WebAPIUrl         = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/api").ToString(),
                        SwaggerUrl        = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/swagger").ToString(),
                        SyncingStatus     = nodeDataServiceSidechain.NodeStatus.SyncingProgress,
                        Peers             = sidechainPeers,
                        FederationMembers = sidechainFederationMembers,
                        BlockHash         = nodeDataServiceSidechain.BestHash,
                        BlockHeight       = (int)nodeDataServiceSidechain.NodeStatus.BlockStoreHeight,
                        HeaderHeight      = (int)nodeDataServiceSidechain.NodeStatus.HeaderHeight,
                        MempoolSize       = nodeDataServiceSidechain.RawMempool,
                        AgentVersion      = nodeDataServiceSidechain.NodeStatus.Version,

                        LogRules        = nodeDataServiceSidechain.LogRules,
                        PoAPendingPolls = nodeDataServiceSidechain.PendingPolls,
                        Uptime          = nodeDataServiceSidechain.NodeStatus.Uptime,

                        BlockProducerHits      = this.nodeDataServiceSidechain.SidechainMinerStats.BlockProducerHits,
                        BlockProducerHitsValue = this.nodeDataServiceSidechain.SidechainMinerStats.BlockProducerHitsValue,
                        IsMining = this.nodeDataServiceSidechain.SidechainMinerStats.ProducedBlockInLastRound,
                        SidechainMiningAddress = this.nodeDataServiceSidechain.SidechainMinerStats.MiningAddress,

                        OrphanSize                = this.nodeDataServiceSidechain.NodeDashboardStats?.OrphanSize ?? string.Empty,
                        FederationMemberCount     = this.nodeDataServiceSidechain.FederationMemberCount,
                        ConfirmedBalance          = this.nodeDataServiceSidechain.WalletBalance.confirmedBalance,
                        UnconfirmedBalance        = this.nodeDataServiceSidechain.WalletBalance.unconfirmedBalance,
                        KickFederationMemberPolls = nodeDataServiceSidechain.KickFederationMememberPendingPolls
                    };

                    dashboardModel.SidechainNode = sidechainNode;

                    this.successfullyBuilt = true;
                }
                catch (Exception ex)
                {
                    this.logger.LogError(ex, "Unable to refresh the sidechain feed.");
                }
            }

            this.logger.LogInformation("Feeds updated...");

            await this.updaterHub.Clients.All.SendAsync("RefreshDashboard").ConfigureAwait(false);

            this.distributedCache.SetString("DashboardData", JsonConvert.SerializeObject(dashboardModel));
        }