Ejemplo n.º 1
0
        private async Task MonitorJoinFederationRequestAsync()
        {
            // Check wallet height (sync) status.
            do
            {
                FederationMemberDetailedModel memberInfo = await $"http://localhost:{this.sidechainNetwork.DefaultAPIPort}/api".AppendPathSegment("federation/members/current").GetJsonAsync <FederationMemberDetailedModel>();
                StatusModel blockModel = await $"http://localhost:{this.sidechainNetwork.DefaultAPIPort}/api".AppendPathSegment("node/status").GetJsonAsync <StatusModel>();

                Console.Clear();
                Console.WriteLine($">> Registration Progress");
                Console.WriteLine($"PubKey".PadRight(30) + $": {memberInfo.PubKey}");
                Console.WriteLine($"Current Height".PadRight(30) + $": {blockModel.ConsensusHeight}");
                Console.WriteLine($"Mining will start at height".PadRight(30) + $": {memberInfo.MemberWillStartMiningAtBlockHeight}");
                Console.WriteLine($"Rewards will start at height".PadRight(30) + $": {memberInfo.MemberWillStartEarningRewardsEstimateHeight}");
                Console.WriteLine();
                Console.WriteLine($"Press CRTL-C to exit...");
                await Task.Delay(TimeSpan.FromSeconds(5));
            } while (true);
        }
        public IActionResult GetCurrentMemberInfo()
        {
            try
            {
                if (this.federationManager.CurrentFederationKey == null)
                {
                    throw new Exception("Your node is not registered as a federation member.");
                }

                var federationMemberModel = new FederationMemberDetailedModel
                {
                    PubKey = this.federationManager.CurrentFederationKey.PubKey.ToHex()
                };

                ChainedHeader chainTip = this.chainIndexer.Tip;
                federationMemberModel.FederationSize = this.federationHistory.GetFederationForBlock(chainTip).Count;

                KeyValuePair <IFederationMember, uint> lastActive = this.federationHistory.GetFederationMembersByLastActiveTime().FirstOrDefault(x => x.Key.PubKey == this.federationManager.CurrentFederationKey.PubKey);
                if (lastActive.Key != null)
                {
                    federationMemberModel.LastActiveTime     = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(lastActive.Value);
                    federationMemberModel.PeriodOfInActivity = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(lastActive.Value);
                }

                // Is this member part of a pending poll
                Poll poll = this.votingManager.GetPendingPolls().MemberPolls().OrderByDescending(p => p.PollStartBlockData.Height).FirstOrDefault(p => this.votingManager.GetMemberVotedOn(p.VotingData).PubKey == this.federationManager.CurrentFederationKey.PubKey);
                if (poll != null)
                {
                    federationMemberModel.PollType                  = poll.VotingData.Key.ToString();
                    federationMemberModel.PollStartBlockHeight      = poll.PollStartBlockData.Height;
                    federationMemberModel.PollNumberOfVotesAcquired = poll.PubKeysHexVotedInFavor.Count;
                }

                // Has the poll finished?
                poll = this.votingManager.GetApprovedPolls().MemberPolls().OrderByDescending(p => p.PollVotedInFavorBlockData.Height).FirstOrDefault(p => this.votingManager.GetMemberVotedOn(p.VotingData).PubKey == this.federationManager.CurrentFederationKey.PubKey);
                if (poll != null)
                {
                    federationMemberModel.PollType                                    = poll.VotingData.Key.ToString();
                    federationMemberModel.PollStartBlockHeight                        = poll.PollStartBlockData.Height;
                    federationMemberModel.PollNumberOfVotesAcquired                   = poll.PubKeysHexVotedInFavor.Count;
                    federationMemberModel.PollFinishedBlockHeight                     = poll.PollVotedInFavorBlockData.Height;
                    federationMemberModel.MemberWillStartMiningAtBlockHeight          = poll.PollVotedInFavorBlockData.Height + this.network.Consensus.MaxReorgLength;
                    federationMemberModel.MemberWillStartEarningRewardsEstimateHeight = federationMemberModel.MemberWillStartMiningAtBlockHeight + 480;

                    if (chainTip.Height > poll.PollVotedInFavorBlockData.Height + this.network.Consensus.MaxReorgLength)
                    {
                        federationMemberModel.PollWillFinishInBlocks = 0;
                    }
                    else
                    {
                        federationMemberModel.PollWillFinishInBlocks = (poll.PollVotedInFavorBlockData.Height + this.network.Consensus.MaxReorgLength) - chainTip.Height;
                    }

                    // Has the poll executed?
                    federationMemberModel.PollExecutedBlockHeight = poll.PollExecutedBlockData?.Height;
                }

                federationMemberModel.RewardEstimatePerBlock = 9d / this.federationManager.GetFederationMembers().Count;

                federationMemberModel.MiningStatistics = this.poaMiner.MiningStatistics;

                return(Json(federationMemberModel));
            }
            catch (Exception e)
            {
                this.logger.LogError("Exception occurred: {0}", e.ToString());
                return(ErrorHelpers.BuildErrorResponse(HttpStatusCode.BadRequest, e.Message, e.ToString()));
            }
        }